diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGenCXX/rtti-layout.cpp | 16 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/rtti-linkage.cpp | 19 |
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**); + +} + |