Home | History | Annotate | Line # | Download | only in gdb.cp
classes.cc revision 1.1
      1  1.1  christos /* This testcase is part of GDB, the GNU debugger.
      2  1.1  christos 
      3  1.1  christos    Copyright 1993-2014 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.1  christos class ClassWithEnum {
    438  1.1  christos public:
    439  1.1  christos   enum PrivEnum { red, green, blue, yellow = 42 };
    440  1.1  christos   PrivEnum priv_enum;
    441  1.1  christos   int x;
    442  1.1  christos };
    443  1.1  christos 
    444  1.1  christos void enums2 (void)
    445  1.1  christos {
    446  1.1  christos }
    447  1.1  christos 
    448  1.1  christos /* classes.exp relies on statement order in this function for testing
    449  1.1  christos    enumeration fields.  */
    450  1.1  christos 
    451  1.1  christos void enums1 ()
    452  1.1  christos {
    453  1.1  christos   ClassWithEnum obj_with_enum;
    454  1.1  christos   obj_with_enum.priv_enum = ClassWithEnum::red;
    455  1.1  christos   obj_with_enum.x = 0;
    456  1.1  christos   enums2 ();
    457  1.1  christos   obj_with_enum.priv_enum = ClassWithEnum::green;
    458  1.1  christos   obj_with_enum.x = 1;
    459  1.1  christos }
    460  1.1  christos 
    461  1.1  christos class ClassParam {
    462  1.1  christos public:
    463  1.1  christos   int Aptr_a (A *a) { return a->a; }
    464  1.1  christos   int Aptr_x (A *a) { return a->x; }
    465  1.1  christos   int Aref_a (A &a) { return a.a; }
    466  1.1  christos   int Aref_x (A &a) { return a.x; }
    467  1.1  christos   int Aval_a (A a) { return a.a; }
    468  1.1  christos   int Aval_x (A a) { return a.x; }
    469  1.1  christos };
    470  1.1  christos 
    471  1.1  christos ClassParam class_param;
    472  1.1  christos 
    473  1.1  christos class Contains_static_instance
    474  1.1  christos {
    475  1.1  christos  public:
    476  1.1  christos   int x;
    477  1.1  christos   int y;
    478  1.1  christos   Contains_static_instance (int i, int j) { x = i; y = j; }
    479  1.1  christos   static Contains_static_instance null;
    480  1.1  christos };
    481  1.1  christos 
    482  1.1  christos Contains_static_instance Contains_static_instance::null(0,0);
    483  1.1  christos Contains_static_instance csi(10,20);
    484  1.1  christos 
    485  1.1  christos class Contains_nested_static_instance
    486  1.1  christos {
    487  1.1  christos  public:
    488  1.1  christos   class Nested
    489  1.1  christos   {
    490  1.1  christos    public:
    491  1.1  christos     Nested(int i) : z(i) {}
    492  1.1  christos     int z;
    493  1.1  christos     static Contains_nested_static_instance xx;
    494  1.1  christos   };
    495  1.1  christos 
    496  1.1  christos   Contains_nested_static_instance(int i, int j) : x(i), y(j) {}
    497  1.1  christos 
    498  1.1  christos   int x;
    499  1.1  christos   int y;
    500  1.1  christos 
    501  1.1  christos   static Contains_nested_static_instance null;
    502  1.1  christos   static Nested yy;
    503  1.1  christos };
    504  1.1  christos 
    505  1.1  christos Contains_nested_static_instance Contains_nested_static_instance::null(0, 0);
    506  1.1  christos Contains_nested_static_instance::Nested Contains_nested_static_instance::yy(5);
    507  1.1  christos Contains_nested_static_instance
    508  1.1  christos   Contains_nested_static_instance::Nested::xx(1,2);
    509  1.1  christos Contains_nested_static_instance cnsi(30,40);
    510  1.1  christos 
    511  1.1  christos typedef struct {
    512  1.1  christos   int one;
    513  1.1  christos   int two;
    514  1.1  christos } tagless_struct;
    515  1.1  christos tagless_struct v_tagless;
    516  1.1  christos 
    517  1.1  christos /* Try to get the compiler to allocate a class in a register.  */
    518  1.1  christos class small {
    519  1.1  christos  public:
    520  1.1  christos   int x;
    521  1.1  christos   int method ();
    522  1.1  christos };
    523  1.1  christos 
    524  1.1  christos int
    525  1.1  christos small::method ()
    526  1.1  christos {
    527  1.1  christos   return x + 5;
    528  1.1  christos }
    529  1.1  christos 
    530  1.1  christos void marker_reg1 () {}
    531  1.1  christos 
    532  1.1  christos int
    533  1.1  christos register_class ()
    534  1.1  christos {
    535  1.1  christos   /* We don't call any methods for v, so gcc version cygnus-2.3.3-930220
    536  1.1  christos      might put this variable in a register.  This is a lose, though, because
    537  1.1  christos      it means that GDB can't call any methods for that variable.  */
    538  1.1  christos   register small v;
    539  1.1  christos 
    540  1.1  christos   int i;
    541  1.1  christos 
    542  1.1  christos   /* Perform a computation sufficiently complicated that optimizing compilers
    543  1.1  christos      won't optimized out the variable.  If some compiler constant-folds this
    544  1.1  christos      whole loop, maybe using a parameter to this function here would help.  */
    545  1.1  christos   v.x = 0;
    546  1.1  christos   for (i = 0; i < 13; ++i)
    547  1.1  christos     v.x += i;
    548  1.1  christos   --v.x; /* v.x is now 77 */
    549  1.1  christos   marker_reg1 ();
    550  1.1  christos   return v.x + 5;
    551  1.1  christos }
    552  1.1  christos 
    553  1.1  christos void dummy()
    554  1.1  christos {
    555  1.1  christos   v_bool = true;
    556  1.1  christos   v_bool_array[0] = false;
    557  1.1  christos   v_bool_array[1] = v_bool;
    558  1.1  christos }
    559  1.1  christos 
    560  1.1  christos void use_methods ()
    561  1.1  christos {
    562  1.1  christos   /* Refer to methods so that they don't get optimized away. */
    563  1.1  christos   int i;
    564  1.1  christos   i = class_param.Aptr_a (&g_A);
    565  1.1  christos   i = class_param.Aptr_x (&g_A);
    566  1.1  christos   i = class_param.Aref_a (g_A);
    567  1.1  christos   i = class_param.Aref_x (g_A);
    568  1.1  christos   i = class_param.Aval_a (g_A);
    569  1.1  christos   i = class_param.Aval_x (g_A);
    570  1.1  christos 
    571  1.1  christos   base1 b (3);
    572  1.1  christos }
    573  1.1  christos 
    574  1.1  christos 
    575  1.1  christos int
    576  1.1  christos main()
    577  1.1  christos {
    578  1.1  christos   dummy();
    579  1.1  christos   inheritance1 ();
    580  1.1  christos   inheritance3 ();
    581  1.1  christos   enums1 ();
    582  1.1  christos   register_class ();
    583  1.1  christos 
    584  1.1  christos   /* FIXME: pmi gets optimized out.  Need to do some more computation with
    585  1.1  christos      it or something.  (No one notices, because the test is xfail'd anyway,
    586  1.1  christos      but that probably won't always be true...).  */
    587  1.1  christos   int Foo::* pmi = &Foo::y;
    588  1.1  christos 
    589  1.1  christos   /* Make sure the AIX linker doesn't remove the variable.  */
    590  1.1  christos   v_tagless.one = 5;
    591  1.1  christos 
    592  1.1  christos   use_methods ();
    593  1.1  christos 
    594  1.1  christos   return foo.*pmi;
    595  1.1  christos }
    596  1.1  christos 
    597  1.1  christos /* Create an instance for some classes, otherwise they get optimized away.  */
    598  1.1  christos 
    599  1.1  christos default_public_struct default_public_s;
    600  1.1  christos explicit_public_struct explicit_public_s;
    601  1.1  christos protected_struct protected_s;
    602  1.1  christos private_struct private_s;
    603  1.1  christos mixed_protection_struct mixed_protection_s;
    604  1.1  christos public_class public_c;
    605  1.1  christos protected_class protected_c;
    606  1.1  christos default_private_class default_private_c;
    607  1.1  christos explicit_private_class explicit_private_c;
    608  1.1  christos mixed_protection_class mixed_protection_c;
    609