Home | History | Annotate | Download | only in test
      1 //===------------------------- dynamic_cast5.cpp --------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include <cassert>
     11 #include "support/timer.hpp"
     12 
     13 namespace t1
     14 {
     15 
     16 struct A1
     17 {
     18     char _[43981];
     19     virtual ~A1() {}
     20 
     21     A1* getA1() {return this;}
     22 };
     23 
     24 struct A2
     25 {
     26     char _[34981];
     27     virtual ~A2() {}
     28 
     29     A2* getA2() {return this;}
     30 };
     31 
     32 struct A3
     33     : public virtual A1,
     34       private A2
     35 {
     36     char _[93481];
     37     virtual ~A3() {}
     38 
     39     A1* getA1() {return A1::getA1();}
     40     A2* getA2() {return A2::getA2();}
     41     A3* getA3() {return this;}
     42 };
     43 
     44 struct A4
     45     : public A3,
     46       public A2
     47 {
     48     char _[13489];
     49     virtual ~A4() {}
     50 
     51     t1::A1* getA1() {return A3::getA1();}
     52     A2* getA2() {return A3::getA2();}
     53     A3* getA3() {return A3::getA3();}
     54     A4* getA4() {return this;}
     55 };
     56 
     57 struct A5
     58     : public A4,
     59       public A3
     60 {
     61     char _[13489];
     62     virtual ~A5() {}
     63 
     64     t1::A1* getA1() {return A4::getA1();}
     65     A2* getA2() {return A4::getA2();}
     66     A3* getA3() {return A4::getA3();}
     67     A4* getA4() {return A4::getA4();}
     68     A5* getA5() {return this;}
     69 };
     70 
     71 void test()
     72 {
     73     A1 a1;
     74     A2 a2;
     75     A3 a3;
     76     A4 a4;
     77     A5 a5;
     78 
     79     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
     80     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
     81     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
     82     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
     83     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
     84     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
     85     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
     86     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
     87     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
     88     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
     89     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
     90     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
     91     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
     92     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
     93 
     94     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
     95     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
     96     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
     97     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
     98 //    assert(dynamic_cast<A2*>(a3.getA3()) == 0);  // cast to private base
     99     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
    100     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
    101 //    assert(dynamic_cast<A2*>(a4.getA3()) == 0);  // cast to private base
    102 //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
    103     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
    104     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
    105 //    assert(dynamic_cast<A2*>(a5.getA3()) == 0);  // cast to private base
    106 //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
    107 //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
    108 
    109     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
    110     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
    111     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
    112     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
    113     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
    114     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
    115     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
    116     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
    117     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
    118     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
    119     assert(dynamic_cast<A3*>(a5.getA2()) == 0);
    120     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
    121     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
    122 //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
    123 
    124     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
    125     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
    126     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
    127     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
    128     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
    129     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
    130     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
    131     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
    132     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
    133     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
    134     assert(dynamic_cast<A4*>(a5.getA2()) == 0);
    135     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
    136     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
    137     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
    138 
    139     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
    140     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
    141     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
    142     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
    143     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
    144     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
    145     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
    146     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
    147     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
    148     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
    149     assert(dynamic_cast<A5*>(a5.getA2()) == 0);
    150     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
    151     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
    152     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
    153 }
    154 
    155 }  // t1
    156 
    157 namespace t2
    158 {
    159 
    160 struct A1
    161 {
    162     char _[43981];
    163     virtual ~A1() {}
    164 
    165     A1* getA1() {return this;}
    166 };
    167 
    168 struct A2
    169 {
    170     char _[34981];
    171     virtual ~A2() {}
    172 
    173     A2* getA2() {return this;}
    174 };
    175 
    176 struct A3
    177     : public virtual A1,
    178       public A2
    179 {
    180     char _[93481];
    181     virtual ~A3() {}
    182 
    183     A1* getA1() {return A1::getA1();}
    184     A2* getA2() {return A2::getA2();}
    185     A3* getA3() {return this;}
    186 };
    187 
    188 struct A4
    189     : public A3,
    190       public A2
    191 {
    192     char _[13489];
    193     virtual ~A4() {}
    194 
    195     t2::A1* getA1() {return A3::getA1();}
    196     A2* getA2() {return A3::getA2();}
    197     A3* getA3() {return A3::getA3();}
    198     A4* getA4() {return this;}
    199 };
    200 
    201 struct A5
    202     : public A4,
    203       public A3
    204 {
    205     char _[13489];
    206     virtual ~A5() {}
    207 
    208     t2::A1* getA1() {return A4::getA1();}
    209     A2* getA2() {return A4::getA2();}
    210     A3* getA3() {return A4::getA3();}
    211     A4* getA4() {return A4::getA4();}
    212     A5* getA5() {return this;}
    213 };
    214 
    215 void test()
    216 {
    217     A1 a1;
    218     A2 a2;
    219     A3 a3;
    220     A4 a4;
    221     A5 a5;
    222 
    223     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
    224     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
    225     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
    226     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
    227     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
    228     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
    229     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
    230     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
    231     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
    232     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
    233     assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
    234     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
    235     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
    236     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
    237 
    238     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
    239     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
    240     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
    241     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
    242     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
    243     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
    244     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
    245     assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
    246 //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
    247     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
    248     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
    249     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
    250 //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
    251 //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
    252 
    253     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
    254     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
    255     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
    256     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
    257     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
    258     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
    259     assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
    260     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
    261     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
    262     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
    263     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
    264     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
    265     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
    266 //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
    267 
    268     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
    269     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
    270     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
    271     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
    272     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
    273     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
    274     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
    275     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
    276     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
    277     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
    278     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
    279     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
    280     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
    281     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
    282 
    283     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
    284     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
    285     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
    286     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
    287     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
    288     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
    289     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
    290     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
    291     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
    292     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
    293     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
    294     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
    295     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
    296     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
    297 }
    298 
    299 }  // t2
    300 
    301 namespace t3
    302 {
    303 
    304 struct A1
    305 {
    306     char _[43981];
    307     virtual ~A1() {}
    308 
    309     A1* getA1() {return this;}
    310 };
    311 
    312 struct A2
    313 {
    314     char _[34981];
    315     virtual ~A2() {}
    316 
    317     A2* getA2() {return this;}
    318 };
    319 
    320 struct A3
    321     : public A1,
    322       public virtual A2
    323 {
    324     char _[93481];
    325     virtual ~A3() {}
    326 
    327     A1* getA1() {return A1::getA1();}
    328     A2* getA2() {return A2::getA2();}
    329     A3* getA3() {return this;}
    330 };
    331 
    332 struct A4
    333     : public A1,
    334       public virtual A2
    335 {
    336     char _[13489];
    337     virtual ~A4() {}
    338 
    339     A1* getA1() {return A1::getA1();}
    340     A2* getA2() {return A2::getA2();}
    341     A4* getA4() {return this;}
    342 };
    343 
    344 struct A5
    345     : public A3,
    346       public A4
    347 {
    348     char _[41389];
    349     virtual ~A5() {}
    350 
    351     A1* getA14() {return A4::getA1();}
    352     A1* getA13() {return A3::getA1();}
    353     A2* getA2() {return A4::getA2();}
    354     A3* getA3() {return A3::getA3();}
    355     A4* getA4() {return A4::getA4();}
    356     A5* getA5() {return this;}
    357 };
    358 
    359 void test()
    360 {
    361     A1 a1;
    362     A2 a2;
    363     A3 a3;
    364     A4 a4;
    365     A5 a5;
    366 
    367     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
    368     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
    369     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
    370     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
    371     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
    372     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
    373     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
    374     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
    375     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
    376     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
    377     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
    378     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
    379     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
    380 
    381     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
    382     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
    383     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
    384     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
    385     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
    386     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
    387     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
    388     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
    389     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
    390     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
    391     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
    392     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
    393     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
    394     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
    395 
    396     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
    397     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
    398     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
    399     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
    400     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
    401     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
    402     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
    403     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
    404     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
    405     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
    406     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
    407     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
    408     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
    409     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
    410 
    411     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
    412     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
    413     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
    414     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
    415     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
    416     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
    417     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
    418     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
    419     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
    420     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
    421     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
    422     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
    423     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
    424     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
    425 
    426     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
    427     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
    428     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
    429     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
    430     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
    431     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
    432     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
    433     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
    434     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
    435     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
    436     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
    437     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
    438     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
    439     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
    440 }
    441 
    442 }  // t3
    443 
    444 namespace t4
    445 {
    446 
    447 struct A1
    448 {
    449     char _[43981];
    450     virtual ~A1() {}
    451 
    452     A1* getA1() {return this;}
    453 };
    454 
    455 struct A2
    456 {
    457     char _[34981];
    458     virtual ~A2() {}
    459 
    460     A2* getA2() {return this;}
    461 };
    462 
    463 struct A3
    464     : protected A1,
    465       public virtual A2
    466 {
    467     char _[93481];
    468     virtual ~A3() {}
    469 
    470     A1* getA1() {return A1::getA1();}
    471     A2* getA2() {return A2::getA2();}
    472     A3* getA3() {return this;}
    473 };
    474 
    475 struct A4
    476     : public A1,
    477       public virtual A2
    478 {
    479     char _[13489];
    480     virtual ~A4() {}
    481 
    482     A1* getA1() {return A1::getA1();}
    483     A2* getA2() {return A2::getA2();}
    484     A4* getA4() {return this;}
    485 };
    486 
    487 struct A5
    488     : public A3,
    489       public A4
    490 {
    491     char _[41389];
    492     virtual ~A5() {}
    493 
    494     A1* getA14() {return A4::getA1();}
    495     A1* getA13() {return A3::getA1();}
    496     A2* getA2() {return A4::getA2();}
    497     A3* getA3() {return A3::getA3();}
    498     A4* getA4() {return A4::getA4();}
    499     A5* getA5() {return this;}
    500 };
    501 
    502 void test()
    503 {
    504     A1 a1;
    505     A2 a2;
    506     A3 a3;
    507     A4 a4;
    508     A5 a5;
    509 
    510     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
    511     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
    512     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
    513     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
    514 //    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());  // cast to protected base
    515     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
    516     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
    517     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
    518     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
    519     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
    520     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
    521 //    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());  // cast to protected base
    522     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
    523 
    524     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
    525     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
    526     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
    527     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
    528     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
    529     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
    530     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
    531     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
    532     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
    533     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
    534     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
    535     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
    536     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
    537     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
    538 
    539     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
    540     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
    541     assert(dynamic_cast<A3*>(a3.getA1()) == 0);
    542     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
    543     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
    544     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
    545     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
    546     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
    547     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
    548     assert(dynamic_cast<A3*>(a5.getA13()) == 0);
    549     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
    550     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
    551     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
    552     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
    553 
    554     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
    555     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
    556     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
    557     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
    558     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
    559     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
    560     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
    561     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
    562     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
    563     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
    564     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
    565     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
    566     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
    567     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
    568 
    569     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
    570     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
    571     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
    572     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
    573     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
    574     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
    575     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
    576     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
    577     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
    578     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
    579     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
    580     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
    581     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
    582     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
    583 }
    584 
    585 }  // t4
    586 
    587 namespace t5
    588 {
    589 
    590 struct A1
    591 {
    592     char _[43981];
    593     virtual ~A1() {}
    594 
    595     A1* getA1() {return this;}
    596 };
    597 
    598 struct A2
    599 {
    600     char _[34981];
    601     virtual ~A2() {}
    602 
    603     A2* getA2() {return this;}
    604 };
    605 
    606 struct A3
    607     : public A1,
    608       protected virtual A2
    609 {
    610     char _[93481];
    611     virtual ~A3() {}
    612 
    613     A1* getA1() {return A1::getA1();}
    614     A2* getA2() {return A2::getA2();}
    615     A3* getA3() {return this;}
    616 };
    617 
    618 struct A4
    619     : public A1,
    620       public virtual A2
    621 {
    622     char _[13489];
    623     virtual ~A4() {}
    624 
    625     A1* getA1() {return A1::getA1();}
    626     A2* getA2() {return A2::getA2();}
    627     A4* getA4() {return this;}
    628 };
    629 
    630 struct A5
    631     : public A3,
    632       public A4
    633 {
    634     char _[41389];
    635     virtual ~A5() {}
    636 
    637     A1* getA14() {return A4::getA1();}
    638     A1* getA13() {return A3::getA1();}
    639     A2* getA2() {return A4::getA2();}
    640     A3* getA3() {return A3::getA3();}
    641     A4* getA4() {return A4::getA4();}
    642     A5* getA5() {return this;}
    643 };
    644 
    645 void test()
    646 {
    647     A1 a1;
    648     A2 a2;
    649     A3 a3;
    650     A4 a4;
    651     A5 a5;
    652 
    653     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
    654     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
    655     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
    656     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
    657     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
    658     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
    659     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
    660     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
    661     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
    662     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
    663     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
    664     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
    665     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
    666 
    667     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
    668     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
    669     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
    670     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
    671 //    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());  // cast to protected base
    672     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
    673     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
    674     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
    675     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
    676     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
    677     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
    678 //    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());  // cast to protected base
    679     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
    680     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
    681 
    682     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
    683     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
    684     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
    685     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
    686     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
    687     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
    688     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
    689     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
    690     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
    691     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
    692     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
    693     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
    694     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
    695     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
    696 
    697     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
    698     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
    699     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
    700     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
    701     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
    702     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
    703     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
    704     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
    705     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
    706     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
    707     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
    708     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
    709     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
    710     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
    711 
    712     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
    713     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
    714     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
    715     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
    716     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
    717     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
    718     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
    719     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
    720     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
    721     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
    722     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
    723     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
    724     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
    725     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
    726 }
    727 
    728 }  // t5
    729 
    730 namespace t6
    731 {
    732 
    733 struct A1
    734 {
    735     char _[43981];
    736     virtual ~A1() {}
    737 
    738     A1* getA1() {return this;}
    739 };
    740 
    741 struct A2
    742 {
    743     char _[34981];
    744     virtual ~A2() {}
    745 
    746     A2* getA2() {return this;}
    747 };
    748 
    749 struct A3
    750     : public A1,
    751       public virtual A2
    752 {
    753     char _[93481];
    754     virtual ~A3() {}
    755 
    756     A1* getA1() {return A1::getA1();}
    757     A2* getA2() {return A2::getA2();}
    758     A3* getA3() {return this;}
    759 };
    760 
    761 struct A4
    762     : protected A1,
    763       public virtual A2
    764 {
    765     char _[13489];
    766     virtual ~A4() {}
    767 
    768     A1* getA1() {return A1::getA1();}
    769     A2* getA2() {return A2::getA2();}
    770     A4* getA4() {return this;}
    771 };
    772 
    773 struct A5
    774     : public A3,
    775       public A4
    776 {
    777     char _[41389];
    778     virtual ~A5() {}
    779 
    780     A1* getA14() {return A4::getA1();}
    781     A1* getA13() {return A3::getA1();}
    782     A2* getA2() {return A4::getA2();}
    783     A3* getA3() {return A3::getA3();}
    784     A4* getA4() {return A4::getA4();}
    785     A5* getA5() {return this;}
    786 };
    787 
    788 void test()
    789 {
    790     A1 a1;
    791     A2 a2;
    792     A3 a3;
    793     A4 a4;
    794     A5 a5;
    795 
    796     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
    797     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
    798     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
    799     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
    800     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
    801     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
    802     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
    803 //    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());  // cast to protected base
    804     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
    805     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
    806     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
    807     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
    808 //    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());  // cast to protected base
    809 
    810     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
    811     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
    812     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
    813     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
    814     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
    815     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
    816     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
    817     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
    818     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
    819     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
    820     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
    821     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
    822     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
    823     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
    824 
    825     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
    826     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
    827     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
    828     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
    829     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
    830     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
    831     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
    832     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
    833     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
    834     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
    835     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
    836     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
    837     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
    838     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
    839 
    840     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
    841     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
    842     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
    843     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
    844     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
    845     assert(dynamic_cast<A4*>(a4.getA1()) == 0);
    846     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
    847     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
    848     assert(dynamic_cast<A4*>(a5.getA14()) == 0);
    849     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
    850     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
    851     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
    852     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
    853     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
    854 
    855     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
    856     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
    857     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
    858     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
    859     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
    860     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
    861     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
    862     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
    863     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
    864     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
    865     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
    866     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
    867     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
    868     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
    869 }
    870 
    871 }  // t6
    872 
    873 namespace t7
    874 {
    875 
    876 struct A1
    877 {
    878     char _[43981];
    879     virtual ~A1() {}
    880 
    881     A1* getA1() {return this;}
    882 };
    883 
    884 struct A2
    885 {
    886     char _[34981];
    887     virtual ~A2() {}
    888 
    889     A2* getA2() {return this;}
    890 };
    891 
    892 struct A3
    893     : public A1,
    894       public virtual A2
    895 {
    896     char _[93481];
    897     virtual ~A3() {}
    898 
    899     A1* getA1() {return A1::getA1();}
    900     A2* getA2() {return A2::getA2();}
    901     A3* getA3() {return this;}
    902 };
    903 
    904 struct A4
    905     : public A1,
    906       protected virtual A2
    907 {
    908     char _[13489];
    909     virtual ~A4() {}
    910 
    911     A1* getA1() {return A1::getA1();}
    912     A2* getA2() {return A2::getA2();}
    913     A4* getA4() {return this;}
    914 };
    915 
    916 struct A5
    917     : public A3,
    918       public A4
    919 {
    920     char _[41389];
    921     virtual ~A5() {}
    922 
    923     A1* getA14() {return A4::getA1();}
    924     A1* getA13() {return A3::getA1();}
    925     A2* getA2() {return A4::getA2();}
    926     A3* getA3() {return A3::getA3();}
    927     A4* getA4() {return A4::getA4();}
    928     A5* getA5() {return this;}
    929 };
    930 
    931 void test()
    932 {
    933     A1 a1;
    934     A2 a2;
    935     A3 a3;
    936     A4 a4;
    937     A5 a5;
    938 
    939     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
    940     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
    941     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
    942     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
    943     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
    944     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
    945     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
    946     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
    947     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
    948     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
    949     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
    950     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
    951     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
    952 
    953     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
    954     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
    955     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
    956     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
    957     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
    958     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
    959     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
    960 //    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());  // cast to protected base
    961     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
    962     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
    963     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
    964     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
    965 //    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());  // cast to protected base
    966     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
    967 
    968     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
    969     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
    970     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
    971     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
    972     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
    973     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
    974     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
    975     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
    976     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
    977     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
    978     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
    979     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
    980     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
    981     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
    982 
    983     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
    984     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
    985     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
    986     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
    987     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
    988     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
    989     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
    990     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
    991     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
    992     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
    993     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
    994     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
    995     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
    996     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
    997 
    998     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
    999     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
   1000     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
   1001     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
   1002     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
   1003     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
   1004     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
   1005     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
   1006     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
   1007     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
   1008     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
   1009     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
   1010     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
   1011     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
   1012 }
   1013 
   1014 }  // t7
   1015 
   1016 namespace t8
   1017 {
   1018 
   1019 struct A1
   1020 {
   1021     char _[43981];
   1022     virtual ~A1() {}
   1023 
   1024     A1* getA1() {return this;}
   1025 };
   1026 
   1027 struct A2
   1028 {
   1029     char _[34981];
   1030     virtual ~A2() {}
   1031 
   1032     A2* getA2() {return this;}
   1033 };
   1034 
   1035 struct A3
   1036     : public A1,
   1037       public virtual A2
   1038 {
   1039     char _[93481];
   1040     virtual ~A3() {}
   1041 
   1042     A1* getA1() {return A1::getA1();}
   1043     A2* getA2() {return A2::getA2();}
   1044     A3* getA3() {return this;}
   1045 };
   1046 
   1047 struct A4
   1048     : public A1,
   1049       public virtual A2
   1050 {
   1051     char _[13489];
   1052     virtual ~A4() {}
   1053 
   1054     A1* getA1() {return A1::getA1();}
   1055     A2* getA2() {return A2::getA2();}
   1056     A4* getA4() {return this;}
   1057 };
   1058 
   1059 struct A5
   1060     : protected A3,
   1061       public A4
   1062 {
   1063     char _[41389];
   1064     virtual ~A5() {}
   1065 
   1066     A1* getA14() {return A4::getA1();}
   1067     A1* getA13() {return A3::getA1();}
   1068     A2* getA2() {return A4::getA2();}
   1069     A3* getA3() {return A3::getA3();}
   1070     A4* getA4() {return A4::getA4();}
   1071     A5* getA5() {return this;}
   1072 };
   1073 
   1074 void test()
   1075 {
   1076     A1 a1;
   1077     A2 a2;
   1078     A3 a3;
   1079     A4 a4;
   1080     A5 a5;
   1081 
   1082     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
   1083     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
   1084     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
   1085     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
   1086     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
   1087     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
   1088     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
   1089     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
   1090     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
   1091     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
   1092     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
   1093     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
   1094     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
   1095 
   1096     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
   1097     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
   1098     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
   1099     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
   1100     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
   1101     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
   1102     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
   1103     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
   1104     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
   1105     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
   1106     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
   1107     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
   1108     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
   1109     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
   1110 
   1111     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
   1112     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
   1113     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
   1114     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
   1115     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
   1116     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
   1117     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
   1118     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
   1119     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
   1120     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
   1121     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
   1122     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
   1123     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
   1124 //    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());  // cast to protected base
   1125 
   1126     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
   1127     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
   1128     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
   1129     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
   1130     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
   1131     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
   1132     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
   1133     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
   1134     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
   1135     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
   1136     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
   1137     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
   1138     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
   1139     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
   1140 
   1141     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
   1142     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
   1143     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
   1144     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
   1145     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
   1146     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
   1147     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
   1148     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
   1149     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
   1150     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
   1151     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
   1152     assert(dynamic_cast<A5*>(a5.getA3()) == 0);
   1153     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
   1154     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
   1155 }
   1156 
   1157 }  // t8
   1158 
   1159 namespace t9
   1160 {
   1161 
   1162 struct A1
   1163 {
   1164     char _[43981];
   1165     virtual ~A1() {}
   1166 
   1167     A1* getA1() {return this;}
   1168 };
   1169 
   1170 struct A2
   1171 {
   1172     char _[34981];
   1173     virtual ~A2() {}
   1174 
   1175     A2* getA2() {return this;}
   1176 };
   1177 
   1178 struct A3
   1179     : public A1,
   1180       public virtual A2
   1181 {
   1182     char _[93481];
   1183     virtual ~A3() {}
   1184 
   1185     A1* getA1() {return A1::getA1();}
   1186     A2* getA2() {return A2::getA2();}
   1187     A3* getA3() {return this;}
   1188 };
   1189 
   1190 struct A4
   1191     : public A1,
   1192       public virtual A2
   1193 {
   1194     char _[13489];
   1195     virtual ~A4() {}
   1196 
   1197     A1* getA1() {return A1::getA1();}
   1198     A2* getA2() {return A2::getA2();}
   1199     A4* getA4() {return this;}
   1200 };
   1201 
   1202 struct A5
   1203     : public A3,
   1204       protected A4
   1205 {
   1206     char _[41389];
   1207     virtual ~A5() {}
   1208 
   1209     A1* getA14() {return A4::getA1();}
   1210     A1* getA13() {return A3::getA1();}
   1211     A2* getA2() {return A4::getA2();}
   1212     A3* getA3() {return A3::getA3();}
   1213     A4* getA4() {return A4::getA4();}
   1214     A5* getA5() {return this;}
   1215 };
   1216 
   1217 void test()
   1218 {
   1219     A1 a1;
   1220     A2 a2;
   1221     A3 a3;
   1222     A4 a4;
   1223     A5 a5;
   1224 
   1225     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
   1226     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
   1227     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
   1228     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
   1229     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
   1230     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
   1231     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
   1232     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
   1233     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
   1234     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
   1235     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
   1236     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
   1237     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
   1238 
   1239     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
   1240     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
   1241     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
   1242     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
   1243     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
   1244     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
   1245     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
   1246     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
   1247     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
   1248     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
   1249     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
   1250     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
   1251     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
   1252     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
   1253 
   1254     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
   1255     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
   1256     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
   1257     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
   1258     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
   1259     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
   1260     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
   1261     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
   1262     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
   1263     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
   1264     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
   1265     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
   1266     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
   1267     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
   1268 
   1269     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
   1270     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
   1271     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
   1272     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
   1273     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
   1274     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
   1275     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
   1276     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
   1277     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
   1278     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
   1279     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
   1280     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
   1281     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
   1282 //    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());  // cast to protected base
   1283 
   1284     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
   1285     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
   1286     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
   1287     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
   1288     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
   1289     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
   1290     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
   1291     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
   1292     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
   1293     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
   1294     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
   1295     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
   1296     assert(dynamic_cast<A5*>(a5.getA4()) == 0);
   1297     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
   1298 }
   1299 
   1300 }  // t9
   1301 
   1302 
   1303 int main()
   1304 {
   1305     timer t;
   1306     t1::test();
   1307     t2::test();
   1308     t3::test();
   1309     t4::test();
   1310     t5::test();
   1311     t6::test();
   1312     t7::test();
   1313     t8::test();
   1314     t9::test();
   1315 }
   1316