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