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