//===------------------------- dynamic_cast3.cpp --------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include /* A1 A2 A3 */ namespace t1 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 { char _[93481]; virtual ~A3() {} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA3()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t1 /* A1 A2 | A3 */ namespace t2 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : public A1 { char _[93481]; virtual ~A3() {} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA3()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t2 namespace t3 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : public virtual A1 { char _[93481]; virtual ~A3() {} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA3()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t3 namespace t4 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private A1 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA3()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t4 namespace t5 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private virtual A1 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA3()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t5 /* A1 A2 \ / A3 */ namespace t6 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : public A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t6 namespace t7 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : public virtual A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t7 namespace t8 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t8 namespace t9 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private virtual A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t9 namespace t10 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : public virtual A1, public virtual A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t10 namespace t11 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private A1, public virtual A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t11 namespace t12 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private virtual A1, public virtual A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t12 namespace t13 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t13 namespace t14 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private virtual A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t14 namespace t15 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 { char _[34981]; virtual ~A2() {} A2* getA2() {return this;} }; struct A3 : private virtual A1, private virtual A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t15 /* A1 | A2 | A3 */ namespace t16 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t16 namespace t17 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t17 namespace t18 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A2 { char _[93481]; virtual ~A3() {} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t18 namespace t19 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : protected virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A2 { char _[93481]; virtual ~A3() {} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t19 namespace t20 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public virtual A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return this;} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t20 namespace t21 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public virtual A2 { char _[93481]; virtual ~A3() {} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t21 namespace t22 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : protected virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public virtual A2 { char _[93481]; virtual ~A3() {} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t22 namespace t23 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private A2 { char _[93481]; virtual ~A3() {} t23::A1* getA1() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t23 namespace t24 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : protected virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private A2 { char _[93481]; virtual ~A3() {} t24::A1* getA1() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t24 namespace t25 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : protected virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private virtual A2 { char _[93481]; virtual ~A3() {} t25::A1* getA1() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t25 /* A1 A1 | | A2 | \ | A3 */ namespace t26 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA12()) == a3.getA12()); assert(dynamic_cast(a3.getA2()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t26 namespace t27 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA12()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t27 namespace t28 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t28 namespace t29 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t29 namespace t30 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA12()) == a3.getA12()); assert(dynamic_cast(a3.getA2()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t30 namespace t31 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA12()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t31 namespace t32 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA12()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t32 namespace t33 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA12() {return A2::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA12()) == a3.getA12()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA12()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t33 /* A1 | \ A2 \ \ | A3 */ namespace t34 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public virtual A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t34 namespace t35 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public virtual A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t35 namespace t36 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private virtual A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t36 namespace t37 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public virtual A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t37 namespace t38 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : public virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private virtual A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a2.getA2()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA2()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == a2.getA2()); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == a3.getA2()); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t38 namespace t39 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : public virtual A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a3.getA3()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == a3.getA3()); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t39 namespace t40 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private virtual A1, public A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a3.getA3()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA3()); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t40 namespace t41 { struct A1 { char _[43981]; virtual ~A1() {} A1* getA1() {return this;} }; struct A2 : private virtual A1 { char _[34981]; virtual ~A2() {} A1* getA1() {return this;} A2* getA2() {return this;} }; struct A3 : private virtual A1, private A2 { char _[93481]; virtual ~A3() {} A1* getA1() {return A1::getA1();} A2* getA2() {return this;} A3* getA3() {return this;} }; void test() { A1 a1; A2 a2; A3 a3; assert(dynamic_cast(a1.getA1()) == a1.getA1()); assert(dynamic_cast(a2.getA1()) == a2.getA1()); assert(dynamic_cast(a3.getA1()) == a3.getA1()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == a2.getA2()); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == a3.getA2()); assert(dynamic_cast(a1.getA1()) == 0); assert(dynamic_cast(a2.getA1()) == 0); assert(dynamic_cast(a2.getA2()) == 0); assert(dynamic_cast(a3.getA1()) == 0); assert(dynamic_cast(a3.getA2()) == 0); assert(dynamic_cast(a3.getA3()) == a3.getA3()); } } // t41 #include #include double now_us() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1e3 + ts.tv_nsec * 1e-6; } int main() { double t0 = now_us(); t1::test(); t2::test(); t3::test(); t4::test(); t5::test(); t6::test(); t7::test(); t8::test(); t9::test(); t10::test(); t11::test(); t12::test(); t13::test(); t14::test(); t15::test(); t16::test(); t17::test(); t18::test(); t19::test(); t20::test(); t21::test(); t22::test(); t23::test(); t24::test(); t25::test(); t26::test(); t27::test(); t28::test(); t29::test(); t30::test(); t31::test(); t32::test(); t33::test(); t34::test(); t35::test(); t36::test(); t37::test(); t38::test(); t39::test(); t40::test(); t41::test(); double t1 = now_us(); printf("%.1g microseconds\n", t1 - t0); }