xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.cp/misc.cc (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis /* This testcase is part of GDB, the GNU debugger.
2*b725ae77Skettenis 
3*b725ae77Skettenis    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
4*b725ae77Skettenis    Free Software Foundation, Inc.
5*b725ae77Skettenis 
6*b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
7*b725ae77Skettenis    it under the terms of the GNU General Public License as published by
8*b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
9*b725ae77Skettenis    (at your option) any later version.
10*b725ae77Skettenis 
11*b725ae77Skettenis    This program is distributed in the hope that it will be useful,
12*b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*b725ae77Skettenis    GNU General Public License for more details.
15*b725ae77Skettenis 
16*b725ae77Skettenis    You should have received a copy of the GNU General Public License
17*b725ae77Skettenis    along with this program; if not, write to the Free Software
18*b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19*b725ae77Skettenis    */
20*b725ae77Skettenis 
21*b725ae77Skettenis // Test various -*- C++ -*- things.
22*b725ae77Skettenis 
23*b725ae77Skettenis // ====================== basic C++ types  =======================
24*b725ae77Skettenis bool            v_bool;
25*b725ae77Skettenis bool            v_bool_array[2];
26*b725ae77Skettenis 
27*b725ae77Skettenis typedef struct fleep fleep;
28*b725ae77Skettenis struct fleep { int a; } s;
29*b725ae77Skettenis 
30*b725ae77Skettenis // ====================== simple class structures  =======================
31*b725ae77Skettenis 
32*b725ae77Skettenis struct default_public_struct {
33*b725ae77Skettenis  // defaults to public:
34*b725ae77Skettenis   int a;
35*b725ae77Skettenis   int b;
36*b725ae77Skettenis };
37*b725ae77Skettenis 
38*b725ae77Skettenis struct explicit_public_struct {
39*b725ae77Skettenis  public:
40*b725ae77Skettenis   int a;
41*b725ae77Skettenis   int b;
42*b725ae77Skettenis };
43*b725ae77Skettenis 
44*b725ae77Skettenis struct protected_struct {
45*b725ae77Skettenis  protected:
46*b725ae77Skettenis   int a;
47*b725ae77Skettenis   int b;
48*b725ae77Skettenis };
49*b725ae77Skettenis 
50*b725ae77Skettenis struct private_struct {
51*b725ae77Skettenis  private:
52*b725ae77Skettenis   int a;
53*b725ae77Skettenis   int b;
54*b725ae77Skettenis };
55*b725ae77Skettenis 
56*b725ae77Skettenis struct mixed_protection_struct {
57*b725ae77Skettenis  public:
58*b725ae77Skettenis   int a;
59*b725ae77Skettenis   int b;
60*b725ae77Skettenis  private:
61*b725ae77Skettenis   int c;
62*b725ae77Skettenis   int d;
63*b725ae77Skettenis  protected:
64*b725ae77Skettenis   int e;
65*b725ae77Skettenis   int f;
66*b725ae77Skettenis  public:
67*b725ae77Skettenis   int g;
68*b725ae77Skettenis  private:
69*b725ae77Skettenis   int h;
70*b725ae77Skettenis  protected:
71*b725ae77Skettenis   int i;
72*b725ae77Skettenis };
73*b725ae77Skettenis 
74*b725ae77Skettenis class public_class {
75*b725ae77Skettenis  public:
76*b725ae77Skettenis   int a;
77*b725ae77Skettenis   int b;
78*b725ae77Skettenis };
79*b725ae77Skettenis 
80*b725ae77Skettenis class protected_class {
81*b725ae77Skettenis  protected:
82*b725ae77Skettenis   int a;
83*b725ae77Skettenis   int b;
84*b725ae77Skettenis };
85*b725ae77Skettenis 
86*b725ae77Skettenis class default_private_class {
87*b725ae77Skettenis  // defaults to private:
88*b725ae77Skettenis   int a;
89*b725ae77Skettenis   int b;
90*b725ae77Skettenis };
91*b725ae77Skettenis 
92*b725ae77Skettenis class explicit_private_class {
93*b725ae77Skettenis  private:
94*b725ae77Skettenis   int a;
95*b725ae77Skettenis   int b;
96*b725ae77Skettenis };
97*b725ae77Skettenis 
98*b725ae77Skettenis class mixed_protection_class {
99*b725ae77Skettenis  public:
100*b725ae77Skettenis   int a;
101*b725ae77Skettenis   int b;
102*b725ae77Skettenis  private:
103*b725ae77Skettenis   int c;
104*b725ae77Skettenis   int d;
105*b725ae77Skettenis  protected:
106*b725ae77Skettenis   int e;
107*b725ae77Skettenis   int f;
108*b725ae77Skettenis  public:
109*b725ae77Skettenis   int g;
110*b725ae77Skettenis  private:
111*b725ae77Skettenis   int h;
112*b725ae77Skettenis  protected:
113*b725ae77Skettenis   int i;
114*b725ae77Skettenis };
115*b725ae77Skettenis 
116*b725ae77Skettenis class const_vol_method_class {
117*b725ae77Skettenis public:
118*b725ae77Skettenis   int a;
119*b725ae77Skettenis   int b;
120*b725ae77Skettenis   int foo (int &) const;
121*b725ae77Skettenis   int bar (int &) volatile;
122*b725ae77Skettenis   int baz (int &) const volatile;
123*b725ae77Skettenis };
124*b725ae77Skettenis 
foo(int & ir) const125*b725ae77Skettenis int const_vol_method_class::foo (int & ir) const
126*b725ae77Skettenis {
127*b725ae77Skettenis   return ir + 3;
128*b725ae77Skettenis }
bar(int & ir)129*b725ae77Skettenis int const_vol_method_class::bar (int & ir) volatile
130*b725ae77Skettenis {
131*b725ae77Skettenis   return ir + 4;
132*b725ae77Skettenis }
baz(int & ir) const133*b725ae77Skettenis int const_vol_method_class::baz (int & ir) const volatile
134*b725ae77Skettenis {
135*b725ae77Skettenis   return ir + 5;
136*b725ae77Skettenis }
137*b725ae77Skettenis 
138*b725ae77Skettenis // ========================= simple inheritance ==========================
139*b725ae77Skettenis 
140*b725ae77Skettenis class A {
141*b725ae77Skettenis  public:
142*b725ae77Skettenis   int a;
143*b725ae77Skettenis   int x;
144*b725ae77Skettenis };
145*b725ae77Skettenis 
146*b725ae77Skettenis A g_A;
147*b725ae77Skettenis 
148*b725ae77Skettenis class B : public A {
149*b725ae77Skettenis  public:
150*b725ae77Skettenis   int b;
151*b725ae77Skettenis   int x;
152*b725ae77Skettenis };
153*b725ae77Skettenis 
154*b725ae77Skettenis B g_B;
155*b725ae77Skettenis 
156*b725ae77Skettenis class C : public A {
157*b725ae77Skettenis  public:
158*b725ae77Skettenis   int c;
159*b725ae77Skettenis   int x;
160*b725ae77Skettenis };
161*b725ae77Skettenis 
162*b725ae77Skettenis C g_C;
163*b725ae77Skettenis 
164*b725ae77Skettenis class D : public B, public C {
165*b725ae77Skettenis  public:
166*b725ae77Skettenis   int d;
167*b725ae77Skettenis   int x;
168*b725ae77Skettenis };
169*b725ae77Skettenis 
170*b725ae77Skettenis D g_D;
171*b725ae77Skettenis 
172*b725ae77Skettenis class E : public D {
173*b725ae77Skettenis  public:
174*b725ae77Skettenis   int e;
175*b725ae77Skettenis   int x;
176*b725ae77Skettenis };
177*b725ae77Skettenis 
178*b725ae77Skettenis E g_E;
179*b725ae77Skettenis 
180*b725ae77Skettenis class class_with_anon_union
181*b725ae77Skettenis {
182*b725ae77Skettenis  public:
183*b725ae77Skettenis   int one;
184*b725ae77Skettenis   union
185*b725ae77Skettenis   {
186*b725ae77Skettenis     int a;
187*b725ae77Skettenis     long b;
188*b725ae77Skettenis   };
189*b725ae77Skettenis };
190*b725ae77Skettenis 
191*b725ae77Skettenis class_with_anon_union g_anon_union;
192*b725ae77Skettenis 
inheritance2(void)193*b725ae77Skettenis void inheritance2 (void)
194*b725ae77Skettenis {
195*b725ae77Skettenis }
196*b725ae77Skettenis 
inheritance1(void)197*b725ae77Skettenis void inheritance1 (void)
198*b725ae77Skettenis {
199*b725ae77Skettenis   int ival;
200*b725ae77Skettenis   int *intp;
201*b725ae77Skettenis 
202*b725ae77Skettenis   // {A::a, A::x}
203*b725ae77Skettenis 
204*b725ae77Skettenis   g_A.A::a = 1;
205*b725ae77Skettenis   g_A.A::x = 2;
206*b725ae77Skettenis 
207*b725ae77Skettenis   // {{A::a,A::x},B::b,B::x}
208*b725ae77Skettenis 
209*b725ae77Skettenis   g_B.A::a = 3;
210*b725ae77Skettenis   g_B.A::x = 4;
211*b725ae77Skettenis   g_B.B::b = 5;
212*b725ae77Skettenis   g_B.B::x = 6;
213*b725ae77Skettenis 
214*b725ae77Skettenis   // {{A::a,A::x},C::c,C::x}
215*b725ae77Skettenis 
216*b725ae77Skettenis   g_C.A::a = 7;
217*b725ae77Skettenis   g_C.A::x = 8;
218*b725ae77Skettenis   g_C.C::c = 9;
219*b725ae77Skettenis   g_C.C::x = 10;
220*b725ae77Skettenis 
221*b725ae77Skettenis   // {{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}
222*b725ae77Skettenis 
223*b725ae77Skettenis   // The following initialization code is non-portable, but allows us
224*b725ae77Skettenis   // to initialize all members of g_D until we can fill in the missing
225*b725ae77Skettenis   // initialization code with legal C++ code.
226*b725ae77Skettenis 
227*b725ae77Skettenis   for (intp = (int *) &g_D, ival = 11;
228*b725ae77Skettenis        intp < ((int *) &g_D + sizeof (g_D) / sizeof (int));
229*b725ae77Skettenis        intp++, ival++)
230*b725ae77Skettenis     {
231*b725ae77Skettenis       *intp = ival;
232*b725ae77Skettenis     }
233*b725ae77Skettenis 
234*b725ae77Skettenis   // Overlay the nonportable initialization with legal initialization.
235*b725ae77Skettenis 
236*b725ae77Skettenis   // ????? = 11;  (g_D.A::a = 11; is ambiguous)
237*b725ae77Skettenis   // ????? = 12;  (g_D.A::x = 12; is ambiguous)
238*b725ae77Skettenis /* djb 6-3-2000
239*b725ae77Skettenis 
240*b725ae77Skettenis 	This should take care of it. Rather than try to initialize using an ambiguous
241*b725ae77Skettenis 	construct, use 2 unambiguous ones for each. Since the ambiguous a/x member is
242*b725ae77Skettenis 	coming from C, and B, initialize D's C::a, and B::a, and D's C::x and B::x.
243*b725ae77Skettenis  */
244*b725ae77Skettenis   g_D.C::a = 15;
245*b725ae77Skettenis   g_D.C::x = 12;
246*b725ae77Skettenis   g_D.B::a = 11;
247*b725ae77Skettenis   g_D.B::x = 12;
248*b725ae77Skettenis   g_D.B::b = 13;
249*b725ae77Skettenis   g_D.B::x = 14;
250*b725ae77Skettenis   // ????? = 15;
251*b725ae77Skettenis   // ????? = 16;
252*b725ae77Skettenis   g_D.C::c = 17;
253*b725ae77Skettenis   g_D.C::x = 18;
254*b725ae77Skettenis   g_D.D::d = 19;
255*b725ae77Skettenis   g_D.D::x = 20;
256*b725ae77Skettenis 
257*b725ae77Skettenis 
258*b725ae77Skettenis   // {{{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}},E::e,E::x}
259*b725ae77Skettenis 
260*b725ae77Skettenis   // The following initialization code is non-portable, but allows us
261*b725ae77Skettenis   // to initialize all members of g_D until we can fill in the missing
262*b725ae77Skettenis   // initialization code with legal C++ code.
263*b725ae77Skettenis 
264*b725ae77Skettenis   for (intp = (int *) &g_E, ival = 21;
265*b725ae77Skettenis        intp < ((int *) &g_E + sizeof (g_E) / sizeof (int));
266*b725ae77Skettenis        intp++, ival++)
267*b725ae77Skettenis   {
268*b725ae77Skettenis     *intp = ival;
269*b725ae77Skettenis   }
270*b725ae77Skettenis 
271*b725ae77Skettenis   // Overlay the nonportable initialization with legal initialization.
272*b725ae77Skettenis 
273*b725ae77Skettenis   // ????? = 21;  (g_E.A::a = 21; is ambiguous)
274*b725ae77Skettenis   // ????? = 22;  (g_E.A::x = 22; is ambiguous)
275*b725ae77Skettenis   g_E.B::b = 23;
276*b725ae77Skettenis   g_E.B::x = 24;
277*b725ae77Skettenis   // ????? = 25;
278*b725ae77Skettenis   // ????? = 26;
279*b725ae77Skettenis   g_E.C::c = 27;
280*b725ae77Skettenis   g_E.C::x = 28;
281*b725ae77Skettenis   g_E.D::d = 29;
282*b725ae77Skettenis   g_E.D::x = 30;
283*b725ae77Skettenis   g_E.E::e = 31;
284*b725ae77Skettenis   g_E.E::x = 32;
285*b725ae77Skettenis 
286*b725ae77Skettenis   g_anon_union.one = 1;
287*b725ae77Skettenis   g_anon_union.a = 2;
288*b725ae77Skettenis 
289*b725ae77Skettenis   inheritance2 ();
290*b725ae77Skettenis }
291*b725ae77Skettenis 
292*b725ae77Skettenis // ======================== static member functions =====================
293*b725ae77Skettenis 
294*b725ae77Skettenis class Static {
295*b725ae77Skettenis public:
296*b725ae77Skettenis   static void ii(int, int);
297*b725ae77Skettenis };
ii(int,int)298*b725ae77Skettenis void Static::ii (int, int) { }
299*b725ae77Skettenis 
300*b725ae77Skettenis // ======================== virtual base classes=========================
301*b725ae77Skettenis 
302*b725ae77Skettenis class vA {
303*b725ae77Skettenis  public:
304*b725ae77Skettenis   int va;
305*b725ae77Skettenis   int vx;
306*b725ae77Skettenis };
307*b725ae77Skettenis 
308*b725ae77Skettenis vA g_vA;
309*b725ae77Skettenis 
310*b725ae77Skettenis class vB : public virtual vA {
311*b725ae77Skettenis  public:
312*b725ae77Skettenis   int vb;
313*b725ae77Skettenis   int vx;
314*b725ae77Skettenis };
315*b725ae77Skettenis 
316*b725ae77Skettenis vB g_vB;
317*b725ae77Skettenis 
318*b725ae77Skettenis class vC : public virtual vA {
319*b725ae77Skettenis  public:
320*b725ae77Skettenis   int vc;
321*b725ae77Skettenis   int vx;
322*b725ae77Skettenis };
323*b725ae77Skettenis 
324*b725ae77Skettenis vC g_vC;
325*b725ae77Skettenis 
326*b725ae77Skettenis class vD : public virtual vB, public virtual vC {
327*b725ae77Skettenis  public:
328*b725ae77Skettenis   int vd;
329*b725ae77Skettenis   int vx;
330*b725ae77Skettenis };
331*b725ae77Skettenis 
332*b725ae77Skettenis vD g_vD;
333*b725ae77Skettenis 
334*b725ae77Skettenis class vE : public virtual vD {
335*b725ae77Skettenis  public:
336*b725ae77Skettenis   int ve;
337*b725ae77Skettenis   int vx;
338*b725ae77Skettenis };
339*b725ae77Skettenis 
340*b725ae77Skettenis vE g_vE;
341*b725ae77Skettenis 
inheritance4(void)342*b725ae77Skettenis void inheritance4 (void)
343*b725ae77Skettenis {
344*b725ae77Skettenis }
345*b725ae77Skettenis 
inheritance3(void)346*b725ae77Skettenis void inheritance3 (void)
347*b725ae77Skettenis {
348*b725ae77Skettenis   int ival;
349*b725ae77Skettenis   int *intp;
350*b725ae77Skettenis 
351*b725ae77Skettenis   // {vA::va, vA::vx}
352*b725ae77Skettenis 
353*b725ae77Skettenis   g_vA.vA::va = 1;
354*b725ae77Skettenis   g_vA.vA::vx = 2;
355*b725ae77Skettenis 
356*b725ae77Skettenis   // {{vA::va, vA::vx}, vB::vb, vB::vx}
357*b725ae77Skettenis 
358*b725ae77Skettenis   g_vB.vA::va = 3;
359*b725ae77Skettenis   g_vB.vA::vx = 4;
360*b725ae77Skettenis   g_vB.vB::vb = 5;
361*b725ae77Skettenis   g_vB.vB::vx = 6;
362*b725ae77Skettenis 
363*b725ae77Skettenis   // {{vA::va, vA::vx}, vC::vc, vC::vx}
364*b725ae77Skettenis 
365*b725ae77Skettenis   g_vC.vA::va = 7;
366*b725ae77Skettenis   g_vC.vA::vx = 8;
367*b725ae77Skettenis   g_vC.vC::vc = 9;
368*b725ae77Skettenis   g_vC.vC::vx = 10;
369*b725ae77Skettenis 
370*b725ae77Skettenis   // {{{{vA::va, vA::vx}, vB::vb, vB::vx}, vC::vc, vC::vx}, vD::vd,vD::vx}
371*b725ae77Skettenis 
372*b725ae77Skettenis   g_vD.vA::va = 11;
373*b725ae77Skettenis   g_vD.vA::vx = 12;
374*b725ae77Skettenis   g_vD.vB::vb = 13;
375*b725ae77Skettenis   g_vD.vB::vx = 14;
376*b725ae77Skettenis   g_vD.vC::vc = 15;
377*b725ae77Skettenis   g_vD.vC::vx = 16;
378*b725ae77Skettenis   g_vD.vD::vd = 17;
379*b725ae77Skettenis   g_vD.vD::vx = 18;
380*b725ae77Skettenis 
381*b725ae77Skettenis 
382*b725ae77Skettenis   // {{{{{vA::va,vA::vx},vB::vb,vB::vx},vC::vc,vC::vx},vD::vd,vD::vx},vE::ve,vE::vx}
383*b725ae77Skettenis 
384*b725ae77Skettenis   g_vD.vA::va = 19;
385*b725ae77Skettenis   g_vD.vA::vx = 20;
386*b725ae77Skettenis   g_vD.vB::vb = 21;
387*b725ae77Skettenis   g_vD.vB::vx = 22;
388*b725ae77Skettenis   g_vD.vC::vc = 23;
389*b725ae77Skettenis   g_vD.vC::vx = 24;
390*b725ae77Skettenis   g_vD.vD::vd = 25;
391*b725ae77Skettenis   g_vD.vD::vx = 26;
392*b725ae77Skettenis   g_vE.vE::ve = 27;
393*b725ae77Skettenis   g_vE.vE::vx = 28;
394*b725ae77Skettenis 
395*b725ae77Skettenis   inheritance4 ();
396*b725ae77Skettenis }
397*b725ae77Skettenis 
398*b725ae77Skettenis // ======================================================================
399*b725ae77Skettenis 
400*b725ae77Skettenis class Base1 {
401*b725ae77Skettenis  public:
402*b725ae77Skettenis   int x;
Base1(int i)403*b725ae77Skettenis   Base1(int i) { x = i; }
404*b725ae77Skettenis };
405*b725ae77Skettenis 
406*b725ae77Skettenis class Foo
407*b725ae77Skettenis {
408*b725ae77Skettenis  public:
409*b725ae77Skettenis   int x;
410*b725ae77Skettenis   int y;
411*b725ae77Skettenis   static int st;
Foo(int i,int j)412*b725ae77Skettenis   Foo (int i, int j) { x = i; y = j; }
413*b725ae77Skettenis   int operator! ();
414*b725ae77Skettenis   operator int ();
415*b725ae77Skettenis   int times (int y);
416*b725ae77Skettenis };
417*b725ae77Skettenis 
418*b725ae77Skettenis class Bar : public Base1, public Foo {
419*b725ae77Skettenis  public:
420*b725ae77Skettenis   int z;
Bar(int i,int j,int k)421*b725ae77Skettenis   Bar (int i, int j, int k) : Base1 (10*k), Foo (i, j) { z = k; }
422*b725ae77Skettenis };
423*b725ae77Skettenis 
operator !()424*b725ae77Skettenis int Foo::operator! () { return !x; }
425*b725ae77Skettenis 
times(int y)426*b725ae77Skettenis int Foo::times (int y) { return x * y; }
427*b725ae77Skettenis 
428*b725ae77Skettenis int Foo::st = 100;
429*b725ae77Skettenis 
operator int()430*b725ae77Skettenis Foo::operator int() { return x; }
431*b725ae77Skettenis 
432*b725ae77Skettenis Foo foo(10, 11);
433*b725ae77Skettenis Bar bar(20, 21, 22);
434*b725ae77Skettenis 
435*b725ae77Skettenis class ClassWithEnum {
436*b725ae77Skettenis public:
437*b725ae77Skettenis   enum PrivEnum { red, green, blue, yellow = 42 };
438*b725ae77Skettenis   PrivEnum priv_enum;
439*b725ae77Skettenis   int x;
440*b725ae77Skettenis };
441*b725ae77Skettenis 
enums2(void)442*b725ae77Skettenis void enums2 (void)
443*b725ae77Skettenis {
444*b725ae77Skettenis }
445*b725ae77Skettenis 
446*b725ae77Skettenis /* classes.exp relies on statement order in this function for testing
447*b725ae77Skettenis    enumeration fields.  */
448*b725ae77Skettenis 
enums1()449*b725ae77Skettenis void enums1 ()
450*b725ae77Skettenis {
451*b725ae77Skettenis   ClassWithEnum obj_with_enum;
452*b725ae77Skettenis   obj_with_enum.priv_enum = ClassWithEnum::red;
453*b725ae77Skettenis   obj_with_enum.x = 0;
454*b725ae77Skettenis   enums2 ();
455*b725ae77Skettenis   obj_with_enum.priv_enum = ClassWithEnum::green;
456*b725ae77Skettenis }
457*b725ae77Skettenis 
458*b725ae77Skettenis class ClassParam {
459*b725ae77Skettenis public:
Aptr_a(A * a)460*b725ae77Skettenis   int Aptr_a (A *a) { return a->a; }
Aptr_x(A * a)461*b725ae77Skettenis   int Aptr_x (A *a) { return a->x; }
Aref_a(A & a)462*b725ae77Skettenis   int Aref_a (A &a) { return a.a; }
Aref_x(A & a)463*b725ae77Skettenis   int Aref_x (A &a) { return a.x; }
Aval_a(A a)464*b725ae77Skettenis   int Aval_a (A a) { return a.a; }
Aval_x(A a)465*b725ae77Skettenis   int Aval_x (A a) { return a.x; }
466*b725ae77Skettenis };
467*b725ae77Skettenis 
468*b725ae77Skettenis ClassParam class_param;
469*b725ae77Skettenis 
470*b725ae77Skettenis class Contains_static_instance
471*b725ae77Skettenis {
472*b725ae77Skettenis  public:
473*b725ae77Skettenis   int x;
474*b725ae77Skettenis   int y;
Contains_static_instance(int i,int j)475*b725ae77Skettenis   Contains_static_instance (int i, int j) { x = i; y = j; }
476*b725ae77Skettenis   static Contains_static_instance null;
477*b725ae77Skettenis };
478*b725ae77Skettenis 
479*b725ae77Skettenis Contains_static_instance Contains_static_instance::null(0,0);
480*b725ae77Skettenis Contains_static_instance csi(10,20);
481*b725ae77Skettenis 
482*b725ae77Skettenis class Contains_nested_static_instance
483*b725ae77Skettenis {
484*b725ae77Skettenis  public:
485*b725ae77Skettenis   class Nested
486*b725ae77Skettenis   {
487*b725ae77Skettenis    public:
Nested(int i)488*b725ae77Skettenis     Nested(int i) : z(i) {}
489*b725ae77Skettenis     int z;
490*b725ae77Skettenis     static Contains_nested_static_instance xx;
491*b725ae77Skettenis   };
492*b725ae77Skettenis 
Contains_nested_static_instance(int i,int j)493*b725ae77Skettenis   Contains_nested_static_instance(int i, int j) : x(i), y(j) {}
494*b725ae77Skettenis 
495*b725ae77Skettenis   int x;
496*b725ae77Skettenis   int y;
497*b725ae77Skettenis 
498*b725ae77Skettenis   static Contains_nested_static_instance null;
499*b725ae77Skettenis   static Nested yy;
500*b725ae77Skettenis };
501*b725ae77Skettenis 
502*b725ae77Skettenis Contains_nested_static_instance Contains_nested_static_instance::null(0, 0);
503*b725ae77Skettenis Contains_nested_static_instance::Nested Contains_nested_static_instance::yy(5);
504*b725ae77Skettenis Contains_nested_static_instance
505*b725ae77Skettenis   Contains_nested_static_instance::Nested::xx(1,2);
506*b725ae77Skettenis Contains_nested_static_instance cnsi(30,40);
507*b725ae77Skettenis 
508*b725ae77Skettenis typedef struct {
509*b725ae77Skettenis   int one;
510*b725ae77Skettenis   int two;
511*b725ae77Skettenis } tagless_struct;
512*b725ae77Skettenis tagless_struct v_tagless;
513*b725ae77Skettenis 
514*b725ae77Skettenis /* Try to get the compiler to allocate a class in a register.  */
515*b725ae77Skettenis class small {
516*b725ae77Skettenis  public:
517*b725ae77Skettenis   int x;
518*b725ae77Skettenis   int method ();
519*b725ae77Skettenis };
520*b725ae77Skettenis 
521*b725ae77Skettenis int
method()522*b725ae77Skettenis small::method ()
523*b725ae77Skettenis {
524*b725ae77Skettenis   return x + 5;
525*b725ae77Skettenis }
526*b725ae77Skettenis 
marker_reg1()527*b725ae77Skettenis void marker_reg1 () {}
528*b725ae77Skettenis 
529*b725ae77Skettenis int
register_class()530*b725ae77Skettenis register_class ()
531*b725ae77Skettenis {
532*b725ae77Skettenis   /* We don't call any methods for v, so gcc version cygnus-2.3.3-930220
533*b725ae77Skettenis      might put this variable in a register.  This is a lose, though, because
534*b725ae77Skettenis      it means that GDB can't call any methods for that variable.  */
535*b725ae77Skettenis   register small v;
536*b725ae77Skettenis 
537*b725ae77Skettenis   int i;
538*b725ae77Skettenis 
539*b725ae77Skettenis   /* Perform a computation sufficiently complicated that optimizing compilers
540*b725ae77Skettenis      won't optimized out the variable.  If some compiler constant-folds this
541*b725ae77Skettenis      whole loop, maybe using a parameter to this function here would help.  */
542*b725ae77Skettenis   v.x = 0;
543*b725ae77Skettenis   for (i = 0; i < 13; ++i)
544*b725ae77Skettenis     v.x += i;
545*b725ae77Skettenis   --v.x; /* v.x is now 77 */
546*b725ae77Skettenis   marker_reg1 ();
547*b725ae77Skettenis   return v.x + 5;
548*b725ae77Skettenis }
549*b725ae77Skettenis 
dummy()550*b725ae77Skettenis void dummy()
551*b725ae77Skettenis {
552*b725ae77Skettenis   v_bool = true;
553*b725ae77Skettenis   v_bool_array[0] = false;
554*b725ae77Skettenis   v_bool_array[1] = v_bool;
555*b725ae77Skettenis }
556*b725ae77Skettenis 
use_methods()557*b725ae77Skettenis void use_methods ()
558*b725ae77Skettenis {
559*b725ae77Skettenis   /* Refer to methods so that they don't get optimized away. */
560*b725ae77Skettenis   int i;
561*b725ae77Skettenis   i = class_param.Aptr_a (&g_A);
562*b725ae77Skettenis   i = class_param.Aptr_x (&g_A);
563*b725ae77Skettenis   i = class_param.Aref_a (g_A);
564*b725ae77Skettenis   i = class_param.Aref_x (g_A);
565*b725ae77Skettenis   i = class_param.Aval_a (g_A);
566*b725ae77Skettenis   i = class_param.Aval_x (g_A);
567*b725ae77Skettenis }
568*b725ae77Skettenis 
569*b725ae77Skettenis 
570*b725ae77Skettenis int
main()571*b725ae77Skettenis main()
572*b725ae77Skettenis {
573*b725ae77Skettenis #ifdef usestubs
574*b725ae77Skettenis   set_debug_traps();
575*b725ae77Skettenis   breakpoint();
576*b725ae77Skettenis #endif
577*b725ae77Skettenis   dummy();
578*b725ae77Skettenis   inheritance1 ();
579*b725ae77Skettenis   inheritance3 ();
580*b725ae77Skettenis   enums1 ();
581*b725ae77Skettenis   register_class ();
582*b725ae77Skettenis 
583*b725ae77Skettenis   /* FIXME: pmi gets optimized out.  Need to do some more computation with
584*b725ae77Skettenis      it or something.  (No one notices, because the test is xfail'd anyway,
585*b725ae77Skettenis      but that probably won't always be true...).  */
586*b725ae77Skettenis   int Foo::* pmi = &Foo::y;
587*b725ae77Skettenis 
588*b725ae77Skettenis   /* Make sure the AIX linker doesn't remove the variable.  */
589*b725ae77Skettenis   v_tagless.one = 5;
590*b725ae77Skettenis 
591*b725ae77Skettenis   use_methods ();
592*b725ae77Skettenis 
593*b725ae77Skettenis   return foo.*pmi;
594*b725ae77Skettenis }
595*b725ae77Skettenis 
596*b725ae77Skettenis /* Create an instance for some classes, otherwise they get optimized away.  */
597*b725ae77Skettenis 
598*b725ae77Skettenis default_public_struct default_public_s;
599*b725ae77Skettenis explicit_public_struct explicit_public_s;
600*b725ae77Skettenis protected_struct protected_s;
601*b725ae77Skettenis private_struct private_s;
602*b725ae77Skettenis mixed_protection_struct mixed_protection_s;
603*b725ae77Skettenis public_class public_c;
604*b725ae77Skettenis protected_class protected_c;
605*b725ae77Skettenis default_private_class default_private_c;
606*b725ae77Skettenis explicit_private_class explicit_private_c;
607*b725ae77Skettenis mixed_protection_class mixed_protection_c;
608