summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenCXX/rtti.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/rtti.cpp b/clang/test/CodeGenCXX/rtti.cpp
index d5ac986b383..f89396dd11b 100644
--- a/clang/test/CodeGenCXX/rtti.cpp
+++ b/clang/test/CodeGenCXX/rtti.cpp
@@ -1,6 +1,11 @@
// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -O0 -S %s -o %t.s
// RUN: FileCheck --input-file=%t.s %s
+// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t.ll
+// RUN: FileCheck -check-prefix LL --input-file=%t.ll %s
+
+#include <typeinfo>
+
class test1_B1 {
virtual void foo() { }
};
@@ -87,3 +92,24 @@ class test1_D : public test1_B7 {
// CHECK-NEXT: .quad (__ZTVN10__cxxabiv120__si_class_type_infoE) + 16
// CHECK-NEXT: .quad __ZTS8test1_B2
// CHECK-NEXT: .quad __ZTI8test1_B1
+
+
+class NP { };
+void test2_1();
+void test2_2(test1_D *dp) {
+ test1_D &d = *dp;
+ if (typeid(d) == typeid(test1_D))
+ test2_1();
+ if (typeid(NP) == typeid(test1_D))
+ test2_1();
+}
+
+// CHECK-LL:define void @_Z7test2_2P7test1_D(%class.test1_B7* %dp) nounwind {
+// CHECK-LL: %tmp1 = load %class.test1_B7** %d
+// CHECK-LL-NEXT: %0 = bitcast %class.test1_B7* %tmp1 to %"class.std::type_info"***
+// CHECK-LL-NEXT: %vtable = load %"class.std::type_info"*** %0
+// CHECK-LL-NEXT: %1 = getelementptr inbounds %"class.std::type_info"** %vtable, i64 -1
+// CHECK-LL-NEXT: %2 = load %"class.std::type_info"** %1
+// CHECK-LL-NEXT: %call = call zeroext i1 @_ZNK3std9type_infoeqERKS0_(%"class.std::type_info"* %2, %"class.std::type_info"* bitcast (%1* @_ZTI7test1_D to %"class.std::type_info"*))
+
+// CHECK-LL: %call2 = call zeroext i1 @_ZNK3std9type_infoeqERKS0_(%"class.std::type_info"* bitcast (%0* @_ZTI2NP to %"class.std::type_info"*), %"class.std::type_info"* bitcast (%1* @_ZTI7test1_D to %"class.std::type_info"*))
OpenPOWER on IntegriCloud