Home | History | Annotate | Line # | Download | only in gdb.cp
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