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*1424dfb3Schristos ByVal::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*1424dfb3Schristos ByRef::ByRef (void)
40*1424dfb3Schristos {
41*1424dfb3Schristos   x = 2;
42*1424dfb3Schristos }
43*1424dfb3Schristos 
ByRef(const ByRef & rhs)44*1424dfb3Schristos ByRef::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*1424dfb3Schristos cbvArrayContainerByVal (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*1424dfb3Schristos cbvArrayContainerByRef (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*1424dfb3Schristos DynamicBase::DynamicBase (void)
83*1424dfb3Schristos {
84*1424dfb3Schristos   x = 2;
85*1424dfb3Schristos }
86*1424dfb3Schristos 
87*1424dfb3Schristos int
get(void)88*1424dfb3Schristos DynamicBase::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*1424dfb3Schristos Dynamic::get (void)
100*1424dfb3Schristos {
101*1424dfb3Schristos   return 9999;
102*1424dfb3Schristos }
103*1424dfb3Schristos 
104*1424dfb3Schristos int
cbvDynamic(DynamicBase arg)105*1424dfb3Schristos cbvDynamic (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*1424dfb3Schristos Inlined::Inlined (void)
125*1424dfb3Schristos {
126*1424dfb3Schristos   x = 2;
127*1424dfb3Schristos }
128*1424dfb3Schristos 
129*1424dfb3Schristos int
cbvInlined(Inlined arg)130*1424dfb3Schristos cbvInlined (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*1424dfb3Schristos DtorDel::DtorDel (void)
146*1424dfb3Schristos {
147*1424dfb3Schristos   x = 2;
148*1424dfb3Schristos }
149*1424dfb3Schristos 
150*1424dfb3Schristos int
cbvDtorDel(DtorDel arg)151*1424dfb3Schristos cbvDtorDel (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*1424dfb3Schristos FourCCtor::FourCCtor (void)
170*1424dfb3Schristos {
171*1424dfb3Schristos   x = 2;
172*1424dfb3Schristos }
173*1424dfb3Schristos 
FourCCtor(FourCCtor & rhs)174*1424dfb3Schristos FourCCtor::FourCCtor (FourCCtor &rhs)
175*1424dfb3Schristos {
176*1424dfb3Schristos   x = 3;
177*1424dfb3Schristos }
178*1424dfb3Schristos 
FourCCtor(const FourCCtor & rhs)179*1424dfb3Schristos FourCCtor::FourCCtor (const FourCCtor &rhs)
180*1424dfb3Schristos {
181*1424dfb3Schristos   x = 4;
182*1424dfb3Schristos }
183*1424dfb3Schristos 
FourCCtor(volatile FourCCtor & rhs)184*1424dfb3Schristos FourCCtor::FourCCtor (volatile FourCCtor &rhs)
185*1424dfb3Schristos {
186*1424dfb3Schristos   x = 5;
187*1424dfb3Schristos }
188*1424dfb3Schristos 
FourCCtor(const volatile FourCCtor & rhs)189*1424dfb3Schristos FourCCtor::FourCCtor (const volatile FourCCtor &rhs)
190*1424dfb3Schristos {
191*1424dfb3Schristos   x = 6;
192*1424dfb3Schristos }
193*1424dfb3Schristos 
194*1424dfb3Schristos int
cbvFourCCtor(FourCCtor arg)195*1424dfb3Schristos cbvFourCCtor (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*1424dfb3Schristos TwoMCtor::TwoMCtor (void)
214*1424dfb3Schristos {
215*1424dfb3Schristos   x = 2;
216*1424dfb3Schristos }
217*1424dfb3Schristos 
TwoMCtor(const TwoMCtor && rhs)218*1424dfb3Schristos TwoMCtor::TwoMCtor (const TwoMCtor &&rhs)
219*1424dfb3Schristos {
220*1424dfb3Schristos   x = 3;
221*1424dfb3Schristos }
222*1424dfb3Schristos 
223*1424dfb3Schristos int
cbvTwoMCtor(TwoMCtor arg)224*1424dfb3Schristos cbvTwoMCtor (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*1424dfb3Schristos TwoMCtorAndCCtor::TwoMCtorAndCCtor (void)
245*1424dfb3Schristos {
246*1424dfb3Schristos   x = 2;
247*1424dfb3Schristos }
248*1424dfb3Schristos 
TwoMCtorAndCCtor(const TwoMCtorAndCCtor && rhs)249*1424dfb3Schristos TwoMCtorAndCCtor::TwoMCtorAndCCtor (const TwoMCtorAndCCtor &&rhs)
250*1424dfb3Schristos {
251*1424dfb3Schristos   x = 4;
252*1424dfb3Schristos }
253*1424dfb3Schristos 
254*1424dfb3Schristos int
cbvTwoMCtorAndCCtor(TwoMCtorAndCCtor arg)255*1424dfb3Schristos cbvTwoMCtorAndCCtor (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*1424dfb3Schristos main (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