summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/exceptions-no-rtti.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-04-30 01:15:21 +0000
committerJohn McCall <rjmccall@apple.com>2010-04-30 01:15:21 +0000
commit48bf349471549a5885a0116265af8a87e8fe65c3 (patch)
tree6f2c5dc577a1d8797b3f181a4411e9f3fb77243b /clang/test/CodeGenCXX/exceptions-no-rtti.cpp
parent5117a555e0aa36013d6191bab6f0cc297b3dc31d (diff)
downloadbcm5719-llvm-48bf349471549a5885a0116265af8a87e8fe65c3.tar.gz
bcm5719-llvm-48bf349471549a5885a0116265af8a87e8fe65c3.zip
Fix -fno-rtti -fexceptions by forcing the emission of (non-"builtin") RTTI
when used by the exceptions routines. Fixes PR 6974. llvm-svn: 102684
Diffstat (limited to 'clang/test/CodeGenCXX/exceptions-no-rtti.cpp')
-rw-r--r--clang/test/CodeGenCXX/exceptions-no-rtti.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/exceptions-no-rtti.cpp b/clang/test/CodeGenCXX/exceptions-no-rtti.cpp
new file mode 100644
index 00000000000..c26abb26af9
--- /dev/null
+++ b/clang/test/CodeGenCXX/exceptions-no-rtti.cpp
@@ -0,0 +1,48 @@
+// RUN: %clang_cc1 -fno-rtti -fexceptions %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
+
+// CHECK: @_ZTIN5test11AE = weak_odr constant
+// CHECK: @_ZTIN5test11BE = weak_odr constant
+// CHECK: @_ZTIN5test11CE = weak_odr constant
+// CHECK: @_ZTIN5test11DE = weak_odr constant
+// CHECK: @_ZTIPN5test11DE = weak_odr constant {{.*}} @_ZTIN5test11DE
+
+// PR6974: this shouldn't crash
+namespace test0 {
+ class err {};
+
+ void f(void) {
+ try {
+ } catch (err &) {
+ }
+ }
+}
+
+namespace test1 {
+ // These classes have key functions defined out-of-line.
+ // Under normal circumstances, we wouldn't generate RTTI for them;
+ // under -fno-rtti, we generate RTTI only when required by EH.
+ class A { virtual void foo(); };
+ class B { virtual void foo(); };
+ class C { virtual void foo(); };
+ class D { virtual void foo(); };
+
+ void opaque();
+
+ void test0() {
+ throw A();
+ }
+
+ void test1() throw(B) {
+ opaque();
+ }
+
+ void test2() {
+ try {
+ opaque();
+ } catch (C&) {}
+ }
+
+ void test3(D *ptr) {
+ throw ptr;
+ };
+}
OpenPOWER on IntegriCloud