summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenCXX/rtti-layout.cpp16
-rw-r--r--clang/test/CodeGenCXX/rtti-linkage.cpp19
2 files changed, 29 insertions, 6 deletions
diff --git a/clang/test/CodeGenCXX/rtti-layout.cpp b/clang/test/CodeGenCXX/rtti-layout.cpp
index 609ddeb1ea5..3e97592ada1 100644
--- a/clang/test/CodeGenCXX/rtti-layout.cpp
+++ b/clang/test/CodeGenCXX/rtti-layout.cpp
@@ -20,12 +20,20 @@ return static_cast<const T&>(info);
}
struct Incomplete;
+#define CHECK(x) if ((x)) return __LINE__;
+
// CHECK: define i32 @_Z1fv()
int f() {
- if (to<__pbase_type_info>(typeid(Incomplete *)).__flags != __pbase_type_info::__incomplete_mask)
- return 1;
-
+ // Pointers to incomplete classes.
+ CHECK(to<__pbase_type_info>(typeid(Incomplete *)).__flags != __pbase_type_info::__incomplete_mask);
+ CHECK(to<__pbase_type_info>(typeid(Incomplete **)).__flags != __pbase_type_info::__incomplete_mask);
+ CHECK(to<__pbase_type_info>(typeid(Incomplete ***)).__flags != __pbase_type_info::__incomplete_mask);
+
+ // Member pointers.
+ CHECK(to<__pbase_type_info>(typeid(int Incomplete::*)).__flags != __pbase_type_info::__incomplete_class_mask);
+
// Success!
+ // CHECK: ret i32 0
return 0;
}
@@ -38,7 +46,7 @@ int main() {
if (result == 0)
printf("success!\n");
else
- printf("test %d failed!\n", result);
+ printf("test on line %d failed!\n", result);
return result;
}
diff --git a/clang/test/CodeGenCXX/rtti-linkage.cpp b/clang/test/CodeGenCXX/rtti-linkage.cpp
index 451d3fb2704..22e859d69c9 100644
--- a/clang/test/CodeGenCXX/rtti-linkage.cpp
+++ b/clang/test/CodeGenCXX/rtti-linkage.cpp
@@ -1,10 +1,14 @@
-// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
+#include <typeinfo>
// CHECK: _ZTS1B = constant
// CHECK: _ZTS1A = weak_odr constant
// CHECK: _ZTI1A = weak_odr constant
// CHECK: _ZTI1B = constant
-
+// CHECK: _ZTSP1C = internal constant
+// CHECK: _ZTIP1C = internal constant
+// CHECK: _ZTSPP1C = internal constant
+// CHECK: _ZTIPP1C = internal constant
// A has no key function, so its RTTI data should be weak_odr.
struct A { };
@@ -14,3 +18,14 @@ struct B : A {
virtual void f();
};
void B::f() { }
+
+// C is an incomplete class type, so any direct or indirect pointer types should have
+// internal linkage, as should the type info for C itself (FIXME).
+struct C;
+
+void f() {
+ (void)typeid(C*);
+ (void)typeid(C**);
+
+}
+
OpenPOWER on IntegriCloud