1*1424dfb3Schristos /* This testcase is part of GDB, the GNU debugger. 2*1424dfb3Schristos 3*1424dfb3Schristos Copyright 2019-2020 Free Software Foundation, Inc. 4*1424dfb3Schristos 5*1424dfb3Schristos This program is free software; you can redistribute it and/or modify 6*1424dfb3Schristos it under the terms of the GNU General Public License as published by 7*1424dfb3Schristos the Free Software Foundation; either version 3 of the License, or 8*1424dfb3Schristos (at your option) any later version. 9*1424dfb3Schristos 10*1424dfb3Schristos This program is distributed in the hope that it will be useful, 11*1424dfb3Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 12*1424dfb3Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*1424dfb3Schristos GNU General Public License for more details. 14*1424dfb3Schristos 15*1424dfb3Schristos You should have received a copy of the GNU General Public License 16*1424dfb3Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17*1424dfb3Schristos 18*1424dfb3Schristos class ByVal { 19*1424dfb3Schristos public: 20*1424dfb3Schristos ByVal (void); 21*1424dfb3Schristos 22*1424dfb3Schristos int x; 23*1424dfb3Schristos }; 24*1424dfb3Schristos ByVal(void)25*1424dfb3SchristosByVal::ByVal (void) 26*1424dfb3Schristos { 27*1424dfb3Schristos x = 2; 28*1424dfb3Schristos } 29*1424dfb3Schristos 30*1424dfb3Schristos class ByRef { 31*1424dfb3Schristos public: 32*1424dfb3Schristos ByRef (void); 33*1424dfb3Schristos 34*1424dfb3Schristos ByRef (const ByRef &rhs); 35*1424dfb3Schristos 36*1424dfb3Schristos int x; 37*1424dfb3Schristos }; 38*1424dfb3Schristos ByRef(void)39*1424dfb3SchristosByRef::ByRef (void) 40*1424dfb3Schristos { 41*1424dfb3Schristos x = 2; 42*1424dfb3Schristos } 43*1424dfb3Schristos ByRef(const ByRef & rhs)44*1424dfb3SchristosByRef::ByRef (const ByRef &rhs) 45*1424dfb3Schristos { 46*1424dfb3Schristos x = 3; /* ByRef-cctor */ 47*1424dfb3Schristos } 48*1424dfb3Schristos 49*1424dfb3Schristos class ArrayContainerByVal { 50*1424dfb3Schristos public: 51*1424dfb3Schristos ByVal items[2]; 52*1424dfb3Schristos }; 53*1424dfb3Schristos 54*1424dfb3Schristos int cbvArrayContainerByVal(ArrayContainerByVal arg)55*1424dfb3SchristoscbvArrayContainerByVal (ArrayContainerByVal arg) 56*1424dfb3Schristos { 57*1424dfb3Schristos arg.items[0].x += 4; // intentionally modify 58*1424dfb3Schristos return arg.items[0].x; 59*1424dfb3Schristos } 60*1424dfb3Schristos 61*1424dfb3Schristos class ArrayContainerByRef { 62*1424dfb3Schristos public: 63*1424dfb3Schristos ByRef items[2]; 64*1424dfb3Schristos }; 65*1424dfb3Schristos 66*1424dfb3Schristos int cbvArrayContainerByRef(ArrayContainerByRef arg)67*1424dfb3SchristoscbvArrayContainerByRef (ArrayContainerByRef arg) 68*1424dfb3Schristos { 69*1424dfb3Schristos arg.items[0].x += 4; // intentionally modify 70*1424dfb3Schristos return arg.items[0].x; 71*1424dfb3Schristos } 72*1424dfb3Schristos 73*1424dfb3Schristos class DynamicBase { 74*1424dfb3Schristos public: 75*1424dfb3Schristos DynamicBase (void); 76*1424dfb3Schristos 77*1424dfb3Schristos virtual int get (void); 78*1424dfb3Schristos 79*1424dfb3Schristos int x; 80*1424dfb3Schristos }; 81*1424dfb3Schristos DynamicBase(void)82*1424dfb3SchristosDynamicBase::DynamicBase (void) 83*1424dfb3Schristos { 84*1424dfb3Schristos x = 2; 85*1424dfb3Schristos } 86*1424dfb3Schristos 87*1424dfb3Schristos int get(void)88*1424dfb3SchristosDynamicBase::get (void) 89*1424dfb3Schristos { 90*1424dfb3Schristos return 42; 91*1424dfb3Schristos } 92*1424dfb3Schristos 93*1424dfb3Schristos class Dynamic : public DynamicBase { 94*1424dfb3Schristos public: 95*1424dfb3Schristos virtual int get (void); 96*1424dfb3Schristos }; 97*1424dfb3Schristos 98*1424dfb3Schristos int get(void)99*1424dfb3SchristosDynamic::get (void) 100*1424dfb3Schristos { 101*1424dfb3Schristos return 9999; 102*1424dfb3Schristos } 103*1424dfb3Schristos 104*1424dfb3Schristos int cbvDynamic(DynamicBase arg)105*1424dfb3SchristoscbvDynamic (DynamicBase arg) 106*1424dfb3Schristos { 107*1424dfb3Schristos arg.x += 4; // intentionally modify 108*1424dfb3Schristos return arg.x + arg.get (); 109*1424dfb3Schristos } 110*1424dfb3Schristos 111*1424dfb3Schristos class Inlined { 112*1424dfb3Schristos public: 113*1424dfb3Schristos Inlined (void); 114*1424dfb3Schristos 115*1424dfb3Schristos __attribute__((always_inline)) Inlined(const Inlined & rhs)116*1424dfb3Schristos Inlined (const Inlined &rhs) 117*1424dfb3Schristos { 118*1424dfb3Schristos x = 3; 119*1424dfb3Schristos } 120*1424dfb3Schristos 121*1424dfb3Schristos int x; 122*1424dfb3Schristos }; 123*1424dfb3Schristos Inlined(void)124*1424dfb3SchristosInlined::Inlined (void) 125*1424dfb3Schristos { 126*1424dfb3Schristos x = 2; 127*1424dfb3Schristos } 128*1424dfb3Schristos 129*1424dfb3Schristos int cbvInlined(Inlined arg)130*1424dfb3SchristoscbvInlined (Inlined arg) 131*1424dfb3Schristos { 132*1424dfb3Schristos arg.x += 4; // intentionally modify 133*1424dfb3Schristos return arg.x; 134*1424dfb3Schristos } 135*1424dfb3Schristos 136*1424dfb3Schristos class DtorDel { 137*1424dfb3Schristos public: 138*1424dfb3Schristos DtorDel (void); 139*1424dfb3Schristos 140*1424dfb3Schristos ~DtorDel (void) = delete; 141*1424dfb3Schristos 142*1424dfb3Schristos int x; 143*1424dfb3Schristos }; 144*1424dfb3Schristos DtorDel(void)145*1424dfb3SchristosDtorDel::DtorDel (void) 146*1424dfb3Schristos { 147*1424dfb3Schristos x = 2; 148*1424dfb3Schristos } 149*1424dfb3Schristos 150*1424dfb3Schristos int cbvDtorDel(DtorDel arg)151*1424dfb3SchristoscbvDtorDel (DtorDel arg) 152*1424dfb3Schristos { 153*1424dfb3Schristos // Calling this method should be rejected 154*1424dfb3Schristos return arg.x; 155*1424dfb3Schristos } 156*1424dfb3Schristos 157*1424dfb3Schristos class FourCCtor { 158*1424dfb3Schristos public: 159*1424dfb3Schristos FourCCtor (void); 160*1424dfb3Schristos 161*1424dfb3Schristos FourCCtor (FourCCtor &rhs); 162*1424dfb3Schristos FourCCtor (const FourCCtor &rhs); 163*1424dfb3Schristos FourCCtor (volatile FourCCtor &rhs); 164*1424dfb3Schristos FourCCtor (const volatile FourCCtor &rhs); 165*1424dfb3Schristos 166*1424dfb3Schristos int x; 167*1424dfb3Schristos }; 168*1424dfb3Schristos FourCCtor(void)169*1424dfb3SchristosFourCCtor::FourCCtor (void) 170*1424dfb3Schristos { 171*1424dfb3Schristos x = 2; 172*1424dfb3Schristos } 173*1424dfb3Schristos FourCCtor(FourCCtor & rhs)174*1424dfb3SchristosFourCCtor::FourCCtor (FourCCtor &rhs) 175*1424dfb3Schristos { 176*1424dfb3Schristos x = 3; 177*1424dfb3Schristos } 178*1424dfb3Schristos FourCCtor(const FourCCtor & rhs)179*1424dfb3SchristosFourCCtor::FourCCtor (const FourCCtor &rhs) 180*1424dfb3Schristos { 181*1424dfb3Schristos x = 4; 182*1424dfb3Schristos } 183*1424dfb3Schristos FourCCtor(volatile FourCCtor & rhs)184*1424dfb3SchristosFourCCtor::FourCCtor (volatile FourCCtor &rhs) 185*1424dfb3Schristos { 186*1424dfb3Schristos x = 5; 187*1424dfb3Schristos } 188*1424dfb3Schristos FourCCtor(const volatile FourCCtor & rhs)189*1424dfb3SchristosFourCCtor::FourCCtor (const volatile FourCCtor &rhs) 190*1424dfb3Schristos { 191*1424dfb3Schristos x = 6; 192*1424dfb3Schristos } 193*1424dfb3Schristos 194*1424dfb3Schristos int cbvFourCCtor(FourCCtor arg)195*1424dfb3SchristoscbvFourCCtor (FourCCtor arg) 196*1424dfb3Schristos { 197*1424dfb3Schristos arg.x += 10; // intentionally modify 198*1424dfb3Schristos return arg.x; 199*1424dfb3Schristos } 200*1424dfb3Schristos 201*1424dfb3Schristos class TwoMCtor { 202*1424dfb3Schristos public: 203*1424dfb3Schristos TwoMCtor (void); 204*1424dfb3Schristos 205*1424dfb3Schristos /* Even though one move ctor is defaulted, the other 206*1424dfb3Schristos is explicit. */ 207*1424dfb3Schristos TwoMCtor (const TwoMCtor &&rhs); 208*1424dfb3Schristos TwoMCtor (TwoMCtor &&rhs) = default; 209*1424dfb3Schristos 210*1424dfb3Schristos int x; 211*1424dfb3Schristos }; 212*1424dfb3Schristos TwoMCtor(void)213*1424dfb3SchristosTwoMCtor::TwoMCtor (void) 214*1424dfb3Schristos { 215*1424dfb3Schristos x = 2; 216*1424dfb3Schristos } 217*1424dfb3Schristos TwoMCtor(const TwoMCtor && rhs)218*1424dfb3SchristosTwoMCtor::TwoMCtor (const TwoMCtor &&rhs) 219*1424dfb3Schristos { 220*1424dfb3Schristos x = 3; 221*1424dfb3Schristos } 222*1424dfb3Schristos 223*1424dfb3Schristos int cbvTwoMCtor(TwoMCtor arg)224*1424dfb3SchristoscbvTwoMCtor (TwoMCtor arg) 225*1424dfb3Schristos { 226*1424dfb3Schristos arg.x += 10; // intentionally modify 227*1424dfb3Schristos return arg.x; 228*1424dfb3Schristos } 229*1424dfb3Schristos 230*1424dfb3Schristos class TwoMCtorAndCCtor { 231*1424dfb3Schristos public: 232*1424dfb3Schristos TwoMCtorAndCCtor (void); 233*1424dfb3Schristos 234*1424dfb3Schristos TwoMCtorAndCCtor (const TwoMCtorAndCCtor &rhs) = default; 235*1424dfb3Schristos 236*1424dfb3Schristos /* Even though one move ctor is defaulted, the other 237*1424dfb3Schristos is explicit. This makes the type pass-by-ref. */ 238*1424dfb3Schristos TwoMCtorAndCCtor (const TwoMCtorAndCCtor &&rhs); 239*1424dfb3Schristos TwoMCtorAndCCtor (TwoMCtorAndCCtor &&rhs) = default; 240*1424dfb3Schristos 241*1424dfb3Schristos int x; 242*1424dfb3Schristos }; 243*1424dfb3Schristos TwoMCtorAndCCtor(void)244*1424dfb3SchristosTwoMCtorAndCCtor::TwoMCtorAndCCtor (void) 245*1424dfb3Schristos { 246*1424dfb3Schristos x = 2; 247*1424dfb3Schristos } 248*1424dfb3Schristos TwoMCtorAndCCtor(const TwoMCtorAndCCtor && rhs)249*1424dfb3SchristosTwoMCtorAndCCtor::TwoMCtorAndCCtor (const TwoMCtorAndCCtor &&rhs) 250*1424dfb3Schristos { 251*1424dfb3Schristos x = 4; 252*1424dfb3Schristos } 253*1424dfb3Schristos 254*1424dfb3Schristos int cbvTwoMCtorAndCCtor(TwoMCtorAndCCtor arg)255*1424dfb3SchristoscbvTwoMCtorAndCCtor (TwoMCtorAndCCtor arg) 256*1424dfb3Schristos { 257*1424dfb3Schristos arg.x += 10; // intentionally modify 258*1424dfb3Schristos return arg.x; 259*1424dfb3Schristos } 260*1424dfb3Schristos 261*1424dfb3Schristos ArrayContainerByVal arrayContainerByVal; 262*1424dfb3Schristos ArrayContainerByRef arrayContainerByRef; 263*1424dfb3Schristos Dynamic dynamic; 264*1424dfb3Schristos Inlined inlined; 265*1424dfb3Schristos // Cannot stack-allocate DtorDel 266*1424dfb3Schristos DtorDel *dtorDel; 267*1424dfb3Schristos FourCCtor fourCctor_c0v0; 268*1424dfb3Schristos const FourCCtor fourCctor_c1v0; 269*1424dfb3Schristos volatile FourCCtor fourCctor_c0v1; 270*1424dfb3Schristos const volatile FourCCtor fourCctor_c1v1; 271*1424dfb3Schristos TwoMCtor twoMctor; 272*1424dfb3Schristos TwoMCtorAndCCtor twoMctorAndCctor; 273*1424dfb3Schristos 274*1424dfb3Schristos int main(void)275*1424dfb3Schristosmain (void) 276*1424dfb3Schristos { 277*1424dfb3Schristos int v; 278*1424dfb3Schristos dtorDel = new DtorDel; 279*1424dfb3Schristos /* Explicitly call the cbv function to make sure the compiler 280*1424dfb3Schristos will not omit any code in the binary. */ 281*1424dfb3Schristos v = cbvArrayContainerByVal (arrayContainerByVal); 282*1424dfb3Schristos v = cbvArrayContainerByRef (arrayContainerByRef); 283*1424dfb3Schristos v = cbvDynamic (dynamic); 284*1424dfb3Schristos v = cbvInlined (inlined); 285*1424dfb3Schristos v = cbvFourCCtor (fourCctor_c0v0); 286*1424dfb3Schristos v = cbvFourCCtor (fourCctor_c1v0); 287*1424dfb3Schristos v = cbvFourCCtor (fourCctor_c0v1); 288*1424dfb3Schristos v = cbvFourCCtor (fourCctor_c1v1); 289*1424dfb3Schristos /* v = cbvTwoMCtor (twoMctor); */ // This is illegal, cctor is deleted 290*1424dfb3Schristos v = cbvTwoMCtorAndCCtor (twoMctorAndCctor); 291*1424dfb3Schristos 292*1424dfb3Schristos /* stop here */ 293*1424dfb3Schristos 294*1424dfb3Schristos return 0; 295*1424dfb3Schristos } 296