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