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