From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- gcc/testsuite/g++.dg/init/addr-const1.C | 38 ++++++ gcc/testsuite/g++.dg/init/aggr1.C | 19 +++ gcc/testsuite/g++.dg/init/aggr2.C | 46 ++++++++ gcc/testsuite/g++.dg/init/aggr3.C | 16 +++ gcc/testsuite/g++.dg/init/aggr4.C | 7 ++ gcc/testsuite/g++.dg/init/aggr5.C | 11 ++ gcc/testsuite/g++.dg/init/aggr6.C | 11 ++ gcc/testsuite/g++.dg/init/array0.C | 12 ++ gcc/testsuite/g++.dg/init/array1.C | 26 ++++ gcc/testsuite/g++.dg/init/array10.C | 6 + gcc/testsuite/g++.dg/init/array11.C | 28 +++++ gcc/testsuite/g++.dg/init/array12.C | 28 +++++ gcc/testsuite/g++.dg/init/array13.C | 9 ++ gcc/testsuite/g++.dg/init/array14.C | 21 ++++ gcc/testsuite/g++.dg/init/array15.C | 46 ++++++++ gcc/testsuite/g++.dg/init/array16.C | 112 ++++++++++++++++++ gcc/testsuite/g++.dg/init/array17.C | 8 ++ gcc/testsuite/g++.dg/init/array18.C | 22 ++++ gcc/testsuite/g++.dg/init/array19.C | 4 + gcc/testsuite/g++.dg/init/array2.C | 8 ++ gcc/testsuite/g++.dg/init/array20.C | 5 + gcc/testsuite/g++.dg/init/array21.C | 7 ++ gcc/testsuite/g++.dg/init/array22.C | 6 + gcc/testsuite/g++.dg/init/array23.C | 6 + gcc/testsuite/g++.dg/init/array24.C | 7 ++ gcc/testsuite/g++.dg/init/array25.C | 49 ++++++++ gcc/testsuite/g++.dg/init/array26.C | 11 ++ gcc/testsuite/g++.dg/init/array27.C | 11 ++ gcc/testsuite/g++.dg/init/array28.C | 7 ++ gcc/testsuite/g++.dg/init/array3.C | 23 ++++ gcc/testsuite/g++.dg/init/array33.C | 22 ++++ gcc/testsuite/g++.dg/init/array4.C | 27 +++++ gcc/testsuite/g++.dg/init/array5.C | 52 ++++++++ gcc/testsuite/g++.dg/init/array6.C | 7 ++ gcc/testsuite/g++.dg/init/array7.C | 15 +++ gcc/testsuite/g++.dg/init/array8.C | 12 ++ gcc/testsuite/g++.dg/init/array9.C | 9 ++ gcc/testsuite/g++.dg/init/assign1.C | 30 +++++ gcc/testsuite/g++.dg/init/attrib1.C | 10 ++ gcc/testsuite/g++.dg/init/bitfield1.C | 24 ++++ gcc/testsuite/g++.dg/init/bitfield2.C | 33 ++++++ gcc/testsuite/g++.dg/init/brace1.C | 4 + gcc/testsuite/g++.dg/init/brace2.C | 8 ++ gcc/testsuite/g++.dg/init/brace3.C | 1 + gcc/testsuite/g++.dg/init/brace4.C | 5 + gcc/testsuite/g++.dg/init/brace5.C | 7 ++ gcc/testsuite/g++.dg/init/brace6.C | 25 ++++ gcc/testsuite/g++.dg/init/byval1.C | 31 +++++ gcc/testsuite/g++.dg/init/call1.C | 35 ++++++ gcc/testsuite/g++.dg/init/cleanup1.C | 16 +++ gcc/testsuite/g++.dg/init/cleanup2.C | 19 +++ gcc/testsuite/g++.dg/init/cleanup3.C | 22 ++++ gcc/testsuite/g++.dg/init/complex1.C | 7 ++ gcc/testsuite/g++.dg/init/const1.C | 8 ++ gcc/testsuite/g++.dg/init/const2.C | 7 ++ gcc/testsuite/g++.dg/init/const3.C | 12 ++ gcc/testsuite/g++.dg/init/const4.C | 8 ++ gcc/testsuite/g++.dg/init/const5.C | 11 ++ gcc/testsuite/g++.dg/init/const6.C | 27 +++++ gcc/testsuite/g++.dg/init/const7.C | 13 ++ gcc/testsuite/g++.dg/init/const8.C | 11 ++ gcc/testsuite/g++.dg/init/copy1.C | 21 ++++ gcc/testsuite/g++.dg/init/copy2.C | 5 + gcc/testsuite/g++.dg/init/copy3.C | 16 +++ gcc/testsuite/g++.dg/init/copy4.C | 19 +++ gcc/testsuite/g++.dg/init/copy5.C | 29 +++++ gcc/testsuite/g++.dg/init/copy6.C | 13 ++ gcc/testsuite/g++.dg/init/copy7.C | 39 ++++++ gcc/testsuite/g++.dg/init/ctor1.C | 57 +++++++++ gcc/testsuite/g++.dg/init/ctor2.C | 34 ++++++ gcc/testsuite/g++.dg/init/ctor3.C | 6 + gcc/testsuite/g++.dg/init/ctor4.C | 20 ++++ gcc/testsuite/g++.dg/init/ctor5.C | 17 +++ gcc/testsuite/g++.dg/init/ctor6.C | 20 ++++ gcc/testsuite/g++.dg/init/ctor7.C | 51 ++++++++ gcc/testsuite/g++.dg/init/ctor8.C | 9 ++ gcc/testsuite/g++.dg/init/ctor9.C | 8 ++ gcc/testsuite/g++.dg/init/delete1.C | 7 ++ gcc/testsuite/g++.dg/init/delete2.C | 55 +++++++++ gcc/testsuite/g++.dg/init/dso_handle1.C | 11 ++ gcc/testsuite/g++.dg/init/dtor1.C | 43 +++++++ gcc/testsuite/g++.dg/init/dtor2.C | 28 +++++ gcc/testsuite/g++.dg/init/dtor3.C | 21 ++++ gcc/testsuite/g++.dg/init/elide1.C | 38 ++++++ gcc/testsuite/g++.dg/init/elide2.C | 30 +++++ gcc/testsuite/g++.dg/init/empty1.C | 30 +++++ gcc/testsuite/g++.dg/init/enum1.C | 18 +++ gcc/testsuite/g++.dg/init/enum2.C | 9 ++ gcc/testsuite/g++.dg/init/error1.C | 7 ++ gcc/testsuite/g++.dg/init/error2.C | 15 +++ gcc/testsuite/g++.dg/init/float1.C | 19 +++ gcc/testsuite/g++.dg/init/for1.C | 28 +++++ gcc/testsuite/g++.dg/init/for2.C | 13 ++ gcc/testsuite/g++.dg/init/for3.C | 9 ++ gcc/testsuite/g++.dg/init/global1.C | 16 +++ gcc/testsuite/g++.dg/init/goto1.C | 23 ++++ gcc/testsuite/g++.dg/init/goto2.C | 11 ++ gcc/testsuite/g++.dg/init/init-ref1.C | 45 +++++++ gcc/testsuite/g++.dg/init/init-ref2.C | 42 +++++++ gcc/testsuite/g++.dg/init/init-ref3.C | 47 ++++++++ gcc/testsuite/g++.dg/init/init-ref4.C | 21 ++++ gcc/testsuite/g++.dg/init/inline1.C | 14 +++ gcc/testsuite/g++.dg/init/member1.C | 21 ++++ gcc/testsuite/g++.dg/init/new1.C | 19 +++ gcc/testsuite/g++.dg/init/new10.C | 8 ++ gcc/testsuite/g++.dg/init/new11.C | 21 ++++ gcc/testsuite/g++.dg/init/new12.C | 6 + gcc/testsuite/g++.dg/init/new13.C | 11 ++ gcc/testsuite/g++.dg/init/new14.C | 11 ++ gcc/testsuite/g++.dg/init/new15.C | 19 +++ gcc/testsuite/g++.dg/init/new16.C | 38 ++++++ gcc/testsuite/g++.dg/init/new17.C | 37 ++++++ gcc/testsuite/g++.dg/init/new18.C | 45 +++++++ gcc/testsuite/g++.dg/init/new19.C | 73 ++++++++++++ gcc/testsuite/g++.dg/init/new2.C | 17 +++ gcc/testsuite/g++.dg/init/new20.C | 6 + gcc/testsuite/g++.dg/init/new21.C | 10 ++ gcc/testsuite/g++.dg/init/new22.C | 3 + gcc/testsuite/g++.dg/init/new23.C | 20 ++++ gcc/testsuite/g++.dg/init/new24.C | 18 +++ gcc/testsuite/g++.dg/init/new25.C | 29 +++++ gcc/testsuite/g++.dg/init/new26.C | 44 +++++++ gcc/testsuite/g++.dg/init/new27.C | 40 +++++++ gcc/testsuite/g++.dg/init/new28.C | 27 +++++ gcc/testsuite/g++.dg/init/new29.C | 33 ++++++ gcc/testsuite/g++.dg/init/new3.C | 8 ++ gcc/testsuite/g++.dg/init/new30.C | 15 +++ gcc/testsuite/g++.dg/init/new32.C | 16 +++ gcc/testsuite/g++.dg/init/new4.C | 1 + gcc/testsuite/g++.dg/init/new5.C | 18 +++ gcc/testsuite/g++.dg/init/new6.C | 8 ++ gcc/testsuite/g++.dg/init/new7.C | 7 ++ gcc/testsuite/g++.dg/init/new8.C | 17 +++ gcc/testsuite/g++.dg/init/new9.C | 22 ++++ gcc/testsuite/g++.dg/init/null1.C | 6 + gcc/testsuite/g++.dg/init/placement1.C | 10 ++ gcc/testsuite/g++.dg/init/placement2.C | 22 ++++ gcc/testsuite/g++.dg/init/placement3.C | 30 +++++ gcc/testsuite/g++.dg/init/placement4.C | 32 +++++ gcc/testsuite/g++.dg/init/placement5.C | 32 +++++ gcc/testsuite/g++.dg/init/pm1.C | 88 ++++++++++++++ gcc/testsuite/g++.dg/init/pm2.C | 7 ++ gcc/testsuite/g++.dg/init/pm3.C | 10 ++ gcc/testsuite/g++.dg/init/pmf1.C | 17 +++ gcc/testsuite/g++.dg/init/pr25811-2.C | 26 ++++ gcc/testsuite/g++.dg/init/pr25811-3.C | 38 ++++++ gcc/testsuite/g++.dg/init/pr25811-4.C | 38 ++++++ gcc/testsuite/g++.dg/init/pr25811.C | 195 ++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/init/pr29043.C | 52 ++++++++ gcc/testsuite/g++.dg/init/pr29571.C | 8 ++ gcc/testsuite/g++.dg/init/pr42556.C | 10 ++ gcc/testsuite/g++.dg/init/pr42844.C | 56 +++++++++ gcc/testsuite/g++.dg/init/pr43719.C | 197 +++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/init/pr43890.C | 39 ++++++ gcc/testsuite/g++.dg/init/pr44086.C | 15 +++ gcc/testsuite/g++.dg/init/pr48859.C | 14 +++ gcc/testsuite/g++.dg/init/ptrfn1.C | 12 ++ gcc/testsuite/g++.dg/init/ptrfn2.C | 14 +++ gcc/testsuite/g++.dg/init/ptrfn3.C | 14 +++ gcc/testsuite/g++.dg/init/ptrmem1.C | 7 ++ gcc/testsuite/g++.dg/init/ptrmem2.C | 12 ++ gcc/testsuite/g++.dg/init/ptrmem3.C | 8 ++ gcc/testsuite/g++.dg/init/ptrmem4.C | 13 ++ gcc/testsuite/g++.dg/init/ref1.C | 5 + gcc/testsuite/g++.dg/init/ref10.C | 14 +++ gcc/testsuite/g++.dg/init/ref11.C | 13 ++ gcc/testsuite/g++.dg/init/ref12.C | 30 +++++ gcc/testsuite/g++.dg/init/ref13.C | 7 ++ gcc/testsuite/g++.dg/init/ref14.C | 11 ++ gcc/testsuite/g++.dg/init/ref15.C | 34 ++++++ gcc/testsuite/g++.dg/init/ref16.C | 23 ++++ gcc/testsuite/g++.dg/init/ref17.C | 23 ++++ gcc/testsuite/g++.dg/init/ref19.C | 17 +++ gcc/testsuite/g++.dg/init/ref2.C | 10 ++ gcc/testsuite/g++.dg/init/ref20.C | 8 ++ gcc/testsuite/g++.dg/init/ref3.C | 12 ++ gcc/testsuite/g++.dg/init/ref4.C | 18 +++ gcc/testsuite/g++.dg/init/ref5.C | 12 ++ gcc/testsuite/g++.dg/init/ref6.C | 12 ++ gcc/testsuite/g++.dg/init/ref7.C | 9 ++ gcc/testsuite/g++.dg/init/ref8.C | 10 ++ gcc/testsuite/g++.dg/init/ref9.C | 36 ++++++ gcc/testsuite/g++.dg/init/reference1.C | 11 ++ gcc/testsuite/g++.dg/init/reference2.C | 13 ++ gcc/testsuite/g++.dg/init/reference3.C | 13 ++ gcc/testsuite/g++.dg/init/save1.C | 20 ++++ gcc/testsuite/g++.dg/init/self1.C | 19 +++ gcc/testsuite/g++.dg/init/static-init1.C | 5 + gcc/testsuite/g++.dg/init/static-init2.C | 3 + gcc/testsuite/g++.dg/init/static1.C | 4 + gcc/testsuite/g++.dg/init/static2.C | 25 ++++ gcc/testsuite/g++.dg/init/static3.C | 26 ++++ gcc/testsuite/g++.dg/init/string1.C | 8 ++ gcc/testsuite/g++.dg/init/struct1.C | 6 + gcc/testsuite/g++.dg/init/struct2.C | 22 ++++ gcc/testsuite/g++.dg/init/struct3.C | 15 +++ gcc/testsuite/g++.dg/init/switch1.C | 8 ++ gcc/testsuite/g++.dg/init/synth1.C | 17 +++ gcc/testsuite/g++.dg/init/synth2.C | 18 +++ gcc/testsuite/g++.dg/init/synth3.C | 21 ++++ gcc/testsuite/g++.dg/init/synth4.C | 18 +++ gcc/testsuite/g++.dg/init/union1.C | 5 + gcc/testsuite/g++.dg/init/union2.C | 13 ++ gcc/testsuite/g++.dg/init/value1.C | 22 ++++ gcc/testsuite/g++.dg/init/value10.C | 27 +++++ gcc/testsuite/g++.dg/init/value2.C | 23 ++++ gcc/testsuite/g++.dg/init/value3.C | 31 +++++ gcc/testsuite/g++.dg/init/value4.C | 35 ++++++ gcc/testsuite/g++.dg/init/value5.C | 17 +++ gcc/testsuite/g++.dg/init/value6.C | 13 ++ gcc/testsuite/g++.dg/init/value7.C | 17 +++ gcc/testsuite/g++.dg/init/value8.C | 19 +++ gcc/testsuite/g++.dg/init/value9.C | 32 +++++ gcc/testsuite/g++.dg/init/vbase1.C | 39 ++++++ gcc/testsuite/g++.dg/init/vector1.C | 78 ++++++++++++ gcc/testsuite/g++.dg/init/volatile1.C | 16 +++ gcc/testsuite/g++.dg/init/volatile2.C | 13 ++ 217 files changed, 4758 insertions(+) create mode 100644 gcc/testsuite/g++.dg/init/addr-const1.C create mode 100644 gcc/testsuite/g++.dg/init/aggr1.C create mode 100644 gcc/testsuite/g++.dg/init/aggr2.C create mode 100644 gcc/testsuite/g++.dg/init/aggr3.C create mode 100644 gcc/testsuite/g++.dg/init/aggr4.C create mode 100644 gcc/testsuite/g++.dg/init/aggr5.C create mode 100644 gcc/testsuite/g++.dg/init/aggr6.C create mode 100644 gcc/testsuite/g++.dg/init/array0.C create mode 100644 gcc/testsuite/g++.dg/init/array1.C create mode 100644 gcc/testsuite/g++.dg/init/array10.C create mode 100644 gcc/testsuite/g++.dg/init/array11.C create mode 100644 gcc/testsuite/g++.dg/init/array12.C create mode 100644 gcc/testsuite/g++.dg/init/array13.C create mode 100644 gcc/testsuite/g++.dg/init/array14.C create mode 100644 gcc/testsuite/g++.dg/init/array15.C create mode 100644 gcc/testsuite/g++.dg/init/array16.C create mode 100644 gcc/testsuite/g++.dg/init/array17.C create mode 100644 gcc/testsuite/g++.dg/init/array18.C create mode 100644 gcc/testsuite/g++.dg/init/array19.C create mode 100644 gcc/testsuite/g++.dg/init/array2.C create mode 100644 gcc/testsuite/g++.dg/init/array20.C create mode 100644 gcc/testsuite/g++.dg/init/array21.C create mode 100644 gcc/testsuite/g++.dg/init/array22.C create mode 100644 gcc/testsuite/g++.dg/init/array23.C create mode 100644 gcc/testsuite/g++.dg/init/array24.C create mode 100644 gcc/testsuite/g++.dg/init/array25.C create mode 100644 gcc/testsuite/g++.dg/init/array26.C create mode 100644 gcc/testsuite/g++.dg/init/array27.C create mode 100644 gcc/testsuite/g++.dg/init/array28.C create mode 100644 gcc/testsuite/g++.dg/init/array3.C create mode 100644 gcc/testsuite/g++.dg/init/array33.C create mode 100644 gcc/testsuite/g++.dg/init/array4.C create mode 100644 gcc/testsuite/g++.dg/init/array5.C create mode 100644 gcc/testsuite/g++.dg/init/array6.C create mode 100644 gcc/testsuite/g++.dg/init/array7.C create mode 100644 gcc/testsuite/g++.dg/init/array8.C create mode 100644 gcc/testsuite/g++.dg/init/array9.C create mode 100644 gcc/testsuite/g++.dg/init/assign1.C create mode 100644 gcc/testsuite/g++.dg/init/attrib1.C create mode 100644 gcc/testsuite/g++.dg/init/bitfield1.C create mode 100644 gcc/testsuite/g++.dg/init/bitfield2.C create mode 100644 gcc/testsuite/g++.dg/init/brace1.C create mode 100644 gcc/testsuite/g++.dg/init/brace2.C create mode 100644 gcc/testsuite/g++.dg/init/brace3.C create mode 100644 gcc/testsuite/g++.dg/init/brace4.C create mode 100644 gcc/testsuite/g++.dg/init/brace5.C create mode 100644 gcc/testsuite/g++.dg/init/brace6.C create mode 100644 gcc/testsuite/g++.dg/init/byval1.C create mode 100644 gcc/testsuite/g++.dg/init/call1.C create mode 100644 gcc/testsuite/g++.dg/init/cleanup1.C create mode 100644 gcc/testsuite/g++.dg/init/cleanup2.C create mode 100644 gcc/testsuite/g++.dg/init/cleanup3.C create mode 100644 gcc/testsuite/g++.dg/init/complex1.C create mode 100644 gcc/testsuite/g++.dg/init/const1.C create mode 100644 gcc/testsuite/g++.dg/init/const2.C create mode 100644 gcc/testsuite/g++.dg/init/const3.C create mode 100644 gcc/testsuite/g++.dg/init/const4.C create mode 100644 gcc/testsuite/g++.dg/init/const5.C create mode 100644 gcc/testsuite/g++.dg/init/const6.C create mode 100644 gcc/testsuite/g++.dg/init/const7.C create mode 100644 gcc/testsuite/g++.dg/init/const8.C create mode 100644 gcc/testsuite/g++.dg/init/copy1.C create mode 100644 gcc/testsuite/g++.dg/init/copy2.C create mode 100644 gcc/testsuite/g++.dg/init/copy3.C create mode 100644 gcc/testsuite/g++.dg/init/copy4.C create mode 100644 gcc/testsuite/g++.dg/init/copy5.C create mode 100644 gcc/testsuite/g++.dg/init/copy6.C create mode 100644 gcc/testsuite/g++.dg/init/copy7.C create mode 100644 gcc/testsuite/g++.dg/init/ctor1.C create mode 100644 gcc/testsuite/g++.dg/init/ctor2.C create mode 100644 gcc/testsuite/g++.dg/init/ctor3.C create mode 100644 gcc/testsuite/g++.dg/init/ctor4.C create mode 100644 gcc/testsuite/g++.dg/init/ctor5.C create mode 100644 gcc/testsuite/g++.dg/init/ctor6.C create mode 100644 gcc/testsuite/g++.dg/init/ctor7.C create mode 100644 gcc/testsuite/g++.dg/init/ctor8.C create mode 100644 gcc/testsuite/g++.dg/init/ctor9.C create mode 100644 gcc/testsuite/g++.dg/init/delete1.C create mode 100644 gcc/testsuite/g++.dg/init/delete2.C create mode 100644 gcc/testsuite/g++.dg/init/dso_handle1.C create mode 100644 gcc/testsuite/g++.dg/init/dtor1.C create mode 100644 gcc/testsuite/g++.dg/init/dtor2.C create mode 100644 gcc/testsuite/g++.dg/init/dtor3.C create mode 100644 gcc/testsuite/g++.dg/init/elide1.C create mode 100644 gcc/testsuite/g++.dg/init/elide2.C create mode 100644 gcc/testsuite/g++.dg/init/empty1.C create mode 100644 gcc/testsuite/g++.dg/init/enum1.C create mode 100644 gcc/testsuite/g++.dg/init/enum2.C create mode 100644 gcc/testsuite/g++.dg/init/error1.C create mode 100644 gcc/testsuite/g++.dg/init/error2.C create mode 100644 gcc/testsuite/g++.dg/init/float1.C create mode 100644 gcc/testsuite/g++.dg/init/for1.C create mode 100644 gcc/testsuite/g++.dg/init/for2.C create mode 100644 gcc/testsuite/g++.dg/init/for3.C create mode 100644 gcc/testsuite/g++.dg/init/global1.C create mode 100644 gcc/testsuite/g++.dg/init/goto1.C create mode 100644 gcc/testsuite/g++.dg/init/goto2.C create mode 100644 gcc/testsuite/g++.dg/init/init-ref1.C create mode 100644 gcc/testsuite/g++.dg/init/init-ref2.C create mode 100644 gcc/testsuite/g++.dg/init/init-ref3.C create mode 100644 gcc/testsuite/g++.dg/init/init-ref4.C create mode 100644 gcc/testsuite/g++.dg/init/inline1.C create mode 100644 gcc/testsuite/g++.dg/init/member1.C create mode 100644 gcc/testsuite/g++.dg/init/new1.C create mode 100644 gcc/testsuite/g++.dg/init/new10.C create mode 100644 gcc/testsuite/g++.dg/init/new11.C create mode 100644 gcc/testsuite/g++.dg/init/new12.C create mode 100644 gcc/testsuite/g++.dg/init/new13.C create mode 100644 gcc/testsuite/g++.dg/init/new14.C create mode 100644 gcc/testsuite/g++.dg/init/new15.C create mode 100644 gcc/testsuite/g++.dg/init/new16.C create mode 100644 gcc/testsuite/g++.dg/init/new17.C create mode 100644 gcc/testsuite/g++.dg/init/new18.C create mode 100644 gcc/testsuite/g++.dg/init/new19.C create mode 100644 gcc/testsuite/g++.dg/init/new2.C create mode 100644 gcc/testsuite/g++.dg/init/new20.C create mode 100644 gcc/testsuite/g++.dg/init/new21.C create mode 100644 gcc/testsuite/g++.dg/init/new22.C create mode 100644 gcc/testsuite/g++.dg/init/new23.C create mode 100644 gcc/testsuite/g++.dg/init/new24.C create mode 100644 gcc/testsuite/g++.dg/init/new25.C create mode 100644 gcc/testsuite/g++.dg/init/new26.C create mode 100644 gcc/testsuite/g++.dg/init/new27.C create mode 100644 gcc/testsuite/g++.dg/init/new28.C create mode 100644 gcc/testsuite/g++.dg/init/new29.C create mode 100644 gcc/testsuite/g++.dg/init/new3.C create mode 100644 gcc/testsuite/g++.dg/init/new30.C create mode 100644 gcc/testsuite/g++.dg/init/new32.C create mode 100644 gcc/testsuite/g++.dg/init/new4.C create mode 100644 gcc/testsuite/g++.dg/init/new5.C create mode 100644 gcc/testsuite/g++.dg/init/new6.C create mode 100644 gcc/testsuite/g++.dg/init/new7.C create mode 100644 gcc/testsuite/g++.dg/init/new8.C create mode 100644 gcc/testsuite/g++.dg/init/new9.C create mode 100644 gcc/testsuite/g++.dg/init/null1.C create mode 100644 gcc/testsuite/g++.dg/init/placement1.C create mode 100644 gcc/testsuite/g++.dg/init/placement2.C create mode 100644 gcc/testsuite/g++.dg/init/placement3.C create mode 100644 gcc/testsuite/g++.dg/init/placement4.C create mode 100644 gcc/testsuite/g++.dg/init/placement5.C create mode 100644 gcc/testsuite/g++.dg/init/pm1.C create mode 100644 gcc/testsuite/g++.dg/init/pm2.C create mode 100644 gcc/testsuite/g++.dg/init/pm3.C create mode 100644 gcc/testsuite/g++.dg/init/pmf1.C create mode 100644 gcc/testsuite/g++.dg/init/pr25811-2.C create mode 100644 gcc/testsuite/g++.dg/init/pr25811-3.C create mode 100644 gcc/testsuite/g++.dg/init/pr25811-4.C create mode 100644 gcc/testsuite/g++.dg/init/pr25811.C create mode 100644 gcc/testsuite/g++.dg/init/pr29043.C create mode 100644 gcc/testsuite/g++.dg/init/pr29571.C create mode 100644 gcc/testsuite/g++.dg/init/pr42556.C create mode 100644 gcc/testsuite/g++.dg/init/pr42844.C create mode 100644 gcc/testsuite/g++.dg/init/pr43719.C create mode 100644 gcc/testsuite/g++.dg/init/pr43890.C create mode 100644 gcc/testsuite/g++.dg/init/pr44086.C create mode 100644 gcc/testsuite/g++.dg/init/pr48859.C create mode 100644 gcc/testsuite/g++.dg/init/ptrfn1.C create mode 100644 gcc/testsuite/g++.dg/init/ptrfn2.C create mode 100644 gcc/testsuite/g++.dg/init/ptrfn3.C create mode 100644 gcc/testsuite/g++.dg/init/ptrmem1.C create mode 100644 gcc/testsuite/g++.dg/init/ptrmem2.C create mode 100644 gcc/testsuite/g++.dg/init/ptrmem3.C create mode 100644 gcc/testsuite/g++.dg/init/ptrmem4.C create mode 100644 gcc/testsuite/g++.dg/init/ref1.C create mode 100644 gcc/testsuite/g++.dg/init/ref10.C create mode 100644 gcc/testsuite/g++.dg/init/ref11.C create mode 100644 gcc/testsuite/g++.dg/init/ref12.C create mode 100644 gcc/testsuite/g++.dg/init/ref13.C create mode 100644 gcc/testsuite/g++.dg/init/ref14.C create mode 100644 gcc/testsuite/g++.dg/init/ref15.C create mode 100644 gcc/testsuite/g++.dg/init/ref16.C create mode 100644 gcc/testsuite/g++.dg/init/ref17.C create mode 100644 gcc/testsuite/g++.dg/init/ref19.C create mode 100644 gcc/testsuite/g++.dg/init/ref2.C create mode 100644 gcc/testsuite/g++.dg/init/ref20.C create mode 100644 gcc/testsuite/g++.dg/init/ref3.C create mode 100644 gcc/testsuite/g++.dg/init/ref4.C create mode 100644 gcc/testsuite/g++.dg/init/ref5.C create mode 100644 gcc/testsuite/g++.dg/init/ref6.C create mode 100644 gcc/testsuite/g++.dg/init/ref7.C create mode 100644 gcc/testsuite/g++.dg/init/ref8.C create mode 100644 gcc/testsuite/g++.dg/init/ref9.C create mode 100644 gcc/testsuite/g++.dg/init/reference1.C create mode 100644 gcc/testsuite/g++.dg/init/reference2.C create mode 100644 gcc/testsuite/g++.dg/init/reference3.C create mode 100644 gcc/testsuite/g++.dg/init/save1.C create mode 100644 gcc/testsuite/g++.dg/init/self1.C create mode 100644 gcc/testsuite/g++.dg/init/static-init1.C create mode 100644 gcc/testsuite/g++.dg/init/static-init2.C create mode 100644 gcc/testsuite/g++.dg/init/static1.C create mode 100644 gcc/testsuite/g++.dg/init/static2.C create mode 100644 gcc/testsuite/g++.dg/init/static3.C create mode 100644 gcc/testsuite/g++.dg/init/string1.C create mode 100644 gcc/testsuite/g++.dg/init/struct1.C create mode 100644 gcc/testsuite/g++.dg/init/struct2.C create mode 100644 gcc/testsuite/g++.dg/init/struct3.C create mode 100644 gcc/testsuite/g++.dg/init/switch1.C create mode 100644 gcc/testsuite/g++.dg/init/synth1.C create mode 100644 gcc/testsuite/g++.dg/init/synth2.C create mode 100644 gcc/testsuite/g++.dg/init/synth3.C create mode 100644 gcc/testsuite/g++.dg/init/synth4.C create mode 100644 gcc/testsuite/g++.dg/init/union1.C create mode 100644 gcc/testsuite/g++.dg/init/union2.C create mode 100644 gcc/testsuite/g++.dg/init/value1.C create mode 100644 gcc/testsuite/g++.dg/init/value10.C create mode 100644 gcc/testsuite/g++.dg/init/value2.C create mode 100644 gcc/testsuite/g++.dg/init/value3.C create mode 100644 gcc/testsuite/g++.dg/init/value4.C create mode 100644 gcc/testsuite/g++.dg/init/value5.C create mode 100644 gcc/testsuite/g++.dg/init/value6.C create mode 100644 gcc/testsuite/g++.dg/init/value7.C create mode 100644 gcc/testsuite/g++.dg/init/value8.C create mode 100644 gcc/testsuite/g++.dg/init/value9.C create mode 100644 gcc/testsuite/g++.dg/init/vbase1.C create mode 100644 gcc/testsuite/g++.dg/init/vector1.C create mode 100644 gcc/testsuite/g++.dg/init/volatile1.C create mode 100644 gcc/testsuite/g++.dg/init/volatile2.C (limited to 'gcc/testsuite/g++.dg/init') diff --git a/gcc/testsuite/g++.dg/init/addr-const1.C b/gcc/testsuite/g++.dg/init/addr-const1.C new file mode 100644 index 000000000..3b4637a41 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/addr-const1.C @@ -0,0 +1,38 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 19 Apr 2003 + +// PR 9881. address-constant-expression not static initialized + +struct bar { + double p; +}; // bar + +bar v; +static bool error = false; + +struct foo { + static double *a; + static double *b; + static double storage; +}; + +struct baz { + baz () { + if (foo::a != &v.p) + error = true; + if (foo::b != &foo::storage) + error = true; + } +}; + +baz f; // Get constructor to run before any other non-static initializers + +double *foo::a = &(((bar *)(&v))->p); +double *foo::b = &(((bar *)(&foo::storage))->p); +double foo::storage = 0.0; + +int main() { + return error; +} diff --git a/gcc/testsuite/g++.dg/init/aggr1.C b/gcc/testsuite/g++.dg/init/aggr1.C new file mode 100644 index 000000000..c63f0b02c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr1.C @@ -0,0 +1,19 @@ +// Test that initializing an aggregate with complex copy constructor +// and assignment ops doesn't cause cp_expr_size to abort. + +struct A +{ + A(); + A(const A&); + A& operator=(const A&); +}; + +struct B +{ + A a; +}; + +int main () +{ + B b = { A() }; +} diff --git a/gcc/testsuite/g++.dg/init/aggr2.C b/gcc/testsuite/g++.dg/init/aggr2.C new file mode 100644 index 000000000..97dbeb619 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr2.C @@ -0,0 +1,46 @@ +// PR c++/15172 +// { dg-do run } + +extern "C" int printf (const char *, ...); +extern "C" void abort (); + +struct A { + static A* p; + + A() { p = this; } + A(const A&); + ~A() { if (this != p) abort (); } + void print () { } +}; + +A* A::p; + +struct B { + A a; +}; + +B b = { A () }; + +struct A2 { + static A2* p; + + A2() { p = this; } + A2(const A2&); + ~A2() { if (this != p) abort (); } + void print () { } +}; + +A2* A2::p; + +struct B2 { + A2 a2; +}; + +int main () { + b.a.print (); + { + B2 b2 = { A2() }; + b2.a2.print (); + } +} + diff --git a/gcc/testsuite/g++.dg/init/aggr3.C b/gcc/testsuite/g++.dg/init/aggr3.C new file mode 100644 index 000000000..3376897e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr3.C @@ -0,0 +1,16 @@ +// PR c++/18793 + +struct S { + S(); + S(const S&); + void operator=(const S&); +}; + +struct X { + int a, b, c, d, e; + S s; +}; + +void foobar () { + X x = {0}; +} diff --git a/gcc/testsuite/g++.dg/init/aggr4.C b/gcc/testsuite/g++.dg/init/aggr4.C new file mode 100644 index 000000000..7120e68cd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr4.C @@ -0,0 +1,7 @@ +struct A +{ + int i; +}; + +A a1 = { 1 }; // ok +A a2 = { a1 }; // { dg-error "cannot convert" } diff --git a/gcc/testsuite/g++.dg/init/aggr5.C b/gcc/testsuite/g++.dg/init/aggr5.C new file mode 100644 index 000000000..c1844f8ff --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr5.C @@ -0,0 +1,11 @@ +// Origin PR c++/40239 +// { dg-do compile } + +struct B { B() { } private: B(B const&); }; +struct A { int a; B b; }; + +int +main() +{ + A a = {0}; +} diff --git a/gcc/testsuite/g++.dg/init/aggr6.C b/gcc/testsuite/g++.dg/init/aggr6.C new file mode 100644 index 000000000..98628d255 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr6.C @@ -0,0 +1,11 @@ +// Origin PR c++/40239 +// { dg-do compile } + +struct B { B() { } private: B(B const&); }; +struct A { int a; B b; }; + +int +main() +{ + A a = {}; +} diff --git a/gcc/testsuite/g++.dg/init/array0.C b/gcc/testsuite/g++.dg/init/array0.C new file mode 100644 index 000000000..235cdf0de --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array0.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "" } +// PR C++/24138 + +void foo() +{ + typedef struct { + unsigned char dir; + int data[0]; + } yanito; + static const yanito horse = { 1, { 2, 3 } }; // { dg-error "too many" } +} diff --git a/gcc/testsuite/g++.dg/init/array1.C b/gcc/testsuite/g++.dg/init/array1.C new file mode 100644 index 000000000..5847247c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array1.C @@ -0,0 +1,26 @@ +// Test that completing an array declared with a typedef doesn't change +// the typedef. + +// { dg-do run } + +typedef int iArr[]; + +const iArr array4={ + 1, 2, 3, 4 +}; + +const iArr array3={ + 1, 2, 3 +}; + +const iArr array5={ + 1, 2, 3, 4, 5 +}; + +int main() +{ + if (sizeof (array4)/sizeof (array4[0]) != 4 + || sizeof (array3)/sizeof (array3[0]) != 3 + || sizeof (array5)/sizeof (array5[0]) != 5) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/array10.C b/gcc/testsuite/g++.dg/init/array10.C new file mode 100644 index 000000000..41121055e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array10.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "" } + +typedef int __attribute__((vector_size (8))) vec; + +vec foo[] = { (vec) {1, 2} }; diff --git a/gcc/testsuite/g++.dg/init/array11.C b/gcc/testsuite/g++.dg/init/array11.C new file mode 100644 index 000000000..e52effe9f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array11.C @@ -0,0 +1,28 @@ +/* PR 11665 + Orgin: jwhite@cse.unl.edu + The problem was in initializer_constant_valid_p, + "for a CONSTRUCTOR, only the last element + of the CONSTRUCTOR was being checked" + (from the email of the patch which fixed this). + This used to ICE because GCC thought gdt_table was a + constant value when it is not. */ + +int x; + +typedef __SIZE_TYPE__ size_t; + +struct gdt +{ +size_t a,b,c,d,e,f; +}; +void f() +{ +struct gdt gdt_table[2]= +{ + { + 0, + ( (((size_t)(&x))<<(24))&(-1<<(8)) ), + }, +}; +} + diff --git a/gcc/testsuite/g++.dg/init/array12.C b/gcc/testsuite/g++.dg/init/array12.C new file mode 100644 index 000000000..3bb480029 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array12.C @@ -0,0 +1,28 @@ +// PR c++/12253 +// Bug: We were failing to destroy the temporary A passed to the +// constructor for b[0] before going on to construct b[1]. + +// { dg-do run } + +extern "C" int printf (const char *, ...); + +int c; +int r; + +struct A +{ + A() { printf ("A()\n"); if (c++) r = 1; } + A(const A&) { printf ("A(const A&)\n"); ++c; } + ~A() { printf ("~A()\n"); --c; } +}; + +struct B +{ + B(int, const A& = A()) { printf ("B()\n"); } +}; + +int main() +{ + B b[] = { 0, 0 }; + return r; +} diff --git a/gcc/testsuite/g++.dg/init/array13.C b/gcc/testsuite/g++.dg/init/array13.C new file mode 100644 index 000000000..aa66e33ac --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array13.C @@ -0,0 +1,9 @@ +template +struct test_disjoint_set { + static void do_test() + { + unsigned int elts[] + = { 0, 1, 2, 3 }; + const int N = sizeof(elts)/sizeof(*elts); + } +}; diff --git a/gcc/testsuite/g++.dg/init/array14.C b/gcc/testsuite/g++.dg/init/array14.C new file mode 100644 index 000000000..847bd1f20 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array14.C @@ -0,0 +1,21 @@ +// PR c++/12883 +// Bug: Destructor of array object not called if no prior +// instantiation of the template has happened. + +// { dg-do run } + +int ret = 1; + +template struct X +{ + X(int) { } + ~X() { ret = 0; } +}; + +int main() +{ + { + X<0> array[] = { 0 }; + } + return ret; +} diff --git a/gcc/testsuite/g++.dg/init/array15.C b/gcc/testsuite/g++.dg/init/array15.C new file mode 100644 index 000000000..17160d076 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array15.C @@ -0,0 +1,46 @@ +// { dg-do run } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Dec 2004 + +// PR 16681 too much memory used +// Origin: Matt LaFary + +struct foo { + unsigned char buffer[4111222]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer); ix--;) + if (buffer[ix]) + return false; + return true; +} + +void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[5000000]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + foo *f = new (heap) foo (); + + if (!f->check ()) + return 1; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/init/array16.C b/gcc/testsuite/g++.dg/init/array16.C new file mode 100644 index 000000000..188d1a84f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array16.C @@ -0,0 +1,112 @@ +// Causes timeout for the MMIX simulator on a 3GHz P4 and we can't +// have "compile" for some targets and "run" for others. +// { dg-do run { target { ! mmix-*-* } } } +// { dg-options "-mstructure-size-boundary=8" { target arm*-*-* } } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Dec 2004 + +// PR 16681 too much memory used +// Origin: Matt LaFary + +// NOTE: This test assumes that 4M instances of struct ELT can fit into +// a 5MB array. This isn't true, e.g., with the default +// arm-none-elf options. + +struct elt +{ + static int count; + static elt*ptr; + static int abort; + char c; + + elt (); + ~elt (); + +}; + +int elt::count; +elt *elt::ptr; +int elt::abort; + +elt::elt () + :c () +{ + if (count >= 0) + { + if (!ptr) + ptr = this; + if (count == 100) + throw 2; + if (this != ptr) + abort = 1; + count++; + ptr++; + } +} + +elt::~elt () +{ + if (count >= 0) + { + ptr--; + count--; + if (ptr != this) + abort = 2; + } +} + +struct foo { + elt buffer[4111222]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;) + if (buffer[ix].c) + return false; + return true; +} + +void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[5000000]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + try + { + foo *f = new (heap) foo (); + return 1; + } + catch (...) + { + if (elt::count) + return 2; + if (elt::abort) + return elt::abort + 3; + } + + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + elt::count = -1; + foo *f = new (heap) foo (); + if (!f->check ()) + return 3; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/init/array17.C b/gcc/testsuite/g++.dg/init/array17.C new file mode 100644 index 000000000..4240f7193 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array17.C @@ -0,0 +1,8 @@ +// { dg-do compile } + + +class StringMap { + const char empty_str[1]; +public: + StringMap() : empty_str() {} +}; diff --git a/gcc/testsuite/g++.dg/init/array18.C b/gcc/testsuite/g++.dg/init/array18.C new file mode 100644 index 000000000..154d03fcf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array18.C @@ -0,0 +1,22 @@ +// PR c++/20142 +// { dg-do run } + +int n=4; + +struct A +{ + A() {} + A& operator= (const A&) { --n; return *this; } +}; + +struct B +{ + A x[2][2]; +}; + +int main() +{ + B b; + b = b; + return n; +} diff --git a/gcc/testsuite/g++.dg/init/array19.C b/gcc/testsuite/g++.dg/init/array19.C new file mode 100644 index 000000000..a5f124e21 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array19.C @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "" } +double a[0] = { }; +const double b[0][1] = { }; diff --git a/gcc/testsuite/g++.dg/init/array2.C b/gcc/testsuite/g++.dg/init/array2.C new file mode 100644 index 000000000..ca03ff39c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array2.C @@ -0,0 +1,8 @@ +// Check that the type of an array is set correctly when flat initializers +// are used. + +// { dg-do compile } + +struct s { int a; int b; }; +struct s x[] = { 1, 2, 3, 4 }; +int y[sizeof (x) == 2 * sizeof (x[0])? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/init/array20.C b/gcc/testsuite/g++.dg/init/array20.C new file mode 100644 index 000000000..06a167596 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array20.C @@ -0,0 +1,5 @@ +// PR c++/27385 + +struct A {}; +A a[] = { 0 }; // { dg-error "initializer" } + diff --git a/gcc/testsuite/g++.dg/init/array21.C b/gcc/testsuite/g++.dg/init/array21.C new file mode 100644 index 000000000..f41ce86b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array21.C @@ -0,0 +1,7 @@ +// PR c++/27722 + +void foo() +{ + const int x[] = 0; // { dg-error "size" } + ++x; +} diff --git a/gcc/testsuite/g++.dg/init/array22.C b/gcc/testsuite/g++.dg/init/array22.C new file mode 100644 index 000000000..0c5bb33da --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array22.C @@ -0,0 +1,6 @@ +// PR C++/29002 +// We ICE trying to set the "zero" initializer on the incomplete +// array + +struct A {}; +int A::* x[]; // { dg-error "size" } diff --git a/gcc/testsuite/g++.dg/init/array23.C b/gcc/testsuite/g++.dg/init/array23.C new file mode 100644 index 000000000..80ffb0a98 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array23.C @@ -0,0 +1,6 @@ +// PR C++/29002 +// We ICE trying to set the "zero" initializer on the incomplete +// array + +struct A {A();int A::* t;}; +A x[]; // { dg-error "size" } diff --git a/gcc/testsuite/g++.dg/init/array24.C b/gcc/testsuite/g++.dg/init/array24.C new file mode 100644 index 000000000..ed4c1d881 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array24.C @@ -0,0 +1,7 @@ +// PR c++/29175 +// { dg-options "" } + +void foo(int i) +{ + int x[][i] = { 0 }; // { dg-error "variable-sized|storage size" } +} diff --git a/gcc/testsuite/g++.dg/init/array25.C b/gcc/testsuite/g++.dg/init/array25.C new file mode 100644 index 000000000..1ab2725d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array25.C @@ -0,0 +1,49 @@ +// related to PR c++/38233 +// test for value-init of a member array +// { dg-do run } + +struct elt +{ + virtual void f(); + char c; +}; + +void elt::f() { } + +struct foo { + elt buffer[500]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;) + if (buffer[ix].c) + return false; + return true; +} + +inline void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[sizeof(elt[500])]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + foo *f = new (heap) foo (); + if (!f->check ()) + return 3; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/init/array26.C b/gcc/testsuite/g++.dg/init/array26.C new file mode 100644 index 000000000..83c4e0c4a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array26.C @@ -0,0 +1,11 @@ +// PR c++/42058 +// { dg-options "" } + +struct A; + +struct B +{ + A a; // { dg-error "incomplete type" } +}; + +B b[1] = (B[]) { 0 }; // { dg-error "initializer" } diff --git a/gcc/testsuite/g++.dg/init/array27.C b/gcc/testsuite/g++.dg/init/array27.C new file mode 100644 index 000000000..988501545 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array27.C @@ -0,0 +1,11 @@ +// PR c++/42058 +// { dg-options "" } + +struct A {}; + +struct B +{ + A a; +}; + +B b[1] = (B[]) { 0 }; // { dg-error "initializer" } diff --git a/gcc/testsuite/g++.dg/init/array28.C b/gcc/testsuite/g++.dg/init/array28.C new file mode 100644 index 000000000..8cf19ba43 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array28.C @@ -0,0 +1,7 @@ +// PR c++/49669 + +struct Foo { explicit Foo(int) { } }; +struct Goo { + Goo() : x(Foo(4), Foo(5)) { } // { dg-error "array" } + Foo x[2]; +}; diff --git a/gcc/testsuite/g++.dg/init/array3.C b/gcc/testsuite/g++.dg/init/array3.C new file mode 100644 index 000000000..700b26389 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array3.C @@ -0,0 +1,23 @@ +// PR c++/6331 +// Bug: we were generating a badly cv-qualified ARRAY_TYPE in the +// synthesized copy constructor for A, which then became the canonical +// version, confusing later uses. + +struct A { + virtual ~A(); + const float* f(); + float fa[3]; +}; + +struct B { + B(const A& ai) : a (ai) {} + A a; +}; + +void g (const float pos[3]); + +extern A& a; +void h() +{ + g (a.f()); +} diff --git a/gcc/testsuite/g++.dg/init/array33.C b/gcc/testsuite/g++.dg/init/array33.C new file mode 100644 index 000000000..4440d3d54 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array33.C @@ -0,0 +1,22 @@ +// PR c++/55804 +// { dg-do run } + +int t = 0; +template struct vector { + vector() { t++; } +}; + +typedef vector Arrays[1]; +class C +{ + vector v_; + void Foo(const Arrays &); +}; +Arrays a; + +int main(void) +{ + if (t!=1) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/array4.C b/gcc/testsuite/g++.dg/init/array4.C new file mode 100644 index 000000000..67519bf7c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array4.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// Origin: Markus Breuer + +// PR c++/6944 +// Fail to synthesize copy constructor of multi-dimensional +// array of class. + +#include + +class Array +{ +public: + std::string m_array[10][20][30]; +}; + +Array func() +{ + Array result; + return result; // sorry, not implemented: cannot initialize multi-dimensional array with initializer +} + + +int main() +{ + Array arr = func(); +} + diff --git a/gcc/testsuite/g++.dg/init/array5.C b/gcc/testsuite/g++.dg/init/array5.C new file mode 100644 index 000000000..aeacb31cf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array5.C @@ -0,0 +1,52 @@ +// { dg-do run } +// Copyright (C) 2002 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij + +// Incorrect construction and destruction of multi-dimensional +// array of class. + +extern "C" void abort(); +extern "C" int printf(const char *, ...); + +int count; +int num; + +struct A +{ + A() + { + if (count == num) + throw ""; + count++; +#ifdef PRINT + printf("ctor %p\n", static_cast(this)); +#endif + } + + ~A() + { + count--; +#ifdef PRINT + printf("dtor %p\n", static_cast(this)); +#endif + } +}; + +struct Array +{ + A array[2][2][2]; +}; + +int main() +{ + for (num = 0; num <= 8; ++num) { + count = 0; + try { + Array A; + } + catch (...) { + } + if (count != 0) + abort(); + } +} diff --git a/gcc/testsuite/g++.dg/init/array6.C b/gcc/testsuite/g++.dg/init/array6.C new file mode 100644 index 000000000..6181d02bf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array6.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +char arr [][4] = { "one", "two" }; +const char arr2[][4] = { "one", "two" }; +signed char arr3[][4] = { "one", "two" }; +const unsigned char arr4[][4] = { "one", "two" }; +volatile wchar_t arr5[][4] = { L"one", L"two" }; diff --git a/gcc/testsuite/g++.dg/init/array7.C b/gcc/testsuite/g++.dg/init/array7.C new file mode 100644 index 000000000..23c6a7098 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array7.C @@ -0,0 +1,15 @@ +struct S { + virtual void v () {} + void f (const float g[3]); + float h[3]; +}; + +void g () { + S s1, s2; + s1 = s2; +} + +void S::f (const float g[3]) {} + + + diff --git a/gcc/testsuite/g++.dg/init/array8.C b/gcc/testsuite/g++.dg/init/array8.C new file mode 100644 index 000000000..5f28ca490 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array8.C @@ -0,0 +1,12 @@ +struct A { + A (); +}; + +struct B { + A a1; + A a2; +}; + +A a; + +struct B b[] = { { a, a }, { a, a } }; diff --git a/gcc/testsuite/g++.dg/init/array9.C b/gcc/testsuite/g++.dg/init/array9.C new file mode 100644 index 000000000..d37e00e5b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array9.C @@ -0,0 +1,9 @@ +struct T { + T (); +}; + +void f () { + T t[2]; + for (int i = 0; i < 10; ++i); + int i = 0; +} diff --git a/gcc/testsuite/g++.dg/init/assign1.C b/gcc/testsuite/g++.dg/init/assign1.C new file mode 100644 index 000000000..690a48191 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/assign1.C @@ -0,0 +1,30 @@ +// PR c++/13009 +// { dg-do run } + +struct A { + char a; +}; + +struct B: public virtual A { + #if 0 // this piece of code works around the problem + B& operator= (const B& other) + { + A::operator= (other); + } + #endif +}; + +struct C: public B { + char c; +}; + +int main() { + B b; + b.a = 'b'; + C c; + c.a = c.c = 'c'; + + c.B::operator= (b); + if (c.a != 'b' || c.c != 'c') + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/attrib1.C b/gcc/testsuite/g++.dg/init/attrib1.C new file mode 100644 index 000000000..839e4ce21 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/attrib1.C @@ -0,0 +1,10 @@ +// { dg-do run } + +void f() __attribute((__constructor__)); +int i; +void f() { i = 1; } + +int main(int, char **) +{ + return 1-i; +} diff --git a/gcc/testsuite/g++.dg/init/bitfield1.C b/gcc/testsuite/g++.dg/init/bitfield1.C new file mode 100644 index 000000000..70a06d0e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/bitfield1.C @@ -0,0 +1,24 @@ +// Check that we handle bitfields as complex lvalues properly. + +struct A +{ + int i: 2; + int j: 2; + int k: 2; +}; + +A a, a2; +bool b; +void f (); + +int main () +{ + (f(), a.j) = 1; + (f(), a).j = 2; // { dg-warning "overflow" } + (b ? a.j : a2.k) = 3; // { dg-warning "overflow" } + (b ? a : a2).j = 0; + ++(a.j) = 1; + (a.j = 2) = 3; // { dg-warning "overflow" } +} + + diff --git a/gcc/testsuite/g++.dg/init/bitfield2.C b/gcc/testsuite/g++.dg/init/bitfield2.C new file mode 100644 index 000000000..e54b2e423 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/bitfield2.C @@ -0,0 +1,33 @@ +// PR c++/13371 +// Bug: We were failing to properly protect the lhs on the line marked +// "here" from multiple evaluation. + +// { dg-do run } + +extern "C" int printf (const char *, ...); + +enum E { E1, E2 }; + +struct A +{ + E e : 8; + unsigned char c; +}; + +A ar[2]; + +int c; + +int f() +{ + ++c; + printf ("f()\n"); + return 0; +} + +int main() +{ + ar[0].c = 0xff; + ar[f()].e = E1; // here + return (c != 1 || ar[0].c != 0xff); +} diff --git a/gcc/testsuite/g++.dg/init/brace1.C b/gcc/testsuite/g++.dg/init/brace1.C new file mode 100644 index 000000000..a819fa258 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace1.C @@ -0,0 +1,4 @@ +// { dg-do compile } + +int i[4] = { { 3 } }; // { dg-error "brace" } + diff --git a/gcc/testsuite/g++.dg/init/brace2.C b/gcc/testsuite/g++.dg/init/brace2.C new file mode 100644 index 000000000..619a20f3c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace2.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// [dcl.init] paragraph 13. +int x = { 2 }; +const char * y = { "hello" }; +int a = 2; +int b = { 2,3 }; // { dg-error "requires one element in initializer" } +int c = { { 2 } } ; // { dg-error "braces around scalar initializer" } +int d = {}; // { dg-error "initializer" } diff --git a/gcc/testsuite/g++.dg/init/brace3.C b/gcc/testsuite/g++.dg/init/brace3.C new file mode 100644 index 000000000..0a1ee8f00 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace3.C @@ -0,0 +1 @@ +int array[2][1] = { {0} {1} }; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/init/brace4.C b/gcc/testsuite/g++.dg/init/brace4.C new file mode 100644 index 000000000..0c3790193 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace4.C @@ -0,0 +1,5 @@ +// PR c++/16859 +// { dg-do compile } +// { dg-options "-pedantic" } + +int a[] = { }; // { dg-error "zero-size array" } diff --git a/gcc/testsuite/g++.dg/init/brace5.C b/gcc/testsuite/g++.dg/init/brace5.C new file mode 100644 index 000000000..696bbd676 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace5.C @@ -0,0 +1,7 @@ +// PR c++/27491 +// { dg-do compile } +// { dg-options "" } + +int i = (int) { 0 }; +int j = (int) { i }; +int k = (int) { k }; diff --git a/gcc/testsuite/g++.dg/init/brace6.C b/gcc/testsuite/g++.dg/init/brace6.C new file mode 100644 index 000000000..e01b94742 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace6.C @@ -0,0 +1,25 @@ +/* PR c++/30759 */ +/* { dg-do compile } */ + +struct A { + A(int) { } +}; + +struct B { + B(const B&); + int b; +}; + +struct C {}; + +struct D { int c; }; + +int main() +{ + int i = { 1 }; + int j = { 1, 2 }; /* { dg-error "requires one element" } */ + A a = { 6 }; /* { dg-error "initialize" } */ + B b = { 6 }; /* { dg-error "" } */ + C c = { 6 }; /* { dg-error "too many initializers" } */ + D d = { 6 }; +} diff --git a/gcc/testsuite/g++.dg/init/byval1.C b/gcc/testsuite/g++.dg/init/byval1.C new file mode 100644 index 000000000..86c6e4683 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/byval1.C @@ -0,0 +1,31 @@ +// PR c++/3948 +// Test that the destructor call for a value parameter gets the +// right address. + +// { dg-do run } + +void *p[2]; +int i; +int r; + +struct C +{ + int m; + + C() { p[i++] = this; } + ~C() { if (p[--i] != this) r = 1; } +}; + + +void Foo (C c) +{ + p[i++] = &c; +} + +int main () +{ + C c; + + Foo (c); + return r; +} diff --git a/gcc/testsuite/g++.dg/init/call1.C b/gcc/testsuite/g++.dg/init/call1.C new file mode 100644 index 000000000..d44b6dddc --- /dev/null +++ b/gcc/testsuite/g++.dg/init/call1.C @@ -0,0 +1,35 @@ +// Bug c++/16115 +// { dg-options "-O2" } + +extern "C" void abort(); + +int count = 0; + +struct T { + T() { count++; } + T(const T&) { count++; } + ~T() { if (count==0) abort(); --count; } +}; + +struct auto_ptr { + T* p; + + auto_ptr(T* __p) : p(__p) { } + ~auto_ptr() { delete p; } + + T* release() { + T* t = p; + p = 0; + return t; + } +}; + +void destroy (auto_ptr a) { + delete a.release(); +} + + +int main () +{ + destroy (new T); +} diff --git a/gcc/testsuite/g++.dg/init/cleanup1.C b/gcc/testsuite/g++.dg/init/cleanup1.C new file mode 100644 index 000000000..517af15c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/cleanup1.C @@ -0,0 +1,16 @@ +// PR c++/13033 + +// We failed to treat the for increment expression as a full-expression, +// which broke gimplification. + +struct QDomNode { + virtual ~QDomNode(); + QDomNode nextSibling() const; + bool isNull() const; +}; + +void processNode(QDomNode n) +{ + for (; !n.isNull(); n = n.nextSibling()) + ; +} diff --git a/gcc/testsuite/g++.dg/init/cleanup2.C b/gcc/testsuite/g++.dg/init/cleanup2.C new file mode 100644 index 000000000..e62364be1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/cleanup2.C @@ -0,0 +1,19 @@ +// PR c++/12526 + +// We decided that the call to strcmp has no side-effects because strcmp is +// pure, even though the first argument has side-effects. As a result, we +// stripped the CLEANUP_POINT_EXPR. Hilarity ensued. + +extern "C" int strcmp (const char *, const char *); + +struct A { + A(int); + const char *str(); + ~A(); +}; + +void printQueryI() +{ + if(!strcmp(A(1).str(), "foo")) + { } +} diff --git a/gcc/testsuite/g++.dg/init/cleanup3.C b/gcc/testsuite/g++.dg/init/cleanup3.C new file mode 100644 index 000000000..da7e411ab --- /dev/null +++ b/gcc/testsuite/g++.dg/init/cleanup3.C @@ -0,0 +1,22 @@ +// Check that on targets with "__cxa_atexit" we use destructors, +// rather than cleanup functions, to destroy objects with static +// storage duration. + +// { dg-require-effective-target "cxa_atexit" } +// Cleanup functions generated by G++ have the "_tcf" prefix. +// { dg-final { scan-assembler-not "_tcf" } } + +struct S { + ~S(); +}; + +struct T { + S s; +}; + +S s; +T t; + +void f() { + static S s; +} diff --git a/gcc/testsuite/g++.dg/init/complex1.C b/gcc/testsuite/g++.dg/init/complex1.C new file mode 100644 index 000000000..3f88fd902 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/complex1.C @@ -0,0 +1,7 @@ +/* PR c++/21210 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef float __complex__ fcomplex; +fcomplex cplx = fcomplex(); + diff --git a/gcc/testsuite/g++.dg/init/const1.C b/gcc/testsuite/g++.dg/init/const1.C new file mode 100644 index 000000000..af4427d9a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const1.C @@ -0,0 +1,8 @@ +// PR c++/20073 + +template struct A +{ + A(); +}; + +const A<0> x[] = { A<0>() }; diff --git a/gcc/testsuite/g++.dg/init/const2.C b/gcc/testsuite/g++.dg/init/const2.C new file mode 100644 index 000000000..4fd631851 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const2.C @@ -0,0 +1,7 @@ +// PR c++/19878 + +struct S { + char k; +}; +char const volatile S::* const p01 = &S::k; + diff --git a/gcc/testsuite/g++.dg/init/const3.C b/gcc/testsuite/g++.dg/init/const3.C new file mode 100644 index 000000000..96cb6f909 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const3.C @@ -0,0 +1,12 @@ +// { dg-do run } + +struct S { + static const int i = 3; +}; + +const int S::i; + +int main () { + if (!S::i) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/const4.C b/gcc/testsuite/g++.dg/init/const4.C new file mode 100644 index 000000000..b99726b86 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const4.C @@ -0,0 +1,8 @@ +// PR c++/27804 +// { dg-do compile } + +bool foo() +{ + const int i = X; // { dg-error "not declared" } + return i > 0; +} diff --git a/gcc/testsuite/g++.dg/init/const5.C b/gcc/testsuite/g++.dg/init/const5.C new file mode 100644 index 000000000..fa8d8fc23 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const5.C @@ -0,0 +1,11 @@ +// PR c++/31449 + +class Foo {}; +class Bar : public Foo {}; +static const Foo *foo = 0; + +static Bar *bar = static_cast(foo); // { dg-error "conversion" } + +void func(const Foo *foo) { + Bar *bar = static_cast(foo); // { dg-error "conversion" } +} diff --git a/gcc/testsuite/g++.dg/init/const6.C b/gcc/testsuite/g++.dg/init/const6.C new file mode 100644 index 000000000..e626bfeac --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const6.C @@ -0,0 +1,27 @@ +// PR c++/36688 +// { dg-do run } +// { dg-options "-O2" } + +struct S +{ + long long a; + long long b; + long long c; +}; + +struct T +{ + S g; + long long h[12]; +}; + +static const S s = { 1, 2, 3 }; +static const T t = { s, 0 }; + +int +main () +{ + T x = t; + if (__builtin_memcmp (&x, &t, sizeof (T))) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/init/const7.C b/gcc/testsuite/g++.dg/init/const7.C new file mode 100644 index 000000000..18d04625d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const7.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-fdump-tree-gimple" } + +struct s { int x, y; }; +short offsets[1] = { + ((char*) &(((struct s*)16)->y) - (char *)16), +}; + +// This ensures that we get a dump whether or not the bug is present. +void fn() { } + +// { dg-final { scan-tree-dump-not "initialization" "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/g++.dg/init/const8.C b/gcc/testsuite/g++.dg/init/const8.C new file mode 100644 index 000000000..4eb293d65 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const8.C @@ -0,0 +1,11 @@ +// DR 234 - it should be OK to leave off the initializer of a const +// variable if the default constructor fully initializes the object. + +struct A { }; +const A a; + +struct B { A a; }; +const B b; + +struct C { virtual void f(); }; +const C c; diff --git a/gcc/testsuite/g++.dg/init/copy1.C b/gcc/testsuite/g++.dg/init/copy1.C new file mode 100644 index 000000000..91a84ae3e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy1.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +class A { +public: + A(){} + A( const A& a ){} +}; + +class B : public A +{ +public: + B( int& s) : s_(s){} + int& s_; +}; + +int main() +{ + int i; + B x1( i ); + B x2( x1 ); +} diff --git a/gcc/testsuite/g++.dg/init/copy2.C b/gcc/testsuite/g++.dg/init/copy2.C new file mode 100644 index 000000000..9a662d4cf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy2.C @@ -0,0 +1,5 @@ +// { dg-do compile } + +struct S { S (); }; + +volatile S s[1] = { S () }; diff --git a/gcc/testsuite/g++.dg/init/copy3.C b/gcc/testsuite/g++.dg/init/copy3.C new file mode 100644 index 000000000..fa6a6ea18 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy3.C @@ -0,0 +1,16 @@ +// { dg-do run } +// { dg-options "-fno-elide-constructors" } + +int copies; + +struct S { + S () {} + S (const S&) { ++copies; } +}; + +S s[1] = { S () }; + +int main () { + if (copies != 1) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/copy4.C b/gcc/testsuite/g++.dg/init/copy4.C new file mode 100644 index 000000000..bfff68566 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy4.C @@ -0,0 +1,19 @@ +// PR c++/9342 +// We were failing to wrap def().user in a TARGET_EXPR, so copying it +// into the reference temp used a bitwise copy. + +struct QString +{ + QString( const QString & ); + QString &operator=( const QString & ); +}; +struct ServerSettings +{ + QString user; +}; +extern ServerSettings def(); +extern void arg( const QString& a ); +void startSession( bool b, QString s ) +{ + arg (b ? def().user : s); +} diff --git a/gcc/testsuite/g++.dg/init/copy5.C b/gcc/testsuite/g++.dg/init/copy5.C new file mode 100644 index 000000000..cef5a2950 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy5.C @@ -0,0 +1,29 @@ +// { dg-options "-O2" } + +struct BOOL { + int nVal:1, bSet:1; + BOOL (int i) : nVal(i!=0), bSet(1) {} +}; +struct Fill { + void *d; + Fill() : d(0) {} + Fill( const Fill& ) {} +}; +struct SvMetaSlot { + Fill aGroupId; + BOOL a8; + SvMetaSlot() : + a8(1) {} + SvMetaSlot* MakeClone() const; +}; + +SvMetaSlot* SvMetaSlot::MakeClone() const { return new SvMetaSlot( *this ); } + +extern "C" void abort(void); +int main() +{ + SvMetaSlot s; SvMetaSlot s2(s); + if (s.a8.bSet != s2.a8.bSet) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/copy6.C b/gcc/testsuite/g++.dg/init/copy6.C new file mode 100644 index 000000000..136dc7830 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy6.C @@ -0,0 +1,13 @@ +// PR c++/11878 + +struct A +{ + virtual ~A(); +}; + +template struct B +{ + T t; +}; + +void foo() { throw B().t; } diff --git a/gcc/testsuite/g++.dg/init/copy7.C b/gcc/testsuite/g++.dg/init/copy7.C new file mode 100644 index 000000000..20e1e47db --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy7.C @@ -0,0 +1,39 @@ +// PR c++/39480 +// It isn't always safe to call memcpy with identical arguments. +// { dg-do run } + +extern "C" void abort(); +extern "C" void * +memcpy(void *dest, void *src, __SIZE_TYPE__ n) +{ + if (dest == src) + abort(); + else + { + __SIZE_TYPE__ i; + for (i = 0; i < n; i++) + ((char *)dest)[i] = ((const char*)src)[i]; + } +} + +struct A +{ + double d[10]; +}; + +struct B: public A +{ + char bc; +}; + +B b; + +void f(B *a1, B* a2) +{ + *a1 = *a2; +} + +int main() +{ + f(&b,&b); +} diff --git a/gcc/testsuite/g++.dg/init/ctor1.C b/gcc/testsuite/g++.dg/init/ctor1.C new file mode 100644 index 000000000..aeb509bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor1.C @@ -0,0 +1,57 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2002 + +// From WindRiver SPR 80797 +// We were inadvertently SAVE_EXPRing volatile arrays during delete[] + +struct A +{ + A *ptr; + static int ok; + + A () {ptr = this;} + ~A () {ok = ptr == this;} +}; +int A::ok = -1; + +struct B +{ + B *ptr; + static int ok; + + B () {ptr = this;} + ~B () {ok = ptr == this;} +}; +int B::ok = -1; + +struct C +{ + A volatile a; + B volatile b[1]; + + C (); +}; + +C::C () +{ + throw 1; +} + +int main () +{ + try + { + C c; + } + catch (...) + { + if (A::ok != 1) + return 1; + if (B::ok != 1) + return 2; + return 0; + } + return 3; +} diff --git a/gcc/testsuite/g++.dg/init/ctor2.C b/gcc/testsuite/g++.dg/init/ctor2.C new file mode 100644 index 000000000..cf426f2bf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor2.C @@ -0,0 +1,34 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Mar 2003 + +// PR 9629. The vtable is not set up until the base initializers have +// run. + +struct A { + static A *a; + A (); +}; +A *A::a; +A::A () {a = this;} + +struct B { + static A *a; + B (A *); +}; +A *B::a; +B::B(A *a_) {a = a_;} + +struct C : virtual public A, public B { + C(); +}; +C::C () : B(this) {} + +struct D : virtual public C {}; + +int main() +{ + new D(); + return A::a != B::a; +} diff --git a/gcc/testsuite/g++.dg/init/ctor3.C b/gcc/testsuite/g++.dg/init/ctor3.C new file mode 100644 index 000000000..1678aaf2c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor3.C @@ -0,0 +1,6 @@ +// PR c++/14401 + +struct S { + S() {} // { dg-error "" } + const int i; +}; diff --git a/gcc/testsuite/g++.dg/init/ctor4.C b/gcc/testsuite/g++.dg/init/ctor4.C new file mode 100644 index 000000000..1c92bb973 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor4.C @@ -0,0 +1,20 @@ +// PR c++/17788 +// { dg-do compile } + +class foo { +public: + foo(); +}; + +class bar: public foo { // { dg-error "reference|bar::bar" } +private: + int &a; +}; + +foo::foo() { +} + +int main(int argc, char **argv) +{ + bar x; // { dg-message "synthesized|deleted" } +} diff --git a/gcc/testsuite/g++.dg/init/ctor5.C b/gcc/testsuite/g++.dg/init/ctor5.C new file mode 100644 index 000000000..cc9331882 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor5.C @@ -0,0 +1,17 @@ +// PR C++/21645 +// We were crashing because we forgot to update the type for +// the cloned argument for the cloned ctor. + +struct color { + ~color(); +}; +struct style { + color col; + style (color); +}; + +style::style(color c) + : col(c) +{ +} + diff --git a/gcc/testsuite/g++.dg/init/ctor6.C b/gcc/testsuite/g++.dg/init/ctor6.C new file mode 100644 index 000000000..a25ecab1f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor6.C @@ -0,0 +1,20 @@ +// PR c++/21340 + +struct Base{}; +struct Iterator : virtual Base {}; +bool operator==(const Iterator&, const Iterator&); +struct IteratorI : Iterator {}; +struct Obj +{ + bool operator==(const Obj&) const; +}; +template bool dummy() +{ + Obj lhs, rhs; + return lhs == rhs; +} +int +main(int argc, char** argv) +{ + IteratorI* it2 = new IteratorI(); +} diff --git a/gcc/testsuite/g++.dg/init/ctor7.C b/gcc/testsuite/g++.dg/init/ctor7.C new file mode 100644 index 000000000..3378a150e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor7.C @@ -0,0 +1,51 @@ +// { dg-do run } + +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Oct 2005 + +// PR 23984:ICE +// Origin: Andrew Pinski pinskia@gcc.gnu.org + +struct B +{ + virtual void Foo (); +}; + +void B::Foo () +{ +} + +struct D : virtual B +{ +}; + +struct E +{ + B *ptr; + + E (B *); +}; + +static B *ptr; + +E::E (B *ptr_) + :ptr (ptr_) +{ +} + +struct G : D, E +{ + G (); +}; + +G::G () + : E (this) +{ +} + +int main () +{ + G object; + + return object.ptr != &object; +} diff --git a/gcc/testsuite/g++.dg/init/ctor8.C b/gcc/testsuite/g++.dg/init/ctor8.C new file mode 100644 index 000000000..3491f6a1d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor8.C @@ -0,0 +1,9 @@ +// PR c++/29039 + +typedef struct S { + int &r; +}; // { dg-warning "'typedef' was ignored" } + +S f () { + return S (); // { dg-error "reference" } +} diff --git a/gcc/testsuite/g++.dg/init/ctor9.C b/gcc/testsuite/g++.dg/init/ctor9.C new file mode 100644 index 000000000..02bb5700f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor9.C @@ -0,0 +1,8 @@ +// PR c++/38427 +// { dg-do compile } + +struct S +{ + int &ref; + S() : ref() {}; // { dg-error "value-initialization of" } +}; diff --git a/gcc/testsuite/g++.dg/init/delete1.C b/gcc/testsuite/g++.dg/init/delete1.C new file mode 100644 index 000000000..698b12771 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/delete1.C @@ -0,0 +1,7 @@ +// PR c++/19811 + +class C; // { dg-error "forward" } + +void foo(void *p) { + delete [] ((C*)p) ; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/init/delete2.C b/gcc/testsuite/g++.dg/init/delete2.C new file mode 100644 index 000000000..8a486beaa --- /dev/null +++ b/gcc/testsuite/g++.dg/init/delete2.C @@ -0,0 +1,55 @@ +// PR c++/15097 +// { dg-do run } + +typedef __SIZE_TYPE__ size_t; + +extern "C" void * malloc (size_t); +extern "C" void free (void *); +extern "C" void abort(void); + +void *saved; + +void * operator new (size_t size) +{ + void *p = malloc (size); + saved = p; + return p; +} + +void operator delete (void *p) +{ + if (p != saved) + abort (); + free (p); +} + +struct B1 +{ + virtual ~B1 () throw() {} + B1 (){} + int x; +}; +struct B2 +{ + virtual ~B2 () throw() {} + B2 (){} + int x; +}; +struct D : B1, B2 +{ + D (){} + ~D () throw() {} + int y; +}; +void f1 (D*); +void f2 (B2*); +void f3 (B1*); +int main (void) +{ + f1 (::new D); + f2 (::new D); + f3 (::new D); +} +void f1 ( D* p) { ::delete p; } +void f2 (B2* p) { ::delete p; } +void f3 (B1* p) { ::delete p; } diff --git a/gcc/testsuite/g++.dg/init/dso_handle1.C b/gcc/testsuite/g++.dg/init/dso_handle1.C new file mode 100644 index 000000000..97f67cad8 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dso_handle1.C @@ -0,0 +1,11 @@ +// PR c++/17042 +// { dg-do assemble } +/* { dg-require-weak "" } */ +// { dg-options "-fuse-cxa-atexit" } + +struct A +{ A(); ~A(); }; +A a; +extern "C" { void* __dso_handle __attribute__ ((__weak__)); } +void f() +{ __dso_handle = 0; } diff --git a/gcc/testsuite/g++.dg/init/dtor1.C b/gcc/testsuite/g++.dg/init/dtor1.C new file mode 100644 index 000000000..624433897 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dtor1.C @@ -0,0 +1,43 @@ +// { dg-do run } + +extern "C" void abort (); + +int d = 5; + +struct B +{ + int x; + B (int i) : x (i) { } + ~B () { if (d-- != x) abort (); } +}; + +struct C1 : public B { + C1 (int i) : B (i) {} +}; + +struct C2 : public B { + C2 (int i) : B (i) {} +}; + +struct D : public B { + D (int i) : B (i) {} +}; + +struct E : public B { + E (int i) : B (i) {} +}; + +struct A + : public C1, C2, virtual public D, virtual public E +{ + A () : D (0), E (1), C1 (2), C2 (3), x1(4), x2(5) {} + B x1; + B x2; +}; + + +int main () +{ + A a; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/dtor2.C b/gcc/testsuite/g++.dg/init/dtor2.C new file mode 100644 index 000000000..56c7cac91 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dtor2.C @@ -0,0 +1,28 @@ +// { dg-do run } + +extern "C" void abort (); + +struct A +{ + ~A(); +}; + +A::~A () { + abort (); +} + +struct B +{ + ~B(); +}; + +B::~B () { + if(true) return; + A a; +} + +int main() +{ + B b; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/dtor3.C b/gcc/testsuite/g++.dg/init/dtor3.C new file mode 100644 index 000000000..2af1ffe46 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dtor3.C @@ -0,0 +1,21 @@ +// PR c++/17976 +// { dg-do run } + +extern "C" void abort(); +struct A +{ + static int i; + A(){} + ~A(){i++;if(i>1)abort();} +}; + +int A::i = 0; + +A a; +extern A a; + +int main() +{ + return 0; +} + diff --git a/gcc/testsuite/g++.dg/init/elide1.C b/gcc/testsuite/g++.dg/init/elide1.C new file mode 100644 index 000000000..24e81e387 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/elide1.C @@ -0,0 +1,38 @@ +// { dg-do run } + +// Test that the destructor for a temporary passed by value isn't run +// until end of full-expression, as per [class.copy]: + +// Whenever a temporary class object is copied using a copy constructor, +// and this object and the copy have the same cv-unqualified type, an +// implementation is permitted to treat the original and the copy as two +// different ways of referring to the same object and not perform a copy +// at all, even if the class copy constructor or destructor have side +// effects.... In these cases, the +// object is destroyed at the later of times when the original and the +// copy would have been destroyed without the optimization. + +// Here, the temporary would be destroyed later than the parm, so either we +// must suppress the optimization in this case or destroy value parms in the +// caller. + +int d; + +struct A { + A () { } + A (const A&) { } + ~A() { ++d; } +}; + +void f (A a) { } + +int main () +{ + int r; + f (A ()), r = d; + + if (r < d && d) + return 0; + else + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/elide2.C b/gcc/testsuite/g++.dg/init/elide2.C new file mode 100644 index 000000000..e6d3300b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/elide2.C @@ -0,0 +1,30 @@ +// PR c++/8674 + +// Bug: Since B().a is an rvalue, we tried to treat it like a TARGET_EXPR +// and elide the copy. But that produces a bitwise copy, which causes us +// to abort in cp_expr_size. + +// Test that we actually run the A copy constructor when calling f(). + +// { dg-do run } + +int c; + +struct A +{ + A () { ++c; } + A (const A&) { ++c; } +}; + +struct B +{ + A a; +}; + +void f (A) { } + +int main () +{ + f (B().a); + return c < 2; +} diff --git a/gcc/testsuite/g++.dg/init/empty1.C b/gcc/testsuite/g++.dg/init/empty1.C new file mode 100644 index 000000000..bba179f98 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/empty1.C @@ -0,0 +1,30 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 3 Sept 2001 + +// Bug 4203. We were bit copying empty bases including the +// padding. Which clobbers whatever they overlay. + +class EmptyBase0 {}; +class EmptyBase1 : public EmptyBase0 {}; +class Base1 +{ +public: +unsigned int t_; +Base1(unsigned int t) : t_(t) {} +}; + +class PEPE : public Base1, public EmptyBase1 +{ +public: +PEPE(unsigned int t) + : Base1(t), EmptyBase1(EmptyBase1()) {} +}; + +int main() +{ + PEPE pepe(0xff); + + return pepe.t_ != 255; +} diff --git a/gcc/testsuite/g++.dg/init/enum1.C b/gcc/testsuite/g++.dg/init/enum1.C new file mode 100644 index 000000000..4876e4594 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/enum1.C @@ -0,0 +1,18 @@ +/* { dg-options "-Wno-overflow" } */ + +#ifndef __SIZEOF_INT128__ +#define UNACCEPT 0xffffffffffffffffLL +#else +#define UNACCEPT ~((unsigned __int128) 0) +#endif + +enum test { + acceptable = -1, + unacceptable = UNACCEPT +}; // { dg-error "" } + +enum test t = acceptable, u = unacceptable; + +int main() { + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/enum2.C b/gcc/testsuite/g++.dg/init/enum2.C new file mode 100644 index 000000000..dea7dc17b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/enum2.C @@ -0,0 +1,9 @@ +#include +enum test { + z = 0, + c = UINT_MAX + 1LL +} x = z; + +int main() { + return x != z; +} diff --git a/gcc/testsuite/g++.dg/init/error1.C b/gcc/testsuite/g++.dg/init/error1.C new file mode 100644 index 000000000..bdd983f96 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/error1.C @@ -0,0 +1,7 @@ +// PR c++/12696 + +struct A { + static float b[10]; +} // { dg-error "after struct definition" } + +float A::b[] = {1,2,3}; diff --git a/gcc/testsuite/g++.dg/init/error2.C b/gcc/testsuite/g++.dg/init/error2.C new file mode 100644 index 000000000..43d24f13b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/error2.C @@ -0,0 +1,15 @@ +/* PR c++/29727 */ +/* { dg-do compile } */ + +template struct A +{ + static int a[1]; +}; +template int A::a[1] = { X:0 }; /* { dg-error "does not allow designated|was not declared|designated initializer for an array" } */ + +void foo() +{ + A<0>::a; +} + + diff --git a/gcc/testsuite/g++.dg/init/float1.C b/gcc/testsuite/g++.dg/init/float1.C new file mode 100644 index 000000000..d18ff3db0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/float1.C @@ -0,0 +1,19 @@ +// PR c++/21089 +// { dg-do run } + +extern "C" void abort(); + +static const double a = 1.0; +struct S { + S(); +}; +static S s; +static const double b = a + 1.0; + +S::S() { + if (b < 1.9 || b > 2.1) + abort (); +} + +int main () { +} diff --git a/gcc/testsuite/g++.dg/init/for1.C b/gcc/testsuite/g++.dg/init/for1.C new file mode 100644 index 000000000..02f8a2d48 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/for1.C @@ -0,0 +1,28 @@ +// PR c++/13865 +// Bug: We were destroying 'a' before executing the loop. + +#include + +int i; +int r; + +class A +{ +public: + A() { printf("A ctor\n"); } + ~A() + { + printf("A dtor\n"); + if (i != 1) + r = 1; + } +}; + +int main(int argc, char **argv) +{ + for (A a; i < 2; ++i) { + printf("iteration %d\n", i); + } + + return r; +} diff --git a/gcc/testsuite/g++.dg/init/for2.C b/gcc/testsuite/g++.dg/init/for2.C new file mode 100644 index 000000000..d66fea30e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/for2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// PR 16012: Got the scope of I incorrect in templates only. + +template void foo() +{ + for (int i=0 ;;) ; + int i; +} + +void bar() +{ + foo<0>(); +} diff --git a/gcc/testsuite/g++.dg/init/for3.C b/gcc/testsuite/g++.dg/init/for3.C new file mode 100644 index 000000000..c8ef3cc62 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/for3.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +struct A { int i; A(); A(const A&); }; + +void bar() +{ + A a; + for ( ;; a=A() ) ; +} diff --git a/gcc/testsuite/g++.dg/init/global1.C b/gcc/testsuite/g++.dg/init/global1.C new file mode 100644 index 000000000..21f1cac06 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/global1.C @@ -0,0 +1,16 @@ +// PR c++/18416 + +class errarg { + enum { EMPTY } type; +public: + errarg(); +}; +extern errarg empty_errarg; +extern void errprint(const char *, + const errarg &arg1 = empty_errarg, + const errarg &arg2 = empty_errarg, + const errarg &arg3 = empty_errarg); +errarg::errarg() : type(EMPTY) +{ +} +errarg empty_errarg; diff --git a/gcc/testsuite/g++.dg/init/goto1.C b/gcc/testsuite/g++.dg/init/goto1.C new file mode 100644 index 000000000..b0a0c5253 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/goto1.C @@ -0,0 +1,23 @@ +// PR c++/14724 +// { dg-do run } + +int j; + +template +struct C { + C() { ++j; } + ~C() { --j; } +}; + +int main(int, char **) { + { + int i = 0; + again: + C v; + if (++i < 10) + goto again; + } + + return j; +} + diff --git a/gcc/testsuite/g++.dg/init/goto2.C b/gcc/testsuite/g++.dg/init/goto2.C new file mode 100644 index 000000000..3f4ecc04c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/goto2.C @@ -0,0 +1,11 @@ +// PR c++/20721 + +bool f(); +void g(int i) +{ + if (i) goto bad; // { dg-error "from" } + bool a = f(); // { dg-error "initialization" } + bad: // { dg-error "jump" } + ; +} + diff --git a/gcc/testsuite/g++.dg/init/init-ref1.C b/gcc/testsuite/g++.dg/init/init-ref1.C new file mode 100644 index 000000000..d0170cd18 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref1.C @@ -0,0 +1,45 @@ +// Submitted by Erik Rozendaal +// Test case for GNATS bug 787. +// { dg-do run } + +#include +#include + +static int calls; + +int &foo (int &arg) +{ + calls++; + arg=0; + return arg; +} + +int &identity (int &x) +{ + return x; +} + +int main() +{ + int a; + + calls = 0; + int &b = ++foo (a); + if (calls > 1) + abort (); + if (&a != &b) + abort (); + if (a != 1) + abort (); + + calls = 0; + int &c = ++identity (++foo (a)); + if (calls > 1) + abort (); + if (&a != &c) + abort (); + if (a != 2) + abort (); + + exit (0); +} diff --git a/gcc/testsuite/g++.dg/init/init-ref2.C b/gcc/testsuite/g++.dg/init/init-ref2.C new file mode 100644 index 000000000..6d9448a8e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref2.C @@ -0,0 +1,42 @@ +// Submitted by Jason Merrill +// Test for proper handling of local static references. +// { dg-do run } + +int r; + +int c; +int f () +{ + // Test that we only initialize i once. + if (++c > 1) + ++r; + return 42; +} + +const int *p; +void g () +{ + static const int &i = f(); + + // Test that i points to the same place in both calls. + if (p && p != &i) + ++r; + // Test that if so, it points to static data. + if (i != 42) + ++r; + + p = &i; +} + +void h () +{ + int arr[] = { 1, 1, 1, 1, 1, 1, 1 }; + g (); +} + +int main () +{ + g (); + h (); + return r; +} diff --git a/gcc/testsuite/g++.dg/init/init-ref3.C b/gcc/testsuite/g++.dg/init/init-ref3.C new file mode 100644 index 000000000..e858fd74d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref3.C @@ -0,0 +1,47 @@ +// Origin: Peter Schmid + +// { dg-do link } + +template +class Ptr { +protected: + T * ptr; + +public: + + Ptr(void) : ptr(0) { } + Ptr(T * p) : ptr(p) { } + + ~Ptr(void) { delete ptr; } + + operator T & () { return *ptr; } +}; + +class base { +public: + base(void) { } + ~base(void) { } +}; + + +class foo : public base { +private: + foo(const foo & rv); + +public: + + foo(void) { } + ~foo(void) { } +}; + +void func2(base & b) { + // ... +} + +int main () { + Ptr f = new foo; + /* This should not result in a copy; the result of the conversion + operator should be bound directly to the reference argument to + `func2'. */ + func2(f); +} diff --git a/gcc/testsuite/g++.dg/init/init-ref4.C b/gcc/testsuite/g++.dg/init/init-ref4.C new file mode 100644 index 000000000..7cd6986ce --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref4.C @@ -0,0 +1,21 @@ +// Origin: dgregor@gcc.gnu.org +// PR c++/11384 +// foo::_S_something was not being emitted (as a weak definition). + +// { dg-do run } +// { dg-require-weak "" } + +template + struct foo + { + static const T _S_something; + }; + +template + const T foo::_S_something = T(); + +int main() +{ + const int* p = &foo::_S_something; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/inline1.C b/gcc/testsuite/g++.dg/init/inline1.C new file mode 100644 index 000000000..f3e323427 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/inline1.C @@ -0,0 +1,14 @@ +// PR c++/9167 +// { dg-options "-finline" } + +struct A { + ~A(); + A f(A) { } +}; + + +void f(void) +{ + A a; + a.f(a); +} diff --git a/gcc/testsuite/g++.dg/init/member1.C b/gcc/testsuite/g++.dg/init/member1.C new file mode 100644 index 000000000..88f9b3134 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/member1.C @@ -0,0 +1,21 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Jun 2005 + +// Origin: Ivan Godard +// Bug 20789: ICE on invalid + +template struct A; + +template struct B {}; + +template struct C +{ + static const int i = A::i; // { dg-error "incomplete" } + static const int j = i; + B b; +}; + +C c; + +int i = C::i; +int j = C::j; diff --git a/gcc/testsuite/g++.dg/init/new1.C b/gcc/testsuite/g++.dg/init/new1.C new file mode 100644 index 000000000..5015d819f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new1.C @@ -0,0 +1,19 @@ +// Origin: asharji@uwaterloo.ca + +// { dg-do compile } + +typedef __SIZE_TYPE__ size_t; + +class bar { + int i; + public : + void * operator new ( size_t , void * storage ); +}; + +class foo { + int storage[ 5 ]; + public: + void mem ( ) { + bar *s = new ( ( void * ) & storage ) bar; + } +}; diff --git a/gcc/testsuite/g++.dg/init/new10.C b/gcc/testsuite/g++.dg/init/new10.C new file mode 100644 index 000000000..e19629bc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new10.C @@ -0,0 +1,8 @@ +// PR c++/14452 +// We got confused trying to preevaluate the new-initializer. + +struct S {}; +void foo (bool b) +{ + new S(b ? S() : S()); +} diff --git a/gcc/testsuite/g++.dg/init/new11.C b/gcc/testsuite/g++.dg/init/new11.C new file mode 100644 index 000000000..bf06aa4e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new11.C @@ -0,0 +1,21 @@ +// PR c++/17670 +// { dg-do run } + +#include +#include + +bool abort_new; +void *operator new[](size_t bytes) throw (std::bad_alloc) { + if (abort_new) + abort(); + return operator new (bytes); +} + + +struct X {}; +int main () { + // Do not abort until main is running in case startup code uses + // operator new[]. + abort_new = true; + new (X); +} diff --git a/gcc/testsuite/g++.dg/init/new12.C b/gcc/testsuite/g++.dg/init/new12.C new file mode 100644 index 000000000..ce2acb237 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new12.C @@ -0,0 +1,6 @@ +// PR c++/18369 + +void breakme () +{ + int *v = new (int [5]); +} diff --git a/gcc/testsuite/g++.dg/init/new13.C b/gcc/testsuite/g++.dg/init/new13.C new file mode 100644 index 000000000..2ced6e3fe --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new13.C @@ -0,0 +1,11 @@ +// PR c++/22508 +// ICE on invalid operator new +// Origin: Flash Sheridan +// { dg-do compile } + +struct A +{ + void* operator new(__SIZE_TYPE__) throw(X); // { dg-error "expected|type" } +}; + +A* p = new A; diff --git a/gcc/testsuite/g++.dg/init/new14.C b/gcc/testsuite/g++.dg/init/new14.C new file mode 100644 index 000000000..5d13da20e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new14.C @@ -0,0 +1,11 @@ +// PR c++/23491 + +struct X +{ + int m; +}; + +void f(int n) +{ + const X *p = new const X[1] () ; +} diff --git a/gcc/testsuite/g++.dg/init/new15.C b/gcc/testsuite/g++.dg/init/new15.C new file mode 100644 index 000000000..b93b43c83 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new15.C @@ -0,0 +1,19 @@ +// PR c++/9782 + +extern "C" void printf(const char*, ...); + +template +struct A { + A() {printf("A::A()\n");} +}; + + +struct B { + B() {printf("B::B()\n");} +}; + + +int main () { + new A<0>[1][1]; + new B [1][1]; +} diff --git a/gcc/testsuite/g++.dg/init/new16.C b/gcc/testsuite/g++.dg/init/new16.C new file mode 100644 index 000000000..c49f13f83 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new16.C @@ -0,0 +1,38 @@ +// { dg-do run } +// { dg-options "-O2 -fstrict-aliasing" } + +// Test that we don't let TBAA reorder an assignment across a +// placement new. +// See PR 29286. + +typedef __SIZE_TYPE__ size_t; + +inline void* operator new(size_t, void* __p) throw() { return __p; } + +void __attribute__((noinline)) bar() {} + +long __attribute__((noinline)) foo(double *p, int n) +{ + long *f; + for (int i=0; i +class Vector +{ +public: + Vector() + { + for (int i = 0; i < D; ++i) + new (&x_m[i]) T(); + } + T& operator[](int i) { return x_m[i]; } + +private: + T x_m[D]; +}; + +void foo(Vector *m) +{ + Vector v; + v[0] = 1.0; + v[1] = 2.0; + v[3] = 3.0; + *m = v; +} + +// { dg-final { scan-tree-dump-times "= 0\.0" 1 "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/init/new18.C b/gcc/testsuite/g++.dg/init/new18.C new file mode 100644 index 000000000..45f6e7a09 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new18.C @@ -0,0 +1,45 @@ +// { dg-do compile } +// { dg-options "-O2 -fstrict-aliasing" } + +// This caused an ICE during placement new. + +namespace Pooma { + typedef int Context_t; + namespace Arch { + } + inline Context_t context() { + } + inline int contexts() { + } + } +template struct DomainTraitsScalar { + }; +template struct DomainTraits : public DomainTraitsScalar { + }; +template class Grid; +template class DomainBase { + }; +template class Domain : public DomainBase
{ + }; +#include +template<> class Grid<1> : public Domain<1, DomainTraits > > { + }; +namespace Pooma { + class PatchSizeSyncer { + typedef Grid<1> Grid_t; + PatchSizeSyncer(int contextKey, Grid_t &localGrid); + int myContext_m; + int numContexts_m; + int localKey_m; + Grid_t localGrid_m; + typedef std::pair Elem_t; + std::vector gridList_m; + }; + } +namespace Pooma { + PatchSizeSyncer::PatchSizeSyncer(int contextKey, Grid_t &localGrid) : +myContext_m(Pooma::context()), numContexts_m(Pooma::contexts()), +localKey_m(contextKey), localGrid_m(localGrid) { + if (myContext_m == 0) gridList_m.reserve(numContexts_m); + } + } diff --git a/gcc/testsuite/g++.dg/init/new19.C b/gcc/testsuite/g++.dg/init/new19.C new file mode 100644 index 000000000..a25be7da7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new19.C @@ -0,0 +1,73 @@ +// { dg-do compile } +// { dg-options "-O2 -fstrict-aliasing -fdump-tree-pre-details" } + +// Make sure we hoist invariants out of the loop even in the presence +// of placement new. This is similar to code in tramp3d. + +typedef __SIZE_TYPE__ size_t; + +inline void* operator new(size_t, void* __p) throw() { return __p; } + +template +class Vector +{ +public: + Vector() + { + for (int i = 0; i < D; ++i) + new (&x_m[i]) T(); + } + T& operator[](int i) { return x_m[i]; } + +private: + T x_m[D]; +}; + +struct sia +{ + int ai[3]; +}; + +struct s +{ + struct si + { + sia* p; + } asi[3]; + float* pd; +}; + +class c +{ + int foo(int, int, int); + s sm; +}; + + +extern void bar(Vector*, int); +int c::foo(int f1, int f2, int f3) +{ + float sum = 0; + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + Vector v; + v[0] = 1.0; + v[1] = 2.0; + v[2] = 3.0; + for (int k = 0; k < 3; ++k) + { + float f = (f1 * this->sm.asi[0].p->ai[0] + + f2 * this->sm.asi[1].p->ai[0] + + f3 * this->sm.asi[2].p->ai[0]); + sum += f * v[k]; + } + *this->sm.pd = sum; + } + } + return sum; +} + +// { dg-final { scan-tree-dump "Replaced.*->ai\\\[0\\\]" "pre" } } +// { dg-final { cleanup-tree-dump "pre" } } diff --git a/gcc/testsuite/g++.dg/init/new2.C b/gcc/testsuite/g++.dg/init/new2.C new file mode 100644 index 000000000..8b207d0a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new2.C @@ -0,0 +1,17 @@ +// Origin: asharji@uwaterloo.ca + +// { dg-do compile } + +class bar { + public : + bar() { } + void * operator new ( __SIZE_TYPE__ , void * storage ) + { return (void *)1;} +}; + +class foo { + public: + void mem ( ) { + new ( 0 ) bar; + } +}; diff --git a/gcc/testsuite/g++.dg/init/new20.C b/gcc/testsuite/g++.dg/init/new20.C new file mode 100644 index 000000000..705c1be48 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new20.C @@ -0,0 +1,6 @@ +// PR c++/31743 +typedef int A[]; +A* p = new A; // { dg-error "invalid use of array with unspecified bounds" } +A* q = new (A); // { dg-error "invalid use of array with unspecified bounds" } + + diff --git a/gcc/testsuite/g++.dg/init/new21.C b/gcc/testsuite/g++.dg/init/new21.C new file mode 100644 index 000000000..5797ea981 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new21.C @@ -0,0 +1,10 @@ +// PR c++/32251 + +struct A { + A(); + void operator delete(void *, ...); +}; + +void foo () { + new A; // { dg-warning "deallocation" } +} diff --git a/gcc/testsuite/g++.dg/init/new22.C b/gcc/testsuite/g++.dg/init/new22.C new file mode 100644 index 000000000..2ce51ff28 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new22.C @@ -0,0 +1,3 @@ +// PR c++/29001 + +void* operator new (__SIZE_TYPE__) { return; } // { dg-error "with no value" } diff --git a/gcc/testsuite/g++.dg/init/new23.C b/gcc/testsuite/g++.dg/init/new23.C new file mode 100644 index 000000000..cedd898b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new23.C @@ -0,0 +1,20 @@ +// PR c++/33025 +// { dg-do run } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +inline void *operator new (size_t, void *p) throw () { return p; } +extern "C" void abort (); + +int +main() +{ + const unsigned num = 10; + unsigned *data = new unsigned[2 * num]; + unsigned *ptr = data; + for (unsigned i = 0; i < 2 * num; ++i) + (i % 2 == 0) ? new (ptr) unsigned (2) : new (ptr++) unsigned (1); + if (ptr - data != num) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new24.C b/gcc/testsuite/g++.dg/init/new24.C new file mode 100644 index 000000000..6f5613be7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new24.C @@ -0,0 +1,18 @@ +// PR c++/33025 +// { dg-do compile } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +inline void *operator new (size_t, void *p) throw () { return p; } +extern "C" void abort (); + +int +main() +{ + const unsigned num = 10; + unsigned *data = new unsigned[num]; + unsigned *ptr = new (data) unsigned (num); + static unsigned data2[10]; + unsigned *ptr2 = new (&data2[0]) unsigned (10); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new25.C b/gcc/testsuite/g++.dg/init/new25.C new file mode 100644 index 000000000..2d447f8f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new25.C @@ -0,0 +1,29 @@ +// PR c++/31988 +#include + +class C +{ +public: + void* operator new(std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" } + void* operator new[](std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" } + void* operator new(std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" } + void* operator new[](std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" } +}; + +class D +{ +public: + void* operator new(std::size_t, + const std::nothrow_t& = std::nothrow_t()) throw(); + void* operator new[](std::size_t, + const std::nothrow_t& = std::nothrow_t()) throw(); +}; + +class E +{ +public: + void* operator new(std::size_t = 0, + const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" } + void* operator new[](std::size_t = 0, + const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" } +}; diff --git a/gcc/testsuite/g++.dg/init/new26.C b/gcc/testsuite/g++.dg/init/new26.C new file mode 100644 index 000000000..541de3058 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new26.C @@ -0,0 +1,44 @@ +// PR c++/33407 +// { dg-do run } +// { dg-options "-O2 -fstrict-aliasing" } + +extern "C" void * malloc(__SIZE_TYPE__); +extern "C" void abort(void); + +void *p; +void __attribute__((noinline)) init(void) +{ + p = malloc(4); +} + +inline void *operator new(__SIZE_TYPE__) +{ + return p; +} + +inline void operator delete (void*) {} + +int * __attribute__((noinline)) doit(int n) +{ + float *q; + int *r; + + for (int i=0; ii[0] != 1 || t->i[1] != 2) + abort (); +} diff --git a/gcc/testsuite/g++.dg/init/new28.C b/gcc/testsuite/g++.dg/init/new28.C new file mode 100644 index 000000000..41a78be2a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new28.C @@ -0,0 +1,27 @@ +// PR c++/43951 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +class Foo +{ +public: + Foo () : xxx (1) {}; + const int xxx; +}; +Foo * +bar () +{ + return new Foo; +} + +int +main () +{ + Foo *p = bar (); + + if (p->xxx != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new29.C b/gcc/testsuite/g++.dg/init/new29.C new file mode 100644 index 000000000..1ca8ca06a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new29.C @@ -0,0 +1,33 @@ +// PR c++/43951 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +class Foo +{ +public: + Foo () : xxx (1) {}; + const int xxx; +}; + +struct Foo2 +{ + Foo foo; +}; + +Foo2 * +bar () +{ + return new Foo2; +} + +int +main () +{ + Foo2 *p = bar (); + + if (p->foo.xxx != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new3.C b/gcc/testsuite/g++.dg/init/new3.C new file mode 100644 index 000000000..d0eab73cf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new3.C @@ -0,0 +1,8 @@ +// Test that new-expressions at file scope work properly. + +struct A { static char* p; }; + +int i = 1; +char* A::p = new char[i]; + +void foo() {} diff --git a/gcc/testsuite/g++.dg/init/new30.C b/gcc/testsuite/g++.dg/init/new30.C new file mode 100644 index 000000000..24582d8fb --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new30.C @@ -0,0 +1,15 @@ +// PR c++/40975 + +struct data_type +{ + // constructor required to reproduce compiler bug + data_type() {} +}; + +struct ptr_type +{ + // array new as default argument required to reproduce compiler bug + ptr_type (data_type* ptr = new data_type[1]) { delete[] ptr; } +}; + +ptr_type obj; diff --git a/gcc/testsuite/g++.dg/init/new32.C b/gcc/testsuite/g++.dg/init/new32.C new file mode 100644 index 000000000..f82785749 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new32.C @@ -0,0 +1,16 @@ +// PR c++/48873 + +#include + +struct D { +private: + ~D(); +}; + +template +T& create(); + +void f() +{ + D* dp = new (((void*) 0)) D(create()); // # +} diff --git a/gcc/testsuite/g++.dg/init/new4.C b/gcc/testsuite/g++.dg/init/new4.C new file mode 100644 index 000000000..ab2fe3131 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new4.C @@ -0,0 +1 @@ +int *x = new int [2] (); diff --git a/gcc/testsuite/g++.dg/init/new5.C b/gcc/testsuite/g++.dg/init/new5.C new file mode 100644 index 000000000..0d99f93c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new5.C @@ -0,0 +1,18 @@ +// { dg-do run } + +#include + +void * operator new[](std::size_t, std::nothrow_t const &) throw() +{ return 0; } + +struct X { + struct Inner { ~Inner() {} }; + + X() { + Inner * ic = new (std::nothrow) Inner[1]; // SegFault here + } +}; + +int main() { + X table; +} diff --git a/gcc/testsuite/g++.dg/init/new6.C b/gcc/testsuite/g++.dg/init/new6.C new file mode 100644 index 000000000..ecbafd13e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new6.C @@ -0,0 +1,8 @@ +// { dg-options "-fkeep-inline-functions" } + +struct B1 { virtual ~B1(); }; +struct B2 { virtual ~B2(); }; +struct D : B1, B2 {}; +struct X : D { X (); }; + +X::X () { new int; } diff --git a/gcc/testsuite/g++.dg/init/new7.C b/gcc/testsuite/g++.dg/init/new7.C new file mode 100644 index 000000000..e07d22617 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new7.C @@ -0,0 +1,7 @@ +template + struct Foo + {}; + + template + void Foo::NON_EXISTENT(int* val = new int()) {} // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/init/new8.C b/gcc/testsuite/g++.dg/init/new8.C new file mode 100644 index 000000000..1fefc366b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new8.C @@ -0,0 +1,17 @@ +typedef __SIZE_TYPE__ size_t; + +enum Refcount_Type { + NO_REFCOUNT +}; + +struct d0_Unknown_Object +{ + void* operator new (size_t, size_t, Refcount_Type type); + void operator delete (void*, size_t, Refcount_Type); + d0_Unknown_Object (); +}; + +void make () +{ + new (10, NO_REFCOUNT) d0_Unknown_Object; +} diff --git a/gcc/testsuite/g++.dg/init/new9.C b/gcc/testsuite/g++.dg/init/new9.C new file mode 100644 index 000000000..6729d76fd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new9.C @@ -0,0 +1,22 @@ +// PR 12337 + +class A {}; + +template +class X : public A { +public: + X(T&); +}; + +class B { +public: + bool foo(A*); + template + bool foo(T& t) { return foo(new X(t)); } +}; + +int main() +{ + B x, y; + x.foo(y); +} diff --git a/gcc/testsuite/g++.dg/init/null1.C b/gcc/testsuite/g++.dg/init/null1.C new file mode 100644 index 000000000..eff3f6109 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/null1.C @@ -0,0 +1,6 @@ +// PR c++/16489 + +const int NULL = 0; +int main() { + double* p = NULL; +} diff --git a/gcc/testsuite/g++.dg/init/placement1.C b/gcc/testsuite/g++.dg/init/placement1.C new file mode 100644 index 000000000..382fae8ed --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement1.C @@ -0,0 +1,10 @@ +// PR c++/11266 +// We were expanding the same TARGET_EXPR twice, for placement new and +// delete. + +void* operator new (__SIZE_TYPE__, void*) throw(); +void operator delete (void*, void*) throw(); + +struct A { A(); }; + +void foo() { new(new A)A; } diff --git a/gcc/testsuite/g++.dg/init/placement2.C b/gcc/testsuite/g++.dg/init/placement2.C new file mode 100644 index 000000000..7a9d6d082 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement2.C @@ -0,0 +1,22 @@ +// Bug: We were calling f() twice, for both the placement new and placement +// delete calls. + +// { dg-do run } + +void* operator new (__SIZE_TYPE__ sz, void*) { return operator new (sz); } +void operator delete (void* p, void*) { operator delete (p); } + +struct A { A() { throw 1; } }; + +int c; +void *f() { ++c; return 0; } + +int main() +{ + try + { + new (f()) A; + } + catch (...) {} + return c != 1; +} diff --git a/gcc/testsuite/g++.dg/init/placement3.C b/gcc/testsuite/g++.dg/init/placement3.C new file mode 100644 index 000000000..919e2a816 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement3.C @@ -0,0 +1,30 @@ +typedef __SIZE_TYPE__ size_t; +extern "C" void *malloc (size_t); + +int i; + +struct S { + S(int) { + throw 3; + } + + void *operator new(size_t s, int) { + ++i; + return malloc (s); + } + + void operator delete(void *, int) { + --i; + } + + void operator delete(void *, int, int) ; +}; + +int main () { + try { + new (7) S (12); + } catch (int) { + if (i) + return 1; + } +} diff --git a/gcc/testsuite/g++.dg/init/placement4.C b/gcc/testsuite/g++.dg/init/placement4.C new file mode 100644 index 000000000..9c61eca2b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement4.C @@ -0,0 +1,32 @@ +// PR c++/34158 + +typedef __SIZE_TYPE__ size_t; +extern "C" void* malloc (size_t); +extern "C" void free (void *); + +template class undef; + +struct A { + A() { throw 1; } +}; + +template class Pool { }; + +void *operator new(size_t size,Pool& pool) +{ + return malloc(size); +} + +template +void operator delete(void *p,Pool& pool) +{ + undef t; // { dg-error "incomplete" } + free(p); +} + +int main () +{ + Pool pool; + new (pool) A(); // { dg-message "instantiated" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/placement5.C b/gcc/testsuite/g++.dg/init/placement5.C new file mode 100644 index 000000000..1d540daca --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement5.C @@ -0,0 +1,32 @@ +// 5.3.4/19: If the lookup finds the two-parameter form of a usual +// deallocation function (3.7.4.2) and that function, considered as a +// placement deallocation function, would have been selected as a match for +// the allocation function, the program is ill-formed. + +// But we should only complain about using op delete (void *, size_t) for +// placement delete if it would also be selected for normal delete, not if +// there's also an op delete (void *). + +typedef __SIZE_TYPE__ size_t; + +struct A +{ + A(); + void* operator new (size_t, size_t); + void operator delete (void *, size_t); // { dg-error "non-placement" } +}; + +struct B +{ + B(); + void * operator new (size_t); + void * operator new (size_t, size_t); + void operator delete (void *); + void operator delete (void *, size_t); +}; + +int main() +{ + A* ap = new (24) A; // { dg-error "placement delete" } + B* bp = new (24) B; +} diff --git a/gcc/testsuite/g++.dg/init/pm1.C b/gcc/testsuite/g++.dg/init/pm1.C new file mode 100644 index 000000000..c0aed2410 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm1.C @@ -0,0 +1,88 @@ +// { dg-do run } + +// Copyright 2002 Free Software Foundation +// Contributed by Jason Merrill and Alexandre Oliva + +// Test zero-initialization of pointers to data members. Their NULL +// value is represented with -1, not 0. + +#include + +struct A +{ + int i; +}; + +int A::* gp; + +typedef int A::* iApm; + +iApm gp_zero = 0; +iApm gp_dflt = iApm(); +iApm gp_cast = (iApm)0; +iApm gp_func = iApm(0); +iApm gp_stat = static_cast(0); + +struct AD : A {}; + +int AD::* gp_impl = gp_dflt; +int AD::* gp_down = static_cast(gp_stat); + +int A::* ga[2]; + +// Test use in a simple struct. +struct B +{ + int A::* mp; +}; + +B gb; + +struct D; +struct C; +extern D gd; +extern C gc; + +// Test that in a class with a constructor, the pointer to member is +// zero-initialized until the constructor is run. +struct C +{ + int A::* mp; + inline C (); +}; + +int fail; +struct D +{ + int count; + inline D (); +}; + +C::C() : mp (&A::i) { gd.count++; } + +D::D() : count (0) +{ + if (gc.mp != 0) + abort (); +} + +// The D must come first for this to work. +D gd; +C gc; + +int main() +{ + static int A::* slp; + static int A::* sla[2]; + static B slb; + + if (gp != 0 || slp != 0 + || gp_zero != 0 || gp_dflt != 0 || gp_cast != 0 + || gp_func != 0 || gp_stat != 0 + || gp_impl != 0 || gp_down != 0) + abort (); + if (ga[1] != 0 || sla[1] != 0) + abort (); + if (gb.mp != 0 || slb.mp != 0) + abort (); +} diff --git a/gcc/testsuite/g++.dg/init/pm2.C b/gcc/testsuite/g++.dg/init/pm2.C new file mode 100644 index 000000000..35b9b32fe --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm2.C @@ -0,0 +1,7 @@ +struct S { + S (); + int S::* sp; + int i; +}; + +S s[2] = {}; diff --git a/gcc/testsuite/g++.dg/init/pm3.C b/gcc/testsuite/g++.dg/init/pm3.C new file mode 100644 index 000000000..980790db3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm3.C @@ -0,0 +1,10 @@ +// PR c++/12218 +// { dg-do run } + +struct C { int i, j; }; +typedef int C::*mPtr; +extern const mPtr should_be_0 = &C::i; +extern const mPtr should_be_4 = &C::j; + +int main () { +} diff --git a/gcc/testsuite/g++.dg/init/pmf1.C b/gcc/testsuite/g++.dg/init/pmf1.C new file mode 100644 index 000000000..93c67bdd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pmf1.C @@ -0,0 +1,17 @@ +// PR c++/14089 +// { dg-do compile } +// +// C++ front end generated assignment between types that were not +// compatible in any sense visible to the optimizers. + +struct pair { + typedef void (pair::*fp)(); + int first; + pair::fp second; + pair(const int& a, const pair::fp& b) : first(a), second(b) {} + void f(const int& a, const pair::fp& b) { first = a; second = b; } +}; + +void op() { + pair(5, pair::fp()); +} diff --git a/gcc/testsuite/g++.dg/init/pr25811-2.C b/gcc/testsuite/g++.dg/init/pr25811-2.C new file mode 100644 index 000000000..3a36dd49c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811-2.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options -fpermissive } + +struct A +{ + int const i; // { dg-message "should be initialized" } +}; + +struct B +{ + int& r; // { dg-message "should be initialized" } +}; + +struct C +{ + int const i : 1; // { dg-message "should be initialized" } +}; + +void f() +{ + new A; // { dg-warning "uninitialized" } + new B; // { dg-warning "uninitialized" } + new C; // { dg-warning "uninitialized" } + C c; // { dg-warning "uninitialized" } + A a[1]; // { dg-warning "uninitialized" } +} diff --git a/gcc/testsuite/g++.dg/init/pr25811-3.C b/gcc/testsuite/g++.dg/init/pr25811-3.C new file mode 100644 index 000000000..631da5b4c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811-3.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +struct A { int const i; }; +struct B { int& i; }; +struct C { int i; }; + +template< class T > +class is_constructible_via_new_without_initializer +{ + template class size {}; + + typedef char yes_type; + struct no_type { char data[2]; }; + + template + static yes_type sfinae (size< sizeof (new U) >*); + + template + static no_type sfinae (...); + +public: + static const bool value = sizeof (sfinae(0)) == sizeof (yes_type); +}; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +STATIC_ASSERT (!is_constructible_via_new_without_initializer::value); +STATIC_ASSERT (!is_constructible_via_new_without_initializer::value); +STATIC_ASSERT (is_constructible_via_new_without_initializer::value); + diff --git a/gcc/testsuite/g++.dg/init/pr25811-4.C b/gcc/testsuite/g++.dg/init/pr25811-4.C new file mode 100644 index 000000000..abfb3d9f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811-4.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options "-fpermissive" } + +struct A { int const i; }; +struct B { int& i; }; +struct C { int i; }; + +template< class T > +class is_constructible_via_new_without_initializer +{ + template class size {}; + + typedef char yes_type; + struct no_type { char data[2]; }; + + template + static yes_type sfinae (size< sizeof (new U) >*); + + template + static no_type sfinae (...); + +public: + static const bool value = sizeof (sfinae(0)) == sizeof (yes_type); +}; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +STATIC_ASSERT (!is_constructible_via_new_without_initializer::value); +STATIC_ASSERT (!is_constructible_via_new_without_initializer::value); +STATIC_ASSERT (is_constructible_via_new_without_initializer::value); diff --git a/gcc/testsuite/g++.dg/init/pr25811.C b/gcc/testsuite/g++.dg/init/pr25811.C new file mode 100644 index 000000000..c906a9bbd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811.C @@ -0,0 +1,195 @@ +// PR c++/25811 +// { dg-do compile } + +struct A1 +{ + int const j; // { dg-message "should be initialized" } +}; + +struct A2 +{ + int const volatile i; // { dg-message "should be initialized" } +}; + +struct A3 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct A4 +{ + int const& ref; // { dg-message "should be initialized" } +}; + +struct A5 +{ + int& ref; // { dg-message "should be initialized" } + int const i; // { dg-message "should be initialized" } +}; + +template struct S1 +{ + T const i; // { dg-message "should be initialized" } +}; + +template struct S2 +{ + T const volatile i; // { dg-message "should be initialized" } +}; + +template struct S3 +{ + T& ref; // { dg-message "should be initialized" } +}; + +template struct S4 +{ + T const i; // { dg-message "should be initialized" } + T& ref; // { dg-message "should be initialized" } +}; + +struct X +{ + X () : c (0), r (c) {} + int const c; + int const& r; +}; + +struct Y11 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Y1 +{ + Y11 a[1]; +}; + +struct Y22 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Y2 +{ + Y22 a[1]; +}; + +struct Z1 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z2 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z3 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z4 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z5 +{ + int i; +}; + +struct Z +{ + Z1 z1; + Z2 z2; + Z3 z3; + Z4 z4; + Z5 z5; +}; + +union U +{ + int const i; // { dg-message "should be initialized" } +}; + +void f1 () +{ + new A1; // { dg-error "uninitialized const member" } +} + +void f2 () +{ + new A2; // { dg-error "uninitialized const member" } +} + +void f3 () +{ + new A3; // { dg-error "uninitialized reference member" } +} + +void f4 () +{ + new A4; // { dg-error "uninitialized reference member" } +} + +void f5 () +{ + new A5; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f6 () +{ + new S1; // { dg-error "uninitialized const member" } +} + +void f7 () +{ + new S2; // { dg-error "uninitialized const member" } +} + +void f8 () +{ + new S3; // { dg-error "uninitialized reference member" } +} + +void f9 () +{ + new S4; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f10 () +{ + new X; +} + +void f11 () +{ + new A1[1]; // { dg-error "uninitialized const member" } +} + +void f12 () +{ + new A3[1]; // { dg-error "uninitialized reference member" } +} + +void f13 () +{ + new Y1; // { dg-error "uninitialized const member" } +} + +void f14 () +{ + new Y2; // { dg-error "uninitialized reference member" } +} + +void f15 () +{ + new Z; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f16 () +{ + new U; // { dg-error "uninitialized const member" } +} diff --git a/gcc/testsuite/g++.dg/init/pr29043.C b/gcc/testsuite/g++.dg/init/pr29043.C new file mode 100644 index 000000000..6ed31b5d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr29043.C @@ -0,0 +1,52 @@ +// PR c++/29043 +// { dg-do compile } + +struct S +{ + int const i; // { dg-message "should be initialized" } +}; + +class C +{ +public: + C() {} // { dg-error "uninitialized const member" } + S s; +}; + +struct S2 +{ + int& ref; // { dg-message "should be initialized" } +}; + +class C2 +{ +public: + C2() {} // { dg-error "uninitialized reference member" } + S2 s; +}; + +class C3 +{ + C3() { } + struct s { + const int i; + }; +}; + +struct S4 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct C4 +{ + C4() {} // { dg-error "uninitialized const member" } + S4 s4[ 1 ]; +}; + +struct C5 +{ + C5() {} // { dg-message "uninitialized" } + int const iit[ 1 ]; +}; + diff --git a/gcc/testsuite/g++.dg/init/pr29571.C b/gcc/testsuite/g++.dg/init/pr29571.C new file mode 100644 index 000000000..9e8e6093e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr29571.C @@ -0,0 +1,8 @@ +// PR c++/29571 + +struct A +{ + static const int i = 0/0 + ""; // { dg-warning "division by zero" } + // { dg-error "field initializer is not constant" "" { target *-*-* } 5 } + static const int j = int(i); +}; diff --git a/gcc/testsuite/g++.dg/init/pr42556.C b/gcc/testsuite/g++.dg/init/pr42556.C new file mode 100644 index 000000000..27370af79 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr42556.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-fdump-tree-gimple" } + +void foo (int a, int b, int c, int d) +{ + int v[4] = {a, b, c, d}; +} + +// { dg-final { scan-tree-dump-not "v = {}" "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/g++.dg/init/pr42844.C b/gcc/testsuite/g++.dg/init/pr42844.C new file mode 100644 index 000000000..299a30a91 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr42844.C @@ -0,0 +1,56 @@ +// PR c++/42844 +// { dg-do compile } + +struct A +{ + A(){} +}; + +struct B : A { int i; }; // { dg-message "user-provided default constructor" } + +struct C : A { int i; }; // { dg-message "user-provided default constructor" } + +struct D : B { D() {} }; + +struct E { int i; }; // { dg-message "user-provided default constructor" } + +template +struct F : A { T t; }; // { dg-message "user-provided default constructor" } + +template +struct G { T t; }; // { dg-message "user-provided default constructor" } + +void f () +{ + B const b; // { dg-error "uninitialized const" } + extern B const bext; + + C const c[ 1 ]; // { dg-error "uninitialized const" } + extern C const cext[ 1 ]; + + D const d; + extern D const dext; + + E const e; // { dg-error "uninitialized const" } + extern E const eext; + + F const f; // { dg-error "uninitialized const" } + extern F const fext; + + G const g; // { dg-error "uninitialized const" } + extern G const gext; +} + +struct H { int i; }; // { dg-message "user-provided default constructor" } + +struct I : A { int i; }; // { dg-message "user-provided default constructor" } + +template +void g () +{ + T const t; // { dg-error "uninitialized const" } + extern T const text; +} + +template void g (); +template void g (); diff --git a/gcc/testsuite/g++.dg/init/pr43719.C b/gcc/testsuite/g++.dg/init/pr43719.C new file mode 100644 index 000000000..d3487c94a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr43719.C @@ -0,0 +1,197 @@ +// PR c++/43719 +// { dg-do compile } + +struct A1 +{ + int const j; // { dg-message "should be initialized" } +}; + +struct A2 +{ + int const volatile i; // { dg-message "should be initialized" } +}; + +struct A3 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct A4 +{ + int const& ref; // { dg-message "should be initialized" } +}; + +struct A5 +{ + int& ref; // { dg-message "should be initialized" } + int const i; // { dg-message "should be initialized" } +}; + +template struct S1 +{ + T const i; // { dg-message "should be initialized" } +}; + +template struct S2 +{ + T const volatile i; // { dg-message "should be initialized" } +}; + +template struct S3 +{ + T& ref; // { dg-message "should be initialized" } +}; + +template struct S4 +{ + T const i; // { dg-message "should be initialized" } + T& ref; // { dg-message "should be initialized" } +}; + +struct X +{ + X () : c (0), r (c) {} + int const c; + int const& r; +}; + +struct Y11 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Y1 +{ + Y11 a[1]; +}; + +struct Y22 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Y2 +{ + Y22 a[1]; +}; + +struct Z1 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z2 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z3 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z4 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z5 +{ + int i; +}; + +struct Z +{ + Z1 z1; + Z2 z2; + Z3 z3; + Z4 z4; + Z5 z5; +}; + +union U +{ + int const i; // { dg-message "should be initialized" } +}; + + +void f1 () +{ + A1 a1; // { dg-error "uninitialized const member" } +} + +void f2 () +{ + A2 a2; // { dg-error "uninitialized const member" } +} + +void f3 () +{ + A3 a3; // { dg-error "uninitialized reference member" } +} + +void f4 () +{ + A4 a4; // { dg-error "uninitialized reference member" } +} + +void f5 () +{ + A5 a5; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f6 () +{ + S1 s; // { dg-error "uninitialized const member" } +} + +void f7 () +{ + S2 s; // { dg-error "uninitialized const member" } +} + +void f8 () +{ + S3 s; // { dg-error "uninitialized reference member" } +} + +void f9 () +{ + S4 s; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f10 () +{ + X x; +} + +void f11 () +{ + A1 a[ 1 ]; // { dg-error "uninitialized const member" } +} + +void f12 () +{ + A3 a[ 1 ]; // { dg-error "uninitialized reference member" } +} + +void f13 () +{ + Y1 y1; // { dg-error "uninitialized const member" } +} + +void f14 () +{ + Y2 y2; // { dg-error "uninitialized reference member" } +} + +void f15 () +{ + Z z; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f16 () +{ + U u; // { dg-error "uninitialized const member" } +} + diff --git a/gcc/testsuite/g++.dg/init/pr43890.C b/gcc/testsuite/g++.dg/init/pr43890.C new file mode 100644 index 000000000..1b2807d0d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr43890.C @@ -0,0 +1,39 @@ +// PR c++/43890 +// { dg-do compile } + +class Outer +{ + public: + Outer() + : i(*this) + { + } + + class Inner + { + public: + Inner(Outer& o) + : o(o) + , i(0) + { + } + + private: + Outer& o; + int const i; + }; + + private: + Inner i; +}; + +class A { + Outer o; +}; + +int main() +{ + A *a = new A; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/pr44086.C b/gcc/testsuite/g++.dg/init/pr44086.C new file mode 100644 index 000000000..e3304f4a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr44086.C @@ -0,0 +1,15 @@ +// PR c++/44086 +// { dg-do compile } + +struct A +{ + int const i : 2; // { dg-message "should be initialized" } +}; + +void f() +{ + A a; // { dg-error "uninitialized const" } + new A; // { dg-error "uninitialized const" } + A(); + new A(); +} diff --git a/gcc/testsuite/g++.dg/init/pr48859.C b/gcc/testsuite/g++.dg/init/pr48859.C new file mode 100644 index 000000000..8ef5c2ee4 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr48859.C @@ -0,0 +1,14 @@ +// PR c++/48859 +// { dg-do compile } + +struct HasConstructor { + HasConstructor() {} +}; + +class ConstMember { + const HasConstructor empty_; +}; + +void foo() { + new ConstMember; +} diff --git a/gcc/testsuite/g++.dg/init/ptrfn1.C b/gcc/testsuite/g++.dg/init/ptrfn1.C new file mode 100644 index 000000000..0cbabbf80 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrfn1.C @@ -0,0 +1,12 @@ +// PR c++/29016 +// { dg-options "-O2" } + +class A; +class B +{ + typedef void (*C[5]) (A *); + static C D; + static void E (A*) {} +}; +B::C B::D={E}; + diff --git a/gcc/testsuite/g++.dg/init/ptrfn2.C b/gcc/testsuite/g++.dg/init/ptrfn2.C new file mode 100644 index 000000000..0ca922b9c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrfn2.C @@ -0,0 +1,14 @@ +// { dg-options "" } +// { dg-do compile } +// C++/30221 +// We would ICE while trying to reshape the pointer to +// member function element which is not needed. + + +class abstract {}; +typedef void (abstract::*fptr1) (short & s ) const; +struct s {}; +s array[] = +{ + (fptr1)0 +};// { dg-error "" } diff --git a/gcc/testsuite/g++.dg/init/ptrfn3.C b/gcc/testsuite/g++.dg/init/ptrfn3.C new file mode 100644 index 000000000..960085063 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrfn3.C @@ -0,0 +1,14 @@ +// { dg-options "" } +// { dg-do compile } +// C++/30221 +// We would ICE while trying to reshape the pointer to +// member function element which is not needed. + + +class abstract {}; +typedef void (abstract::*fptr1) (short & s ) const; +struct s {fptr1 f;}; +s array[] = +{ + (fptr1)0 +}; diff --git a/gcc/testsuite/g++.dg/init/ptrmem1.C b/gcc/testsuite/g++.dg/init/ptrmem1.C new file mode 100644 index 000000000..6f1604faf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem1.C @@ -0,0 +1,7 @@ +// PR c++/16853 + +struct A {}; +struct B {}; + +int B::* b; +int A::* a = b; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/init/ptrmem2.C b/gcc/testsuite/g++.dg/init/ptrmem2.C new file mode 100644 index 000000000..54b69215b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem2.C @@ -0,0 +1,12 @@ +// PR c++/19916 +// { dg-do run } + +struct S { + char k; +}; + +char const volatile S::* const p01 = &S::k; +int main(void) +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/ptrmem3.C b/gcc/testsuite/g++.dg/init/ptrmem3.C new file mode 100644 index 000000000..95b60379b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem3.C @@ -0,0 +1,8 @@ +// PR c++/28148 + +struct foo { +public: + virtual int bar(int); +}; + +void (foo::*__Virtual__foo__Var1)() = (void (foo::*)())(&foo::bar); diff --git a/gcc/testsuite/g++.dg/init/ptrmem4.C b/gcc/testsuite/g++.dg/init/ptrmem4.C new file mode 100644 index 000000000..44ab8cf65 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem4.C @@ -0,0 +1,13 @@ +// PR c++/32245 +// { dg-do run } + +struct foo { + int mem1; + int foo::* mem2; +}; + +int main () { + foo x = { 0 } ; + if (x.mem2 != foo().mem2) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/ref1.C b/gcc/testsuite/g++.dg/init/ref1.C new file mode 100644 index 000000000..12caff2d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref1.C @@ -0,0 +1,5 @@ +void f(void) +{ + short x = 0; + const int &y = x; +} diff --git a/gcc/testsuite/g++.dg/init/ref10.C b/gcc/testsuite/g++.dg/init/ref10.C new file mode 100644 index 000000000..7a280dd41 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref10.C @@ -0,0 +1,14 @@ +// PR c++/13478 + +struct A {}; +struct B : protected A { + B() {} + B(const A& ) {} +private: + B(const B& ) {} +}; + +void foo(const A* ap) +{ + const B& br = *ap; +} diff --git a/gcc/testsuite/g++.dg/init/ref11.C b/gcc/testsuite/g++.dg/init/ref11.C new file mode 100644 index 000000000..b283e3a69 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref11.C @@ -0,0 +1,13 @@ +// PR c++/14230 + +struct A { + A (); + A (const A&); + A& operator= (const A&); +}; + +struct D { + A a; +}; + +const A& z = D().a; diff --git a/gcc/testsuite/g++.dg/init/ref12.C b/gcc/testsuite/g++.dg/init/ref12.C new file mode 100644 index 000000000..4430e174b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref12.C @@ -0,0 +1,30 @@ +// PR c++/17435 +// { dg-do run } + +extern "C" void abort (); + +bool ok; + +struct A +{ + void func() const + { + ok = 1; + } + + ~A() + { + if (!ok) + abort (); + } +}; + +struct B : public A +{ +}; + +int main() +{ + A const& r1 = B(); + r1.func(); +} diff --git a/gcc/testsuite/g++.dg/init/ref13.C b/gcc/testsuite/g++.dg/init/ref13.C new file mode 100644 index 000000000..6be57aa2e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref13.C @@ -0,0 +1,7 @@ +// PR c++/28338 + +void foo() +{ + { static const int& i = 0; } + { static const int& i = 0; } +} diff --git a/gcc/testsuite/g++.dg/init/ref14.C b/gcc/testsuite/g++.dg/init/ref14.C new file mode 100644 index 000000000..212e6e95d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref14.C @@ -0,0 +1,11 @@ +// PR c++/33459 + +union A +{ + int &i; // { dg-error "may not have reference type" } +}; + +void foo() +{ + A(); +} diff --git a/gcc/testsuite/g++.dg/init/ref15.C b/gcc/testsuite/g++.dg/init/ref15.C new file mode 100644 index 000000000..bc9c01dc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref15.C @@ -0,0 +1,34 @@ +// PR c++/20416. We correctly constructed the temporary S in foo(), +// but incorrectly destroyed it every time foo() was called. +// When using a wrapped target, there is no way to override the exit +// code after returning from main. +// { dg-do run { target unwrapped } } +extern "C" void abort (void); +extern "C" void _exit (int); + +int c, exiting; +struct S { + S() { ++c; } + S(const S &) { ++c; } + ~S() + { + if (!exiting) abort (); + _exit (0); + } +}; +void +foo (void) +{ + static const S &s = S(); +} +int main () +{ + if (c != 0) + abort (); + foo (); + foo (); + if (c != 1) + abort (); + exiting = 1; + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/ref16.C b/gcc/testsuite/g++.dg/init/ref16.C new file mode 100644 index 000000000..2d56395cb --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref16.C @@ -0,0 +1,23 @@ +// PR c++/35548 +// { dg-do run } + +int c; +struct A +{ + A() { ++c; } + A(const A&) { ++c; } + ~A() { --c; } +}; + +A f() +{ + return A(); +} + +int i; +const A* ap; +int main() +{ + const A& ar = i ? *ap : f(); + return (c == 0); +} diff --git a/gcc/testsuite/g++.dg/init/ref17.C b/gcc/testsuite/g++.dg/init/ref17.C new file mode 100644 index 000000000..2c8c22b8d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref17.C @@ -0,0 +1,23 @@ +// PR c++/35650 +// { dg-do compile } + +void f1 (); + +namespace N +{ + using::f1; + void f2 (); + void f3 (); +} + +using N::f3; + +void +test () +{ + void (&a) () = f1; + void (&b) () = N::f1; + void (&c) () = N::f2; + void (&d) () = f3; + void (&e) () = ::f3; +} diff --git a/gcc/testsuite/g++.dg/init/ref19.C b/gcc/testsuite/g++.dg/init/ref19.C new file mode 100644 index 000000000..ed78c939b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref19.C @@ -0,0 +1,17 @@ +// PR c++/49528 +// { dg-do run } + +int d; + +struct A +{ + int i; + ~A() { ++d; }; +}; + +int main() +{ + const int &r = A().i; + if (d != 1) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/ref2.C b/gcc/testsuite/g++.dg/init/ref2.C new file mode 100644 index 000000000..231ea047f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref2.C @@ -0,0 +1,10 @@ +struct Base { + Base(); + Base(const Base &); + Base & operator = (const Base &); +}; + +struct Derived : public Base {}; + +Derived derived(); +const Base &b = derived(); diff --git a/gcc/testsuite/g++.dg/init/ref20.C b/gcc/testsuite/g++.dg/init/ref20.C new file mode 100644 index 000000000..b64cb57e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref20.C @@ -0,0 +1,8 @@ +// PR c++/50787 +// { dg-do run } + +int main() { + const int Ci = 0; + const int &rCi = Ci; + if (!(&Ci == &rCi)) __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/init/ref3.C b/gcc/testsuite/g++.dg/init/ref3.C new file mode 100644 index 000000000..776f2d0c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref3.C @@ -0,0 +1,12 @@ +struct Base { }; +struct Derived : public Base { }; +struct Choose { + operator Base&(); + operator Derived&(); +}; + +void f() +{ + Choose c; + Base& ref = c; +} diff --git a/gcc/testsuite/g++.dg/init/ref4.C b/gcc/testsuite/g++.dg/init/ref4.C new file mode 100644 index 000000000..6b65d9925 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref4.C @@ -0,0 +1,18 @@ +// { dg-do run } + +int c; + +struct Base { + Base() {} + Base(const Base &) { ++c; } + Base & operator = (const Base &); +}; + +struct Derived : public Base {}; + +const Base &b = Derived(); + +int main() +{ + return c; // No copies should be required. +} diff --git a/gcc/testsuite/g++.dg/init/ref5.C b/gcc/testsuite/g++.dg/init/ref5.C new file mode 100644 index 000000000..ad1c30c36 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref5.C @@ -0,0 +1,12 @@ +struct A { }; +struct B : public A { }; +struct X { + operator B(); +}; +X x; + +int main() +{ + const A& r = x; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/ref6.C b/gcc/testsuite/g++.dg/init/ref6.C new file mode 100644 index 000000000..50a963603 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref6.C @@ -0,0 +1,12 @@ +struct B { + void g() { } +}; + +struct A { + void f() { + B &b = b; + b.g(); + } +}; + +int main(void) { } diff --git a/gcc/testsuite/g++.dg/init/ref7.C b/gcc/testsuite/g++.dg/init/ref7.C new file mode 100644 index 000000000..0832069e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref7.C @@ -0,0 +1,9 @@ +class hop +{ +public: + hop operator* () const; +}; +int main(void) +{ + const hop &x = *x; +} diff --git a/gcc/testsuite/g++.dg/init/ref8.C b/gcc/testsuite/g++.dg/init/ref8.C new file mode 100644 index 000000000..406cc1040 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref8.C @@ -0,0 +1,10 @@ +struct A { + A operator=(const A&); +}; + +A operator*(A, A); + +A& operator+=(A& a, const A& b) +{ + return a = a * b; // { dg-error "non-const reference" } +} diff --git a/gcc/testsuite/g++.dg/init/ref9.C b/gcc/testsuite/g++.dg/init/ref9.C new file mode 100644 index 000000000..127b7d8e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref9.C @@ -0,0 +1,36 @@ +// { dg-do run } + +struct ex; +struct basic { + int refcount; + ex eval() const; + basic() : refcount(0) {} +}; + +struct ex { + basic *bp; + ex() : bp(0) { } + ex(const basic &); + virtual ~ex(); + void construct_from_basic(const basic &); +}; + +ex basic::eval() const { + throw 1; +} + +inline ex::ex(const basic &b) { construct_from_basic (b); } +inline ex::~ex() { if (--bp->refcount == 0) delete bp; } +void ex::construct_from_basic(const basic &b) { + const ex & tmpex = b.eval(); + bp = tmpex.bp; + bp->refcount++; +} + +ex pow() { return basic(); } + +int main() +{ + try { pow (); } catch (int) {} + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/reference1.C b/gcc/testsuite/g++.dg/init/reference1.C new file mode 100644 index 000000000..7ce5f90fb --- /dev/null +++ b/gcc/testsuite/g++.dg/init/reference1.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// This code used to be accepted but it is invalid as there is no +// value initialization of a reference type. +// PR c++/36695 + +int main() +{ + typedef int& T; + T a = T(); // { dg-error "value-initialization of reference" } +} + diff --git a/gcc/testsuite/g++.dg/init/reference2.C b/gcc/testsuite/g++.dg/init/reference2.C new file mode 100644 index 000000000..42f537426 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/reference2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// This code used to be accepted but it is invalid as there is no +// value initialization of a reference type. +// PR c++/36695 + +// We should we able to diagnostic this without instantiating the template +template +int f() +{ + typedef int& T; + T a = T(); // { dg-error "value-initialization of reference" } +} + diff --git a/gcc/testsuite/g++.dg/init/reference3.C b/gcc/testsuite/g++.dg/init/reference3.C new file mode 100644 index 000000000..344e94e10 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/reference3.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// This code used to be accepted but it is invalid as there is no +// value initialization of a reference type. +// PR c++/36695 + +template +T f() +{ + T a = T(); // { dg-error "value-initialization of reference" } +} + +int &a = f(); // { dg-message "instantiated from here" } + diff --git a/gcc/testsuite/g++.dg/init/save1.C b/gcc/testsuite/g++.dg/init/save1.C new file mode 100644 index 000000000..2358eb50c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/save1.C @@ -0,0 +1,20 @@ +// PR c++/8748 +// We were wrapping the ARRAY_REF in a SAVE_EXPR, causing us to try to make a bitwise +// copy of b[0]. + +struct A +{ + int i; +}; + +struct B : A +{ + virtual ~B(); +}; + +struct C +{ + B b[1]; +}; + +void foo() { C().b[0].i; } diff --git a/gcc/testsuite/g++.dg/init/self1.C b/gcc/testsuite/g++.dg/init/self1.C new file mode 100644 index 000000000..dd37c8e60 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/self1.C @@ -0,0 +1,19 @@ +// PR c++/29106 +// { dg-do run } + +int i; + +void f(__SIZE_TYPE__) { + i = 3; +} + + +int main() +{ + int* const savepos = sizeof(*savepos) ? 0 : 0; + + f (sizeof (*savepos)); + + if (i != 3) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/static-init1.C b/gcc/testsuite/g++.dg/init/static-init1.C new file mode 100644 index 000000000..298d17140 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static-init1.C @@ -0,0 +1,5 @@ +// Related to the patch for 38880. +// Make sure we don't think we can initialize a at compile time. + +char c; +short a[] = { (short)((__PTRDIFF_TYPE__)&c + (__PTRDIFF_TYPE__)&c) }; diff --git a/gcc/testsuite/g++.dg/init/static-init2.C b/gcc/testsuite/g++.dg/init/static-init2.C new file mode 100644 index 000000000..34bf2b238 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static-init2.C @@ -0,0 +1,3 @@ +// PR c++/36912 +// { dg-options -frounding-math } +const double c = .1, d = c+1; diff --git a/gcc/testsuite/g++.dg/init/static1.C b/gcc/testsuite/g++.dg/init/static1.C new file mode 100644 index 000000000..7609215dd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static1.C @@ -0,0 +1,4 @@ +struct A { + static const int size = BOGUS; // { dg-error "" } +}; +const int A::size; diff --git a/gcc/testsuite/g++.dg/init/static2.C b/gcc/testsuite/g++.dg/init/static2.C new file mode 100644 index 000000000..b0344f480 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static2.C @@ -0,0 +1,25 @@ +// PR 14804 +// { dg-do run } + +struct A { + virtual void foo() = 0; +}; + +struct B : public A { + virtual void bar() = 0; +}; + +typedef void (A::*mfptr)(); + +struct D { + mfptr p; +}; + +static const D ds[] = { + { reinterpret_cast(&B::bar) }, +}; + +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/static3.C b/gcc/testsuite/g++.dg/init/static3.C new file mode 100644 index 000000000..8fac85fbc --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static3.C @@ -0,0 +1,26 @@ +// { dg-do run } + +struct T +{ + static void (*handler)(); + static void func() {} +}; + +bool fail; + +struct S { + S() { + if (T::handler != T::func) + fail = true; + } +}; + +static S s; + +void (*T::handler)() = func; + +int main() +{ + if (fail) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/string1.C b/gcc/testsuite/g++.dg/init/string1.C new file mode 100644 index 000000000..597b8619e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/string1.C @@ -0,0 +1,8 @@ +extern void f (char*); + +extern const char * const target = "foo"; + +void g () +{ + f (target); // { dg-error "conversion" } +} diff --git a/gcc/testsuite/g++.dg/init/struct1.C b/gcc/testsuite/g++.dg/init/struct1.C new file mode 100644 index 000000000..e23faef50 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/struct1.C @@ -0,0 +1,6 @@ +struct bug { + const char *name; + __SIZE_TYPE__ type; +}; + +struct bug s = { 0, (__SIZE_TYPE__) &s | 1 }; diff --git a/gcc/testsuite/g++.dg/init/struct2.C b/gcc/testsuite/g++.dg/init/struct2.C new file mode 100644 index 000000000..85aacc6fa --- /dev/null +++ b/gcc/testsuite/g++.dg/init/struct2.C @@ -0,0 +1,22 @@ +/* PR c++/23180. */ +/* Initialize a local structure with an expression that attempts to use + pointer arithmetic to calculate another structure field offset. */ + +void saveLoadEntries(const void *); + +void saveOrLoad() { + struct Track { + char soundName[15]; + }; + struct SaveLoadEntry { + int offs; + int type; + int size; + }; + + SaveLoadEntry trackEntries = { + ((long) (__SIZE_TYPE__) (&((Track *) 42)->soundName[0])) - 42, + 0, 1 + }; + saveLoadEntries(&trackEntries); +} diff --git a/gcc/testsuite/g++.dg/init/struct3.C b/gcc/testsuite/g++.dg/init/struct3.C new file mode 100644 index 000000000..53804b3d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/struct3.C @@ -0,0 +1,15 @@ +/* PR c++/23180. */ +/* Initialize a global variable with an expression that attempts to use + pointer arithmetic to calculate a structure field offset. */ + +struct Track { + char soundName[15]; +}; + +struct SaveLoadEntry { + int offs; + int type; + int size; +}; + +int foobar = ((long) (__SIZE_TYPE__) (& ((Track *) 42)->soundName[0])) - 42; diff --git a/gcc/testsuite/g++.dg/init/switch1.C b/gcc/testsuite/g++.dg/init/switch1.C new file mode 100644 index 000000000..b0b06b748 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/switch1.C @@ -0,0 +1,8 @@ +int f(int c) +{ + switch (c) + { + case d: /* { dg-error "'d' was not declared" } */ + int optBzip2 = true; + } +} diff --git a/gcc/testsuite/g++.dg/init/synth1.C b/gcc/testsuite/g++.dg/init/synth1.C new file mode 100644 index 000000000..6c00bc022 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth1.C @@ -0,0 +1,17 @@ +// PR middle-end/17525 + +struct A +{ + ~A(); + int a; +}; + +struct B : public A +{ + virtual ~B(); +}; + +void run (B& b, B& b1) +{ + b1 = b; +} diff --git a/gcc/testsuite/g++.dg/init/synth2.C b/gcc/testsuite/g++.dg/init/synth2.C new file mode 100644 index 000000000..ed5046715 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth2.C @@ -0,0 +1,18 @@ +// PR c++/34180 + +struct G { + G(); // { dg-message "" "candidate" } + G(G&); // { dg-message "" "candidate" } +}; + +class A // { dg-error "" } +// { dg-message "candidate" "candidate note" { target *-*-* } 8 } +{ + const G g; +}; + +int main() +{ + A a; + A b = a; // { dg-message "required here|deleted" } +} diff --git a/gcc/testsuite/g++.dg/init/synth3.C b/gcc/testsuite/g++.dg/init/synth3.C new file mode 100644 index 000000000..d656ddb2e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth3.C @@ -0,0 +1,21 @@ +// Test that synthesizing the C copy constructor doesn't require B to +// be complete. + +template +struct B +{ + typename T::NT nt; +}; + +struct A +{ + A (); + A (const A&); + A (const B&); +}; + +struct C: A { }; + +C c; +C c2(c); + diff --git a/gcc/testsuite/g++.dg/init/synth4.C b/gcc/testsuite/g++.dg/init/synth4.C new file mode 100644 index 000000000..2b0b0b95a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth4.C @@ -0,0 +1,18 @@ +// PR c++/45822 + +struct A +{ + A(int); +}; + +struct B +{ + B(A = 0); +}; + +struct C +{ + B b; +}; + +C c; diff --git a/gcc/testsuite/g++.dg/init/union1.C b/gcc/testsuite/g++.dg/init/union1.C new file mode 100644 index 000000000..0049f4429 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/union1.C @@ -0,0 +1,5 @@ +// PR c++/14401 + +union U { + int& i; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/init/union2.C b/gcc/testsuite/g++.dg/init/union2.C new file mode 100644 index 000000000..ac39f6092 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/union2.C @@ -0,0 +1,13 @@ +// PR c++/15938 +// { dg-do compile } +// { dg-options "" } + +typedef union +{ + struct { int i; }; + struct { char c; }; +} A; + +A a = { 0 }; +A b = {{ 0 }}; +A c = {{{ 0 }}}; // { dg-error "braces" } diff --git a/gcc/testsuite/g++.dg/init/value1.C b/gcc/testsuite/g++.dg/init/value1.C new file mode 100644 index 000000000..9dbc2e067 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value1.C @@ -0,0 +1,22 @@ +// Test that with value-initialization, i is initialized to 0 +// and the vtable pointer is properly initialized. + +// { dg-do run } + +struct A +{ + int i; + virtual void f() {} +}; + +void f (A& a) +{ + a.f(); +} + +int main() +{ + A a = A(); + f (a); + return a.i; +} diff --git a/gcc/testsuite/g++.dg/init/value10.C b/gcc/testsuite/g++.dg/init/value10.C new file mode 100644 index 000000000..2066410a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value10.C @@ -0,0 +1,27 @@ +// PR c++/51331 +// { dg-do run } + +struct A { + A(): x(10) {} + virtual ~A() {} + + int x; +}; + +struct B: public virtual A { +}; + +struct C: public virtual A { +}; + +struct D: public B, virtual public C { + D(): B(), C() {} // note an explicit call to C() which is auto-generated +}; + +int main() { + D* d = new D(); + + // Crashes here with the following message: + // *** glibc detected *** ./test: free(): invalid next size (fast) + delete d; +} diff --git a/gcc/testsuite/g++.dg/init/value2.C b/gcc/testsuite/g++.dg/init/value2.C new file mode 100644 index 000000000..fbe166471 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value2.C @@ -0,0 +1,23 @@ +// PR c++/35116 +// Test that break_out_target_exprs works properly with complex +// value-initialization. + +struct A +{ + virtual void f (); +}; + +struct B +{ + A a; +}; + +struct C +{ + C (int, B = B()); +}; + +void f () +{ + C c (4); +} diff --git a/gcc/testsuite/g++.dg/init/value3.C b/gcc/testsuite/g++.dg/init/value3.C new file mode 100644 index 000000000..487baabec --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value3.C @@ -0,0 +1,31 @@ +// Testcase for value-initialization in new-expressions. +// { dg-do run } + +#include +#include + +// Make sure that we return memory that isn't already set to 0. +void *operator new(size_t s) +{ + void *p = malloc (s); + memset (p, 42, s); + return p; +} + +struct A { A() {} ~A() {} }; +struct B { A a; int i; }; + +int main() +{ + B *p = new B(); + if (p->i != 0) + abort(); + + p = new B[2](); + if (p[0].i != 0 || p[1].i != 0) + abort(); + + B(*p2)[2] = new B[2][2](); + if (p2[0][0].i != 0 || p2[0][1].i != 0) + abort(); +} diff --git a/gcc/testsuite/g++.dg/init/value4.C b/gcc/testsuite/g++.dg/init/value4.C new file mode 100644 index 000000000..fa7a02cc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value4.C @@ -0,0 +1,35 @@ +// PR c++/38233 + +template + struct pair + { + _T1 first; + _T2 second; + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 265. std::pair::pair() effects overly restrictive + /** The default constructor creates @c first and @c second using their + * respective default constructors. */ + pair() + : first(), second() { } +}; + +class a { + public: + a(); +}; + +class b { + public: + // implicit default ctor + bool operator<(const b& rhs) const; + + private: + a a_val; +}; + +typedef pair my_pair; + +void func() { + my_pair x; +} diff --git a/gcc/testsuite/g++.dg/init/value5.C b/gcc/testsuite/g++.dg/init/value5.C new file mode 100644 index 000000000..d705f87b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value5.C @@ -0,0 +1,17 @@ +// PR c++/38232 + +class base { + public: + base(); + virtual ~base(); + + private: + int& int_ref; // initialized by base ctor, not visible here +}; + +class derived : public base { +}; + +base *make_derived() { + return new derived(); +} diff --git a/gcc/testsuite/g++.dg/init/value6.C b/gcc/testsuite/g++.dg/init/value6.C new file mode 100644 index 000000000..d7d29bf0a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value6.C @@ -0,0 +1,13 @@ +// PR c++/39109 + +struct N +{ + private: + virtual ~N (); +}; + +N * +foo () +{ + return new N (); +} diff --git a/gcc/testsuite/g++.dg/init/value7.C b/gcc/testsuite/g++.dg/init/value7.C new file mode 100644 index 000000000..c79de4a68 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value7.C @@ -0,0 +1,17 @@ +// PR c++/30111 +// { dg-do run } + +struct pod { + int i; +}; + +struct inherit : pod { + inherit() : pod() {} +}; + +int main() +{ + inherit i; + return i.i != 0; +} + diff --git a/gcc/testsuite/g++.dg/init/value8.C b/gcc/testsuite/g++.dg/init/value8.C new file mode 100644 index 000000000..0a9b90b64 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value8.C @@ -0,0 +1,19 @@ +// PR c++/45315 + +struct A +{ + A (); +}; + +template < int > struct B : A +{ + void foo () + { + new B < 0 > (); + } +}; + +int main() +{ + B<1>().foo(); +} diff --git a/gcc/testsuite/g++.dg/init/value9.C b/gcc/testsuite/g++.dg/init/value9.C new file mode 100644 index 000000000..4899bd810 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value9.C @@ -0,0 +1,32 @@ +// PR c++/50793 +// { dg-do run } + +struct NonTrivial +{ + NonTrivial() { } +}; + +struct S +{ + NonTrivial nt; + int i; +}; + +int f(S s) +{ + s.i = 0xdeadbeef; + return s.i; +} + +int g(S s = S()) +{ + return s.i; +} + +int main() +{ + f(S()); // make stack dirty + + if ( g() ) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/init/vbase1.C b/gcc/testsuite/g++.dg/init/vbase1.C new file mode 100644 index 000000000..bbfd58f5c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/vbase1.C @@ -0,0 +1,39 @@ +// PR c++/50618 +// { dg-do run } + +struct Base +{ + const int text; + Base():text(1) {} + Base(int aText) + : text(aText) {} +}; +struct SubA : public virtual Base +{ +protected: + int x; +public: + SubA(int aX) + : x(aX) {} +}; +class SubB : public virtual Base +{}; +struct Diamond : public SubA, public SubB +{ + Diamond(int text) + : Base(text), SubA(5), SubB() {} + + void printText() + { + if(text != 2) + __builtin_abort(); + if(x!=5) + __builtin_abort(); + } +}; + +int main(int, char**) +{ + Diamond x(2); + x.printText(); +} diff --git a/gcc/testsuite/g++.dg/init/vector1.C b/gcc/testsuite/g++.dg/init/vector1.C new file mode 100644 index 000000000..ce4f40c90 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/vector1.C @@ -0,0 +1,78 @@ +// PR c++/19263 +// { dg-do run } +// { dg-options "-O2" } + +typedef signed char v8qi __attribute__ ((vector_size (8))); + +extern "C" void abort (void); + +static unsigned char S[16]; + +struct A +{ + int i; + v8qi j, k; + int l; +}; + +void +foo (unsigned char v) +{ + A a = { 1, { v, v, v, v, v, v, v, v }, + { v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1 }, 3 }; + v8qi *s = (v8qi *) &S[0]; + *s = a.j; + s[1] = a.k; +} + +void +bar (unsigned char v) +{ + v8qi val8 = { v, v, v, v, v, v, v, v }; + v8qi *s = (v8qi *) &S[0]; + *s = val8; +} + +int n = 5, cnt; + +int +num (void) +{ + ++cnt; + return n; +} + +void +baz (void) +{ + static A a = { 0, { num (), num (), num (), num (), 6, 6, 6, 6 }, + { 7, 7, 7, 7, 8, 8, 8, 8 }, 0 }; + v8qi *s = (v8qi *) &S[0]; + *s = a.j; + s[1] = a.k; +} + +int +main () +{ + int i; + foo (1); + for (i = 0; i < 8; ++i) + if (S[i] != 1) + abort (); + for (; i < 16; ++i) + if (S[i] != 2) + abort (); + bar (3); + for (i = 0; i < 8; ++i) + if (S[i] != 3) + abort (); + return 0; + baz (); + if (cnt != 4) + abort (); + for (i = 0; i < 16; ++i) + if (S[i] != 5 + (i / 4)) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/volatile1.C b/gcc/testsuite/g++.dg/init/volatile1.C new file mode 100644 index 000000000..9080ed5dc --- /dev/null +++ b/gcc/testsuite/g++.dg/init/volatile1.C @@ -0,0 +1,16 @@ +// PR c++/26577 +// The call to bar() was causing an inappropriate dereference of *this, +// which led to an abort in cp_expr_size. + +struct A +{ + A(const A&); + A& operator=(const A&); + static void bar(); + void baz() volatile; +}; + +void A::baz() volatile +{ + bar(); +} diff --git a/gcc/testsuite/g++.dg/init/volatile2.C b/gcc/testsuite/g++.dg/init/volatile2.C new file mode 100644 index 000000000..036d5f162 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/volatile2.C @@ -0,0 +1,13 @@ +// PR c++/47003 + +struct A +{ + A(int); +}; + +volatile int i; + +int main() +{ + A *q = new A (i); +} -- cgit v1.2.3