brintos

brintos / llvm-project-archived public Read only

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