/ test / dynamic_cast3.pass.cpp
dynamic_cast3.pass.cpp
   1  //===------------------------- dynamic_cast3.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  /*
  23  
  24  A1   A2   A3
  25  
  26  */
  27  
  28  namespace t1
  29  {
  30  
  31  struct A1
  32  {
  33      char _[43981];
  34      virtual ~A1() {}
  35  
  36      A1* getA1() {return this;}
  37  };
  38  
  39  struct A2
  40  {
  41      char _[34981];
  42      virtual ~A2() {}
  43  
  44      A2* getA2() {return this;}
  45  };
  46  
  47  struct A3
  48  {
  49      char _[93481];
  50      virtual ~A3() {}
  51  
  52      A3* getA3() {return this;}
  53  };
  54  
  55  void test()
  56  {
  57      A1 a1;
  58      A2 a2;
  59      A3 a3;
  60      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
  61      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
  62      assert(dynamic_cast<A1*>(a3.getA3()) == 0);
  63      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
  64      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
  65      assert(dynamic_cast<A2*>(a3.getA3()) == 0);
  66      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
  67      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
  68      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
  69  }
  70  
  71  }  // t1
  72  
  73  /*
  74  
  75  A1   A2
  76  |
  77  A3
  78  
  79  */
  80  
  81  namespace t2
  82  {
  83  
  84  struct A1
  85  {
  86      char _[43981];
  87      virtual ~A1() {}
  88  
  89      A1* getA1() {return this;}
  90  };
  91  
  92  struct A2
  93  {
  94      char _[34981];
  95      virtual ~A2() {}
  96  
  97      A2* getA2() {return this;}
  98  };
  99  
 100  struct A3
 101      : public A1
 102  {
 103      char _[93481];
 104      virtual ~A3() {}
 105  
 106      A3* getA3() {return this;}
 107  };
 108  
 109  void test()
 110  {
 111      A1 a1;
 112      A2 a2;
 113      A3 a3;
 114      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 115      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 116      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 117      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
 118  
 119      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 120      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 121      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 122      assert(dynamic_cast<A2*>(a3.getA3()) == 0);
 123  
 124      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 125      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 126      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
 127      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 128  }
 129  
 130  }  // t2
 131  
 132  namespace t3
 133  {
 134  
 135  struct A1
 136  {
 137      char _[43981];
 138      virtual ~A1() {}
 139  
 140      A1* getA1() {return this;}
 141  };
 142  
 143  struct A2
 144  {
 145      char _[34981];
 146      virtual ~A2() {}
 147  
 148      A2* getA2() {return this;}
 149  };
 150  
 151  struct A3
 152      : public virtual A1
 153  {
 154      char _[93481];
 155      virtual ~A3() {}
 156  
 157      A3* getA3() {return this;}
 158  };
 159  
 160  void test()
 161  {
 162      A1 a1;
 163      A2 a2;
 164      A3 a3;
 165      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 166      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 167      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 168      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
 169  
 170      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 171      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 172      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 173      assert(dynamic_cast<A2*>(a3.getA3()) == 0);
 174  
 175      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 176      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 177      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
 178      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 179  }
 180  
 181  }  // t3
 182  
 183  namespace t4
 184  {
 185  
 186  struct A1
 187  {
 188      char _[43981];
 189      virtual ~A1() {}
 190  
 191      A1* getA1() {return this;}
 192  };
 193  
 194  struct A2
 195  {
 196      char _[34981];
 197      virtual ~A2() {}
 198  
 199      A2* getA2() {return this;}
 200  };
 201  
 202  struct A3
 203      : private A1
 204  {
 205      char _[93481];
 206      virtual ~A3() {}
 207  
 208      A1* getA1() {return this;}
 209      A3* getA3() {return this;}
 210  };
 211  
 212  void test()
 213  {
 214      A1 a1;
 215      A2 a2;
 216      A3 a3;
 217      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 218      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 219      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 220  
 221      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 222      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 223      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 224      assert(dynamic_cast<A2*>(a3.getA3()) == 0);
 225  
 226      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 227      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 228      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 229      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 230  }
 231  
 232  }  // t4
 233  
 234  namespace t5
 235  {
 236  
 237  struct A1
 238  {
 239      char _[43981];
 240      virtual ~A1() {}
 241  
 242      A1* getA1() {return this;}
 243  };
 244  
 245  struct A2
 246  {
 247      char _[34981];
 248      virtual ~A2() {}
 249  
 250      A2* getA2() {return this;}
 251  };
 252  
 253  struct A3
 254      : private virtual A1
 255  {
 256      char _[93481];
 257      virtual ~A3() {}
 258  
 259      A1* getA1() {return this;}
 260      A3* getA3() {return this;}
 261  };
 262  
 263  void test()
 264  {
 265      A1 a1;
 266      A2 a2;
 267      A3 a3;
 268      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 269      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 270      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 271  
 272      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 273      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 274      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 275      assert(dynamic_cast<A2*>(a3.getA3()) == 0);
 276  
 277      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 278      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 279      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 280      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 281  }
 282  
 283  }  // t5
 284  
 285  /*
 286  
 287  A1   A2
 288   \  /
 289    A3
 290  
 291  */
 292  
 293  namespace t6
 294  {
 295  
 296  struct A1
 297  {
 298      char _[43981];
 299      virtual ~A1() {}
 300  
 301      A1* getA1() {return this;}
 302  };
 303  
 304  struct A2
 305  {
 306      char _[34981];
 307      virtual ~A2() {}
 308  
 309      A2* getA2() {return this;}
 310  };
 311  
 312  struct A3
 313      : public A1,
 314        public A2
 315  {
 316      char _[93481];
 317      virtual ~A3() {}
 318  
 319      A1* getA1() {return this;}
 320      A2* getA2() {return this;}
 321      A3* getA3() {return this;}
 322  };
 323  
 324  void test()
 325  {
 326      A1 a1;
 327      A2 a2;
 328      A3 a3;
 329      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 330      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 331      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 332      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
 333      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
 334  
 335      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 336      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 337      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
 338      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 339      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 340  
 341      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 342      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 343      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
 344      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 345      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 346  }
 347  
 348  }  // t6
 349  
 350  namespace t7
 351  {
 352  
 353  struct A1
 354  {
 355      char _[43981];
 356      virtual ~A1() {}
 357  
 358      A1* getA1() {return this;}
 359  };
 360  
 361  struct A2
 362  {
 363      char _[34981];
 364      virtual ~A2() {}
 365  
 366      A2* getA2() {return this;}
 367  };
 368  
 369  struct A3
 370      : public virtual A1,
 371        public A2
 372  {
 373      char _[93481];
 374      virtual ~A3() {}
 375  
 376      A1* getA1() {return this;}
 377      A2* getA2() {return this;}
 378      A3* getA3() {return this;}
 379  };
 380  
 381  void test()
 382  {
 383      A1 a1;
 384      A2 a2;
 385      A3 a3;
 386      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 387      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 388      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 389      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
 390      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
 391  
 392      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 393      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 394      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
 395      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 396      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 397  
 398      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 399      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 400      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
 401      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 402      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 403  }
 404  
 405  }  // t7
 406  
 407  namespace t8
 408  {
 409  
 410  struct A1
 411  {
 412      char _[43981];
 413      virtual ~A1() {}
 414  
 415      A1* getA1() {return this;}
 416  };
 417  
 418  struct A2
 419  {
 420      char _[34981];
 421      virtual ~A2() {}
 422  
 423      A2* getA2() {return this;}
 424  };
 425  
 426  struct A3
 427      : private A1,
 428        public A2
 429  {
 430      char _[93481];
 431      virtual ~A3() {}
 432  
 433      A1* getA1() {return this;}
 434      A2* getA2() {return this;}
 435      A3* getA3() {return this;}
 436  };
 437  
 438  void test()
 439  {
 440      A1 a1;
 441      A2 a2;
 442      A3 a3;
 443      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 444      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 445      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 446      assert(dynamic_cast<A1*>(a3.getA2()) == 0);
 447  
 448      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 449      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 450      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 451      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 452      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 453  
 454      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 455      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 456      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 457      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 458      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 459  }
 460  
 461  }  // t8
 462  
 463  namespace t9
 464  {
 465  
 466  struct A1
 467  {
 468      char _[43981];
 469      virtual ~A1() {}
 470  
 471      A1* getA1() {return this;}
 472  };
 473  
 474  struct A2
 475  {
 476      char _[34981];
 477      virtual ~A2() {}
 478  
 479      A2* getA2() {return this;}
 480  };
 481  
 482  struct A3
 483      : private virtual A1,
 484        public A2
 485  {
 486      char _[93481];
 487      virtual ~A3() {}
 488  
 489      A1* getA1() {return this;}
 490      A2* getA2() {return this;}
 491      A3* getA3() {return this;}
 492  };
 493  
 494  void test()
 495  {
 496      A1 a1;
 497      A2 a2;
 498      A3 a3;
 499      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 500      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 501      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 502      assert(dynamic_cast<A1*>(a3.getA2()) == 0);
 503  
 504      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 505      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 506      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 507      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 508      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 509  
 510      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 511      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 512      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 513      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 514      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 515  }
 516  
 517  }  // t9
 518  
 519  namespace t10
 520  {
 521  
 522  struct A1
 523  {
 524      char _[43981];
 525      virtual ~A1() {}
 526  
 527      A1* getA1() {return this;}
 528  };
 529  
 530  struct A2
 531  {
 532      char _[34981];
 533      virtual ~A2() {}
 534  
 535      A2* getA2() {return this;}
 536  };
 537  
 538  struct A3
 539      : public virtual A1,
 540        public virtual A2
 541  {
 542      char _[93481];
 543      virtual ~A3() {}
 544  
 545      A1* getA1() {return this;}
 546      A2* getA2() {return this;}
 547      A3* getA3() {return this;}
 548  };
 549  
 550  void test()
 551  {
 552      A1 a1;
 553      A2 a2;
 554      A3 a3;
 555      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 556      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 557      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 558      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
 559      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
 560  
 561      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 562      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 563      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
 564      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 565      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 566  
 567      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 568      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 569      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
 570      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 571      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 572  }
 573  
 574  }  // t10
 575  
 576  namespace t11
 577  {
 578  
 579  struct A1
 580  {
 581      char _[43981];
 582      virtual ~A1() {}
 583  
 584      A1* getA1() {return this;}
 585  };
 586  
 587  struct A2
 588  {
 589      char _[34981];
 590      virtual ~A2() {}
 591  
 592      A2* getA2() {return this;}
 593  };
 594  
 595  struct A3
 596      : private A1,
 597        public virtual A2
 598  {
 599      char _[93481];
 600      virtual ~A3() {}
 601  
 602      A1* getA1() {return this;}
 603      A2* getA2() {return this;}
 604      A3* getA3() {return this;}
 605  };
 606  
 607  void test()
 608  {
 609      A1 a1;
 610      A2 a2;
 611      A3 a3;
 612      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 613      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 614      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 615      assert(dynamic_cast<A1*>(a3.getA2()) == 0);
 616  
 617      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 618      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 619      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 620      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 621      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 622  
 623      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 624      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 625      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 626      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 627      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 628  }
 629  
 630  }  // t11
 631  
 632  namespace t12
 633  {
 634  
 635  struct A1
 636  {
 637      char _[43981];
 638      virtual ~A1() {}
 639  
 640      A1* getA1() {return this;}
 641  };
 642  
 643  struct A2
 644  {
 645      char _[34981];
 646      virtual ~A2() {}
 647  
 648      A2* getA2() {return this;}
 649  };
 650  
 651  struct A3
 652      : private virtual A1,
 653        public virtual A2
 654  {
 655      char _[93481];
 656      virtual ~A3() {}
 657  
 658      A1* getA1() {return this;}
 659      A2* getA2() {return this;}
 660      A3* getA3() {return this;}
 661  };
 662  
 663  void test()
 664  {
 665      A1 a1;
 666      A2 a2;
 667      A3 a3;
 668      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 669      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 670      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 671      assert(dynamic_cast<A1*>(a3.getA2()) == 0);
 672  
 673      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 674      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 675      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 676      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 677      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 678  
 679      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 680      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 681      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 682      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 683      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 684  }
 685  
 686  }  // t12
 687  
 688  namespace t13
 689  {
 690  
 691  struct A1
 692  {
 693      char _[43981];
 694      virtual ~A1() {}
 695  
 696      A1* getA1() {return this;}
 697  };
 698  
 699  struct A2
 700  {
 701      char _[34981];
 702      virtual ~A2() {}
 703  
 704      A2* getA2() {return this;}
 705  };
 706  
 707  struct A3
 708      : private A1,
 709        private A2
 710  {
 711      char _[93481];
 712      virtual ~A3() {}
 713  
 714      A1* getA1() {return this;}
 715      A2* getA2() {return this;}
 716      A3* getA3() {return this;}
 717  };
 718  
 719  void test()
 720  {
 721      A1 a1;
 722      A2 a2;
 723      A3 a3;
 724      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 725      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 726      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 727      assert(dynamic_cast<A1*>(a3.getA2()) == 0);
 728  
 729      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 730      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 731      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 732      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 733  
 734      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 735      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 736      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 737      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
 738      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 739  }
 740  
 741  }  // t13
 742  
 743  namespace t14
 744  {
 745  
 746  struct A1
 747  {
 748      char _[43981];
 749      virtual ~A1() {}
 750  
 751      A1* getA1() {return this;}
 752  };
 753  
 754  struct A2
 755  {
 756      char _[34981];
 757      virtual ~A2() {}
 758  
 759      A2* getA2() {return this;}
 760  };
 761  
 762  struct A3
 763      : private virtual A1,
 764        private A2
 765  {
 766      char _[93481];
 767      virtual ~A3() {}
 768  
 769      A1* getA1() {return this;}
 770      A2* getA2() {return this;}
 771      A3* getA3() {return this;}
 772  };
 773  
 774  void test()
 775  {
 776      A1 a1;
 777      A2 a2;
 778      A3 a3;
 779      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 780      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 781      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 782      assert(dynamic_cast<A1*>(a3.getA2()) == 0);
 783  
 784      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 785      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 786      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 787      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 788  
 789      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 790      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 791      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 792      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
 793      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 794  }
 795  
 796  }  // t14
 797  
 798  namespace t15
 799  {
 800  
 801  struct A1
 802  {
 803      char _[43981];
 804      virtual ~A1() {}
 805  
 806      A1* getA1() {return this;}
 807  };
 808  
 809  struct A2
 810  {
 811      char _[34981];
 812      virtual ~A2() {}
 813  
 814      A2* getA2() {return this;}
 815  };
 816  
 817  struct A3
 818      : private virtual A1,
 819        private virtual A2
 820  {
 821      char _[93481];
 822      virtual ~A3() {}
 823  
 824      A1* getA1() {return this;}
 825      A2* getA2() {return this;}
 826      A3* getA3() {return this;}
 827  };
 828  
 829  void test()
 830  {
 831      A1 a1;
 832      A2 a2;
 833      A3 a3;
 834      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 835      assert(dynamic_cast<A1*>(a2.getA2()) == 0);
 836      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 837      assert(dynamic_cast<A1*>(a3.getA2()) == 0);
 838  
 839      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 840      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 841      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
 842      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 843  
 844      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 845      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 846      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
 847      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
 848      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 849  }
 850  
 851  }  // t15
 852  
 853  /*
 854  
 855  A1
 856  |
 857  A2
 858  |
 859  A3
 860  
 861  */
 862  
 863  namespace t16
 864  {
 865  
 866  struct A1
 867  {
 868      char _[43981];
 869      virtual ~A1() {}
 870  
 871      A1* getA1() {return this;}
 872  };
 873  
 874  struct A2
 875      : public A1
 876  {
 877      char _[34981];
 878      virtual ~A2() {}
 879  
 880      A1* getA1() {return this;}
 881      A2* getA2() {return this;}
 882  };
 883  
 884  struct A3
 885      : public A2
 886  {
 887      char _[93481];
 888      virtual ~A3() {}
 889  
 890      A1* getA1() {return this;}
 891      A2* getA2() {return this;}
 892      A3* getA3() {return this;}
 893  };
 894  
 895  void test()
 896  {
 897      A1 a1;
 898      A2 a2;
 899      A3 a3;
 900      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 901      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
 902      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
 903      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 904      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
 905      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
 906  
 907      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 908      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
 909      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 910      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
 911      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 912      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 913  
 914      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 915      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
 916      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 917      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
 918      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 919      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 920  }
 921  
 922  }  // t16
 923  
 924  namespace t17
 925  {
 926  
 927  struct A1
 928  {
 929      char _[43981];
 930      virtual ~A1() {}
 931  
 932      A1* getA1() {return this;}
 933  };
 934  
 935  struct A2
 936      : public virtual A1
 937  {
 938      char _[34981];
 939      virtual ~A2() {}
 940  
 941      A1* getA1() {return this;}
 942      A2* getA2() {return this;}
 943  };
 944  
 945  struct A3
 946      : public A2
 947  {
 948      char _[93481];
 949      virtual ~A3() {}
 950  
 951      A1* getA1() {return this;}
 952      A2* getA2() {return this;}
 953      A3* getA3() {return this;}
 954  };
 955  
 956  void test()
 957  {
 958      A1 a1;
 959      A2 a2;
 960      A3 a3;
 961      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
 962      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
 963      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
 964      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
 965      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
 966      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
 967  
 968      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
 969      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
 970      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
 971      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
 972      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
 973      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
 974  
 975      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
 976      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
 977      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
 978      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
 979      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
 980      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
 981  }
 982  
 983  }  // t17
 984  
 985  namespace t18
 986  {
 987  
 988  struct A1
 989  {
 990      char _[43981];
 991      virtual ~A1() {}
 992  
 993      A1* getA1() {return this;}
 994  };
 995  
 996  struct A2
 997      : private A1
 998  {
 999      char _[34981];
1000      virtual ~A2() {}
1001  
1002      A1* getA1() {return this;}
1003      A2* getA2() {return this;}
1004  };
1005  
1006  struct A3
1007      : public A2
1008  {
1009      char _[93481];
1010      virtual ~A3() {}
1011  
1012      A2* getA2() {return this;}
1013      A3* getA3() {return this;}
1014  };
1015  
1016  void test()
1017  {
1018      A1 a1;
1019      A2 a2;
1020      A3 a3;
1021      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1022      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1023      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1024  
1025      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1026      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1027      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1028      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
1029      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1030      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1031  
1032      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1033      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1034      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1035      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
1036      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1037      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1038  }
1039  
1040  }  // t18
1041  
1042  namespace t19
1043  {
1044  
1045  struct A1
1046  {
1047      char _[43981];
1048      virtual ~A1() {}
1049  
1050      A1* getA1() {return this;}
1051  };
1052  
1053  struct A2
1054      : protected virtual A1
1055  {
1056      char _[34981];
1057      virtual ~A2() {}
1058  
1059      A1* getA1() {return this;}
1060      A2* getA2() {return this;}
1061  };
1062  
1063  struct A3
1064      : public A2
1065  {
1066      char _[93481];
1067      virtual ~A3() {}
1068  
1069      A2* getA2() {return this;}
1070      A3* getA3() {return this;}
1071  };
1072  
1073  void test()
1074  {
1075      A1 a1;
1076      A2 a2;
1077      A3 a3;
1078      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1079      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1080      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1081  
1082      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1083      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1084      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1085      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
1086      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1087      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1088  
1089      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1090      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1091      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1092      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
1093      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1094      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1095  }
1096  
1097  }  // t19
1098  
1099  namespace t20
1100  {
1101  
1102  struct A1
1103  {
1104      char _[43981];
1105      virtual ~A1() {}
1106  
1107      A1* getA1() {return this;}
1108  };
1109  
1110  struct A2
1111      : public virtual A1
1112  {
1113      char _[34981];
1114      virtual ~A2() {}
1115  
1116      A1* getA1() {return this;}
1117      A2* getA2() {return this;}
1118  };
1119  
1120  struct A3
1121      : public virtual A2
1122  {
1123      char _[93481];
1124      virtual ~A3() {}
1125  
1126      A1* getA1() {return this;}
1127      A2* getA2() {return this;}
1128      A3* getA3() {return this;}
1129  };
1130  
1131  void test()
1132  {
1133      A1 a1;
1134      A2 a2;
1135      A3 a3;
1136      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1137      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1138      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
1139      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1140      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1141      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1142  
1143      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1144      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
1145      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1146      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1147      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1148      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1149  
1150      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1151      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1152      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1153      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1154      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1155      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1156  }
1157  
1158  }  // t20
1159  
1160  namespace t21
1161  {
1162  
1163  struct A1
1164  {
1165      char _[43981];
1166      virtual ~A1() {}
1167  
1168      A1* getA1() {return this;}
1169  };
1170  
1171  struct A2
1172      : private A1
1173  {
1174      char _[34981];
1175      virtual ~A2() {}
1176  
1177      A1* getA1() {return this;}
1178      A2* getA2() {return this;}
1179  };
1180  
1181  struct A3
1182      : public virtual A2
1183  {
1184      char _[93481];
1185      virtual ~A3() {}
1186  
1187      A2* getA2() {return this;}
1188      A3* getA3() {return this;}
1189  };
1190  
1191  void test()
1192  {
1193      A1 a1;
1194      A2 a2;
1195      A3 a3;
1196      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1197      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1198      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1199  
1200      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1201      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1202      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1203      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
1204      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1205      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1206  
1207      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1208      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1209      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1210      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
1211      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1212      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1213  }
1214  
1215  }  // t21
1216  
1217  namespace t22
1218  {
1219  
1220  struct A1
1221  {
1222      char _[43981];
1223      virtual ~A1() {}
1224  
1225      A1* getA1() {return this;}
1226  };
1227  
1228  struct A2
1229      : protected virtual A1
1230  {
1231      char _[34981];
1232      virtual ~A2() {}
1233  
1234      A1* getA1() {return this;}
1235      A2* getA2() {return this;}
1236  };
1237  
1238  struct A3
1239      : public virtual A2
1240  {
1241      char _[93481];
1242      virtual ~A3() {}
1243  
1244      A2* getA2() {return this;}
1245      A3* getA3() {return this;}
1246  };
1247  
1248  void test()
1249  {
1250      A1 a1;
1251      A2 a2;
1252      A3 a3;
1253      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1254      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1255      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1256  
1257      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1258      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1259      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1260      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
1261      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1262      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1263  
1264      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1265      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1266      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1267      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
1268      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1269      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1270  }
1271  
1272  }  // t22
1273  
1274  namespace t23
1275  {
1276  
1277  struct A1
1278  {
1279      char _[43981];
1280      virtual ~A1() {}
1281  
1282      A1* getA1() {return this;}
1283  };
1284  
1285  struct A2
1286      : private A1
1287  {
1288      char _[34981];
1289      virtual ~A2() {}
1290  
1291      A1* getA1() {return this;}
1292      A2* getA2() {return this;}
1293  };
1294  
1295  struct A3
1296      : private A2
1297  {
1298      char _[93481];
1299      virtual ~A3() {}
1300  
1301      t23::A1* getA1() {return A2::getA1();}
1302      A2* getA2() {return this;}
1303      A3* getA3() {return this;}
1304  };
1305  
1306  void test()
1307  {
1308      A1 a1;
1309      A2 a2;
1310      A3 a3;
1311      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1312      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1313      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1314  
1315      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1316      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1317      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1318      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
1319      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1320  
1321      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1322      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1323      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1324      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
1325      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
1326      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1327  }
1328  
1329  }  // t23
1330  
1331  namespace t24
1332  {
1333  
1334  struct A1
1335  {
1336      char _[43981];
1337      virtual ~A1() {}
1338  
1339      A1* getA1() {return this;}
1340  };
1341  
1342  struct A2
1343      : protected virtual A1
1344  {
1345      char _[34981];
1346      virtual ~A2() {}
1347  
1348      A1* getA1() {return this;}
1349      A2* getA2() {return this;}
1350  };
1351  
1352  struct A3
1353      : private A2
1354  {
1355      char _[93481];
1356      virtual ~A3() {}
1357  
1358      t24::A1* getA1() {return A2::getA1();}
1359      A2* getA2() {return this;}
1360      A3* getA3() {return this;}
1361  };
1362  
1363  void test()
1364  {
1365      A1 a1;
1366      A2 a2;
1367      A3 a3;
1368      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1369      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1370      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1371  
1372      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1373      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1374      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1375      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
1376      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1377  
1378      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1379      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1380      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1381      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
1382      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
1383      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1384  }
1385  
1386  }  // t24
1387  
1388  namespace t25
1389  {
1390  
1391  struct A1
1392  {
1393      char _[43981];
1394      virtual ~A1() {}
1395  
1396      A1* getA1() {return this;}
1397  };
1398  
1399  struct A2
1400      : protected virtual A1
1401  {
1402      char _[34981];
1403      virtual ~A2() {}
1404  
1405      A1* getA1() {return this;}
1406      A2* getA2() {return this;}
1407  };
1408  
1409  struct A3
1410      : private virtual A2
1411  {
1412      char _[93481];
1413      virtual ~A3() {}
1414  
1415      t25::A1* getA1() {return A2::getA1();}
1416      A2* getA2() {return this;}
1417      A3* getA3() {return this;}
1418  };
1419  
1420  void test()
1421  {
1422      A1 a1;
1423      A2 a2;
1424      A3 a3;
1425      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1426      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1427      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1428  
1429      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1430      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1431      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1432      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
1433      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1434  
1435      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1436      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1437      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1438      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
1439      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
1440      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1441  }
1442  
1443  }  // t25
1444  
1445  /*
1446  
1447  A1 A1
1448  |  |
1449  A2 |
1450   \ |
1451    A3
1452  
1453  */
1454  
1455  namespace t26
1456  {
1457  
1458  struct A1
1459  {
1460      char _[43981];
1461      virtual ~A1() {}
1462  
1463      A1* getA1() {return this;}
1464  };
1465  
1466  struct A2
1467      : public A1
1468  {
1469      char _[34981];
1470      virtual ~A2() {}
1471  
1472      A1* getA1() {return this;}
1473      A2* getA2() {return this;}
1474  };
1475  
1476  struct A3
1477      : public A1,
1478        public A2
1479  {
1480      char _[93481];
1481      virtual ~A3() {}
1482  
1483      A1* getA12() {return A2::getA1();}
1484      A2* getA2() {return this;}
1485      A3* getA3() {return this;}
1486  };
1487  
1488  void test()
1489  {
1490      A1 a1;
1491      A2 a2;
1492      A3 a3;
1493      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1494      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1495      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
1496      assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12());
1497      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12());
1498  
1499      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1500      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
1501      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1502      assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2());
1503      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1504      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1505  
1506      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1507      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1508      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1509      assert(dynamic_cast<A3*>(a3.getA12()) == a3.getA3());
1510      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1511      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1512  }
1513  
1514  }  // t26
1515  
1516  namespace t27
1517  {
1518  
1519  struct A1
1520  {
1521      char _[43981];
1522      virtual ~A1() {}
1523  
1524      A1* getA1() {return this;}
1525  };
1526  
1527  struct A2
1528      : private A1
1529  {
1530      char _[34981];
1531      virtual ~A2() {}
1532  
1533      A1* getA1() {return this;}
1534      A2* getA2() {return this;}
1535  };
1536  
1537  struct A3
1538      : public A1,
1539        public A2
1540  {
1541      char _[93481];
1542      virtual ~A3() {}
1543  
1544      A1* getA12() {return A2::getA1();}
1545      A2* getA2() {return this;}
1546      A3* getA3() {return this;}
1547  };
1548  
1549  void test()
1550  {
1551      A1 a1;
1552      A2 a2;
1553      A3 a3;
1554      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1555      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1556      assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12());
1557  
1558      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1559      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1560      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1561      assert(dynamic_cast<A2*>(a3.getA12()) == 0);
1562      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1563      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1564  
1565      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1566      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1567      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1568      assert(dynamic_cast<A3*>(a3.getA12()) == 0);
1569      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1570      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1571  }
1572  
1573  }  // t27
1574  
1575  namespace t28
1576  {
1577  
1578  struct A1
1579  {
1580      char _[43981];
1581      virtual ~A1() {}
1582  
1583      A1* getA1() {return this;}
1584  };
1585  
1586  struct A2
1587      : public A1
1588  {
1589      char _[34981];
1590      virtual ~A2() {}
1591  
1592      A1* getA1() {return this;}
1593      A2* getA2() {return this;}
1594  };
1595  
1596  struct A3
1597      : private A1,
1598        public A2
1599  {
1600      char _[93481];
1601      virtual ~A3() {}
1602  
1603      A1* getA12() {return A2::getA1();}
1604      A2* getA2() {return this;}
1605      A3* getA3() {return this;}
1606  };
1607  
1608  void test()
1609  {
1610      A1 a1;
1611      A2 a2;
1612      A3 a3;
1613      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1614      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1615      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
1616      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12());
1617  
1618      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1619      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
1620      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1621      assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2());
1622      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1623      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1624  
1625      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1626      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1627      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1628      assert(dynamic_cast<A3*>(a3.getA12()) == a3.getA3());
1629      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1630      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1631  }
1632  
1633  }  // t28
1634  
1635  namespace t29
1636  {
1637  
1638  struct A1
1639  {
1640      char _[43981];
1641      virtual ~A1() {}
1642  
1643      A1* getA1() {return this;}
1644  };
1645  
1646  struct A2
1647      : public A1
1648  {
1649      char _[34981];
1650      virtual ~A2() {}
1651  
1652      A1* getA1() {return this;}
1653      A2* getA2() {return this;}
1654  };
1655  
1656  struct A3
1657      : public A1,
1658        private A2
1659  {
1660      char _[93481];
1661      virtual ~A3() {}
1662  
1663      A1* getA12() {return A2::getA1();}
1664      A2* getA2() {return this;}
1665      A3* getA3() {return this;}
1666  };
1667  
1668  void test()
1669  {
1670      A1 a1;
1671      A2 a2;
1672      A3 a3;
1673      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1674      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1675      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
1676      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12());
1677  
1678      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1679      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
1680      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1681      assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2());
1682      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1683  
1684      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1685      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1686      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1687      assert(dynamic_cast<A3*>(a3.getA12()) == 0);
1688      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
1689      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1690  }
1691  
1692  }  // t29
1693  
1694  namespace t30
1695  {
1696  
1697  struct A1
1698  {
1699      char _[43981];
1700      virtual ~A1() {}
1701  
1702      A1* getA1() {return this;}
1703  };
1704  
1705  struct A2
1706      : public A1
1707  {
1708      char _[34981];
1709      virtual ~A2() {}
1710  
1711      A1* getA1() {return this;}
1712      A2* getA2() {return this;}
1713  };
1714  
1715  struct A3
1716      : private A1,
1717        private A2
1718  {
1719      char _[93481];
1720      virtual ~A3() {}
1721  
1722      A1* getA12() {return A2::getA1();}
1723      A2* getA2() {return this;}
1724      A3* getA3() {return this;}
1725  };
1726  
1727  void test()
1728  {
1729      A1 a1;
1730      A2 a2;
1731      A3 a3;
1732      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1733      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1734      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
1735      assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12());
1736      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA12());
1737  
1738      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1739      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
1740      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1741      assert(dynamic_cast<A2*>(a3.getA12()) == a3.getA2());
1742      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1743  
1744      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1745      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1746      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1747      assert(dynamic_cast<A3*>(a3.getA12()) == 0);
1748      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
1749      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1750  }
1751  
1752  }  // t30
1753  
1754  namespace t31
1755  {
1756  
1757  struct A1
1758  {
1759      char _[43981];
1760      virtual ~A1() {}
1761  
1762      A1* getA1() {return this;}
1763  };
1764  
1765  struct A2
1766      : private A1
1767  {
1768      char _[34981];
1769      virtual ~A2() {}
1770  
1771      A1* getA1() {return this;}
1772      A2* getA2() {return this;}
1773  };
1774  
1775  struct A3
1776      : public A1,
1777        private A2
1778  {
1779      char _[93481];
1780      virtual ~A3() {}
1781  
1782      A1* getA12() {return A2::getA1();}
1783      A2* getA2() {return this;}
1784      A3* getA3() {return this;}
1785  };
1786  
1787  void test()
1788  {
1789      A1 a1;
1790      A2 a2;
1791      A3 a3;
1792      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1793      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1794      assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12());
1795  
1796      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1797      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1798      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1799      assert(dynamic_cast<A2*>(a3.getA12()) == 0);
1800      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1801  
1802      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1803      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1804      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1805      assert(dynamic_cast<A3*>(a3.getA12()) == 0);
1806      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
1807      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1808  }
1809  
1810  }  // t31
1811  
1812  namespace t32
1813  {
1814  
1815  struct A1
1816  {
1817      char _[43981];
1818      virtual ~A1() {}
1819  
1820      A1* getA1() {return this;}
1821  };
1822  
1823  struct A2
1824      : private A1
1825  {
1826      char _[34981];
1827      virtual ~A2() {}
1828  
1829      A1* getA1() {return this;}
1830      A2* getA2() {return this;}
1831  };
1832  
1833  struct A3
1834      : private A1,
1835        public A2
1836  {
1837      char _[93481];
1838      virtual ~A3() {}
1839  
1840      A1* getA12() {return A2::getA1();}
1841      A2* getA2() {return this;}
1842      A3* getA3() {return this;}
1843  };
1844  
1845  void test()
1846  {
1847      A1 a1;
1848      A2 a2;
1849      A3 a3;
1850      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1851      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1852      assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12());
1853  
1854      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1855      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1856      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1857      assert(dynamic_cast<A2*>(a3.getA12()) == 0);
1858      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1859  
1860      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1861      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1862      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1863      assert(dynamic_cast<A3*>(a3.getA12()) == 0);
1864      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1865      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1866  }
1867  
1868  }  // t32
1869  
1870  namespace t33
1871  {
1872  
1873  struct A1
1874  {
1875      char _[43981];
1876      virtual ~A1() {}
1877  
1878      A1* getA1() {return this;}
1879  };
1880  
1881  struct A2
1882      : private A1
1883  {
1884      char _[34981];
1885      virtual ~A2() {}
1886  
1887      A1* getA1() {return this;}
1888      A2* getA2() {return this;}
1889  };
1890  
1891  struct A3
1892      : private A1,
1893        private A2
1894  {
1895      char _[93481];
1896      virtual ~A3() {}
1897  
1898      A1* getA12() {return A2::getA1();}
1899      A2* getA2() {return this;}
1900      A3* getA3() {return this;}
1901  };
1902  
1903  void test()
1904  {
1905      A1 a1;
1906      A2 a2;
1907      A3 a3;
1908      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1909      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1910      assert(dynamic_cast<A1*>(a3.getA12()) == a3.getA12());
1911  
1912      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1913      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
1914      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1915      assert(dynamic_cast<A2*>(a3.getA12()) == 0);
1916      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1917  
1918      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1919      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1920      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1921      assert(dynamic_cast<A3*>(a3.getA12()) == 0);
1922      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
1923      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1924  }
1925  
1926  }  // t33
1927  
1928  /*
1929  
1930  A1
1931  | \
1932  A2 \
1933   \ |
1934    A3
1935  
1936  */
1937  
1938  namespace t34
1939  {
1940  
1941  struct A1
1942  {
1943      char _[43981];
1944      virtual ~A1() {}
1945  
1946      A1* getA1() {return this;}
1947  };
1948  
1949  struct A2
1950      : public virtual A1
1951  {
1952      char _[34981];
1953      virtual ~A2() {}
1954  
1955      A1* getA1() {return this;}
1956      A2* getA2() {return this;}
1957  };
1958  
1959  struct A3
1960      : public virtual A1,
1961        public A2
1962  {
1963      char _[93481];
1964      virtual ~A3() {}
1965  
1966      A1* getA1() {return A1::getA1();}
1967      A2* getA2() {return this;}
1968      A3* getA3() {return this;}
1969  };
1970  
1971  void test()
1972  {
1973      A1 a1;
1974      A2 a2;
1975      A3 a3;
1976      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1977      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
1978      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
1979      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1980      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1981      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1982  
1983      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1984      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
1985      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1986      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1987      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1988      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1989  
1990      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1991      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
1992      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1993      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1994      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1995      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1996  }
1997  
1998  }  // t34
1999  
2000  namespace t35
2001  {
2002  
2003  struct A1
2004  {
2005      char _[43981];
2006      virtual ~A1() {}
2007  
2008      A1* getA1() {return this;}
2009  };
2010  
2011  struct A2
2012      : private virtual A1
2013  {
2014      char _[34981];
2015      virtual ~A2() {}
2016  
2017      A1* getA1() {return this;}
2018      A2* getA2() {return this;}
2019  };
2020  
2021  struct A3
2022      : public virtual A1,
2023        public A2
2024  {
2025      char _[93481];
2026      virtual ~A3() {}
2027  
2028      A1* getA1() {return A1::getA1();}
2029      A2* getA2() {return this;}
2030      A3* getA3() {return this;}
2031  };
2032  
2033  void test()
2034  {
2035      A1 a1;
2036      A2 a2;
2037      A3 a3;
2038      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
2039      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
2040      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
2041      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
2042  
2043      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
2044      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
2045      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
2046      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
2047      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
2048      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
2049  
2050      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
2051      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
2052      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
2053      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
2054      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
2055      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
2056  }
2057  
2058  }  // t35
2059  
2060  namespace t36
2061  {
2062  
2063  struct A1
2064  {
2065      char _[43981];
2066      virtual ~A1() {}
2067  
2068      A1* getA1() {return this;}
2069  };
2070  
2071  struct A2
2072      : public virtual A1
2073  {
2074      char _[34981];
2075      virtual ~A2() {}
2076  
2077      A1* getA1() {return this;}
2078      A2* getA2() {return this;}
2079  };
2080  
2081  struct A3
2082      : private virtual A1,
2083        public A2
2084  {
2085      char _[93481];
2086      virtual ~A3() {}
2087  
2088      A1* getA1() {return A1::getA1();}
2089      A2* getA2() {return this;}
2090      A3* getA3() {return this;}
2091  };
2092  
2093  void test()
2094  {
2095      A1 a1;
2096      A2 a2;
2097      A3 a3;
2098      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
2099      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
2100      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
2101      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
2102      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
2103      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
2104  
2105      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
2106      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
2107      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
2108      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
2109      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
2110      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
2111  
2112      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
2113      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
2114      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
2115      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
2116      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
2117      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
2118  }
2119  
2120  }  // t36
2121  
2122  namespace t37
2123  {
2124  
2125  struct A1
2126  {
2127      char _[43981];
2128      virtual ~A1() {}
2129  
2130      A1* getA1() {return this;}
2131  };
2132  
2133  struct A2
2134      : public virtual A1
2135  {
2136      char _[34981];
2137      virtual ~A2() {}
2138  
2139      A1* getA1() {return this;}
2140      A2* getA2() {return this;}
2141  };
2142  
2143  struct A3
2144      : public virtual A1,
2145        private A2
2146  {
2147      char _[93481];
2148      virtual ~A3() {}
2149  
2150      A1* getA1() {return A1::getA1();}
2151      A2* getA2() {return this;}
2152      A3* getA3() {return this;}
2153  };
2154  
2155  void test()
2156  {
2157      A1 a1;
2158      A2 a2;
2159      A3 a3;
2160      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
2161      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
2162      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
2163      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
2164      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
2165      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
2166  
2167      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
2168      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
2169      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
2170      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
2171      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
2172  
2173      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
2174      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
2175      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
2176      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
2177      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
2178      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
2179  }
2180  
2181  }  // t37
2182  
2183  namespace t38
2184  {
2185  
2186  struct A1
2187  {
2188      char _[43981];
2189      virtual ~A1() {}
2190  
2191      A1* getA1() {return this;}
2192  };
2193  
2194  struct A2
2195      : public virtual A1
2196  {
2197      char _[34981];
2198      virtual ~A2() {}
2199  
2200      A1* getA1() {return this;}
2201      A2* getA2() {return this;}
2202  };
2203  
2204  struct A3
2205      : private virtual A1,
2206        private A2
2207  {
2208      char _[93481];
2209      virtual ~A3() {}
2210  
2211      A1* getA1() {return A1::getA1();}
2212      A2* getA2() {return this;}
2213      A3* getA3() {return this;}
2214  };
2215  
2216  void test()
2217  {
2218      A1 a1;
2219      A2 a2;
2220      A3 a3;
2221      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
2222      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
2223      assert(dynamic_cast<A1*>(a2.getA2()) == a2.getA1());
2224      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
2225      assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
2226  
2227      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
2228      assert(dynamic_cast<A2*>(a2.getA1()) == a2.getA2());
2229      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
2230      assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
2231      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
2232  
2233      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
2234      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
2235      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
2236      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
2237      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
2238      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
2239  }
2240  
2241  }  // t38
2242  
2243  namespace t39
2244  {
2245  
2246  struct A1
2247  {
2248      char _[43981];
2249      virtual ~A1() {}
2250  
2251      A1* getA1() {return this;}
2252  };
2253  
2254  struct A2
2255      : private virtual A1
2256  {
2257      char _[34981];
2258      virtual ~A2() {}
2259  
2260      A1* getA1() {return this;}
2261      A2* getA2() {return this;}
2262  };
2263  
2264  struct A3
2265      : public virtual A1,
2266        private A2
2267  {
2268      char _[93481];
2269      virtual ~A3() {}
2270  
2271      A1* getA1() {return A1::getA1();}
2272      A2* getA2() {return this;}
2273      A3* getA3() {return this;}
2274  };
2275  
2276  void test()
2277  {
2278      A1 a1;
2279      A2 a2;
2280      A3 a3;
2281      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
2282      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
2283      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
2284      assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
2285  
2286      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
2287      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
2288      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
2289      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
2290      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
2291  
2292      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
2293      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
2294      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
2295      assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
2296      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
2297      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
2298  }
2299  
2300  }  // t39
2301  
2302  namespace t40
2303  {
2304  
2305  struct A1
2306  {
2307      char _[43981];
2308      virtual ~A1() {}
2309  
2310      A1* getA1() {return this;}
2311  };
2312  
2313  struct A2
2314      : private virtual A1
2315  {
2316      char _[34981];
2317      virtual ~A2() {}
2318  
2319      A1* getA1() {return this;}
2320      A2* getA2() {return this;}
2321  };
2322  
2323  struct A3
2324      : private virtual A1,
2325        public A2
2326  {
2327      char _[93481];
2328      virtual ~A3() {}
2329  
2330      A1* getA1() {return A1::getA1();}
2331      A2* getA2() {return this;}
2332      A3* getA3() {return this;}
2333  };
2334  
2335  void test()
2336  {
2337      A1 a1;
2338      A2 a2;
2339      A3 a3;
2340      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
2341      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
2342      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
2343  
2344      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
2345      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
2346      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
2347      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
2348      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
2349      assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
2350  
2351      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
2352      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
2353      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
2354      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
2355      assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
2356      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
2357  }
2358  
2359  }  // t40
2360  
2361  namespace t41
2362  {
2363  
2364  struct A1
2365  {
2366      char _[43981];
2367      virtual ~A1() {}
2368  
2369      A1* getA1() {return this;}
2370  };
2371  
2372  struct A2
2373      : private virtual A1
2374  {
2375      char _[34981];
2376      virtual ~A2() {}
2377  
2378      A1* getA1() {return this;}
2379      A2* getA2() {return this;}
2380  };
2381  
2382  struct A3
2383      : private virtual A1,
2384        private A2
2385  {
2386      char _[93481];
2387      virtual ~A3() {}
2388  
2389      A1* getA1() {return A1::getA1();}
2390      A2* getA2() {return this;}
2391      A3* getA3() {return this;}
2392  };
2393  
2394  void test()
2395  {
2396      A1 a1;
2397      A2 a2;
2398      A3 a3;
2399      assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
2400      assert(dynamic_cast<A1*>(a2.getA1()) == a2.getA1());
2401      assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
2402  
2403      assert(dynamic_cast<A2*>(a1.getA1()) == 0);
2404      assert(dynamic_cast<A2*>(a2.getA1()) == 0);
2405      assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
2406      assert(dynamic_cast<A2*>(a3.getA1()) == 0);
2407      assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
2408  
2409      assert(dynamic_cast<A3*>(a1.getA1()) == 0);
2410      assert(dynamic_cast<A3*>(a2.getA1()) == 0);
2411      assert(dynamic_cast<A3*>(a2.getA2()) == 0);
2412      assert(dynamic_cast<A3*>(a3.getA1()) == 0);
2413      assert(dynamic_cast<A3*>(a3.getA2()) == 0);
2414      assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
2415  }
2416  
2417  }  // t41
2418  
2419  int main(int, char**)
2420  {
2421      timer t;
2422      t1::test();
2423      t2::test();
2424      t3::test();
2425      t4::test();
2426      t5::test();
2427      t6::test();
2428      t7::test();
2429      t8::test();
2430      t9::test();
2431      t10::test();
2432      t11::test();
2433      t12::test();
2434      t13::test();
2435      t14::test();
2436      t15::test();
2437      t16::test();
2438      t17::test();
2439      t18::test();
2440      t19::test();
2441      t20::test();
2442      t21::test();
2443      t22::test();
2444      t23::test();
2445      t24::test();
2446      t25::test();
2447      t26::test();
2448      t27::test();
2449      t28::test();
2450      t29::test();
2451      t30::test();
2452      t31::test();
2453      t32::test();
2454      t33::test();
2455      t34::test();
2456      t35::test();
2457      t36::test();
2458      t37::test();
2459      t38::test();
2460      t39::test();
2461      t40::test();
2462      t41::test();
2463  
2464      return 0;
2465  }