summaryrefslogtreecommitdiff
path: root/test/dynamic_cast5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/dynamic_cast5.cpp')
-rw-r--r--test/dynamic_cast5.cpp1321
1 files changed, 1321 insertions, 0 deletions
diff --git a/test/dynamic_cast5.cpp b/test/dynamic_cast5.cpp
new file mode 100644
index 0000000..8986969
--- /dev/null
+++ b/test/dynamic_cast5.cpp
@@ -0,0 +1,1321 @@
+//===------------------------- dynamic_cast5.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 <cassert>
+
+namespace t1
+{
+
+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,
+ private A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A3,
+ public A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ t1::A1* getA1() {return A3::getA1();}
+ A2* getA2() {return A3::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A4,
+ public A3
+{
+ char _[13489];
+ virtual ~A5() {}
+
+ t1::A1* getA1() {return A4::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A4::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
+ assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+// assert(dynamic_cast<A2*>(a3.getA3()) == 0); // cast to private base
+ assert(dynamic_cast<A2*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+// assert(dynamic_cast<A2*>(a4.getA3()) == 0); // cast to private base
+// assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
+ assert(dynamic_cast<A2*>(a5.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+// assert(dynamic_cast<A2*>(a5.getA3()) == 0); // cast to private base
+// assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
+// assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
+ assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
+ assert(dynamic_cast<A3*>(a5.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
+// assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // t1
+
+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 virtual A1,
+ public A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A3,
+ public A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ t2::A1* getA1() {return A3::getA1();}
+ A2* getA2() {return A3::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A4,
+ public A3
+{
+ char _[13489];
+ virtual ~A5() {}
+
+ t2::A1* getA1() {return A4::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A4::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
+ assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
+ assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
+// assert(dynamic_cast<A2*>(a4.getA4()) == 0); // cast to ambiguous base
+ assert(dynamic_cast<A2*>(a5.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
+// assert(dynamic_cast<A2*>(a5.getA4()) == 0); // cast to ambiguous base
+// assert(dynamic_cast<A2*>(a5.getA5()) == 0); // cast to ambiguous base
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
+ assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
+ assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
+ assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
+ assert(dynamic_cast<A3*>(a5.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
+// assert(dynamic_cast<A3*>(a5.getA5()) == 0); // cast to ambiguous base
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // 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 A1,
+ public virtual A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A1,
+ public virtual A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A3,
+ public A4
+{
+ char _[41389];
+ virtual ~A5() {}
+
+ A1* getA14() {return A4::getA1();}
+ A1* getA13() {return A3::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
+ assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // 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
+ : protected A1,
+ public virtual A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A1,
+ public virtual A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A3,
+ public A4
+{
+ char _[41389];
+ virtual ~A5() {}
+
+ A1* getA14() {return A4::getA1();}
+ A1* getA13() {return A3::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == 0);
+// assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1()); // cast to protected base
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
+ assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+// assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13()); // cast to protected base
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // 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
+ : public A1,
+ protected virtual A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A1,
+ public virtual A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A3,
+ public A4
+{
+ char _[41389];
+ virtual ~A5() {}
+
+ A1* getA14() {return A4::getA1();}
+ A1* getA13() {return A3::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
+ assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+// assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2()); // cast to protected base
+ assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+// assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2()); // cast to protected base
+ assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // t5
+
+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 virtual A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : protected A1,
+ public virtual A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A3,
+ public A4
+{
+ char _[41389];
+ virtual ~A5() {}
+
+ A1* getA14() {return A4::getA1();}
+ A1* getA13() {return A3::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == 0);
+// assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1()); // cast to protected base
+ assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
+ assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
+// assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14()); // cast to protected base
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // 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 A1,
+ public virtual A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A1,
+ protected virtual A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A3,
+ public A4
+{
+ char _[41389];
+ virtual ~A5() {}
+
+ A1* getA14() {return A4::getA1();}
+ A1* getA13() {return A3::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
+ assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+// assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2()); // cast to protected base
+ assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
+// assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2()); // cast to protected base
+ assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // 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
+ : public A1,
+ public virtual A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A1,
+ public virtual A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : protected A3,
+ public A4
+{
+ char _[41389];
+ virtual ~A5() {}
+
+ A1* getA14() {return A4::getA1();}
+ A1* getA13() {return A3::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
+ assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == 0);
+// assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3()); // cast to protected base
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // 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
+ : public A1,
+ public virtual A2
+{
+ char _[93481];
+ virtual ~A3() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A3* getA3() {return this;}
+};
+
+struct A4
+ : public A1,
+ public virtual A2
+{
+ char _[13489];
+ virtual ~A4() {}
+
+ A1* getA1() {return A1::getA1();}
+ A2* getA2() {return A2::getA2();}
+ A4* getA4() {return this;}
+};
+
+struct A5
+ : public A3,
+ protected A4
+{
+ char _[41389];
+ virtual ~A5() {}
+
+ A1* getA14() {return A4::getA1();}
+ A1* getA13() {return A3::getA1();}
+ A2* getA2() {return A4::getA2();}
+ A3* getA3() {return A3::getA3();}
+ A4* getA4() {return A4::getA4();}
+ A5* getA5() {return this;}
+};
+
+void test()
+{
+ A1 a1;
+ A2 a2;
+ A3 a3;
+ A4 a4;
+ A5 a5;
+
+ assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
+ assert(dynamic_cast<A1*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
+ assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
+ assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
+ assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA2()) == 0);
+ assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
+ assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
+
+ assert(dynamic_cast<A2*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
+ assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
+ assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
+ assert(dynamic_cast<A2*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
+ assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
+
+ assert(dynamic_cast<A3*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
+ assert(dynamic_cast<A3*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A3*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
+ assert(dynamic_cast<A3*>(a5.getA4()) == 0);
+ assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
+
+ assert(dynamic_cast<A4*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A4*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
+ assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA13()) == 0);
+ assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
+ assert(dynamic_cast<A4*>(a5.getA3()) == 0);
+ assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
+// assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4()); // cast to protected base
+
+ assert(dynamic_cast<A5*>(a1.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a2.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a3.getA3()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA1()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA2()) == 0);
+ assert(dynamic_cast<A5*>(a4.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA14()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
+ assert(dynamic_cast<A5*>(a5.getA4()) == 0);
+ assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
+}
+
+} // t9
+
+#include <chrono>
+#include <iostream>
+
+int main()
+{
+ typedef std::chrono::high_resolution_clock Clock;
+ typedef Clock::time_point time_point;
+ typedef std::chrono::duration<double, std::micro> NS;
+ time_point t0 = Clock::now();
+ t1::test();
+ t2::test();
+ t3::test();
+ t4::test();
+ t5::test();
+ t6::test();
+ t7::test();
+ t8::test();
+ t9::test();
+ time_point t1 = Clock::now();
+ std::cout << NS(t1-t0).count() << " microseconds\n";
+}