[cfe-commits] [libcxxabi] r148047 - /libcxxabi/trunk/test/dynamic_cast5.cpp
Howard Hinnant
hhinnant at apple.com
Thu Jan 12 13:08:25 PST 2012
Author: hhinnant
Date: Thu Jan 12 15:08:25 2012
New Revision: 148047
URL: http://llvm.org/viewvc/llvm-project?rev=148047&view=rev
Log:
Oops, forgot to svn add the new test.
Added:
libcxxabi/trunk/test/dynamic_cast5.cpp
Added: libcxxabi/trunk/test/dynamic_cast5.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/dynamic_cast5.cpp?rev=148047&view=auto
==============================================================================
--- libcxxabi/trunk/test/dynamic_cast5.cpp (added)
+++ libcxxabi/trunk/test/dynamic_cast5.cpp Thu Jan 12 15:08:25 2012
@@ -0,0 +1,304 @@
+//===------------------------- 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
+
+int main()
+{
+ t1::test();
+ t2::test();
+}
More information about the cfe-commits
mailing list