aboutsummaryrefslogtreecommitdiff
path: root/clang/test/CodeGenCXX/exceptions.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-02-16 08:02:54 +0000
committerJohn McCall <rjmccall@apple.com>2011-02-16 08:02:54 +0000
commit1bf5846abf2ce98c4c9c420d1757b01a1663d8cc (patch)
tree2dcbb6372072983963df0b5d6bf58a31bdf103d0 /clang/test/CodeGenCXX/exceptions.cpp
parentc8fb2557b9e96fcde75d8cb4a5bf6de06e1ea470 (diff)
downloadllvm-1bf5846abf2ce98c4c9c420d1757b01a1663d8cc.zip
llvm-1bf5846abf2ce98c4c9c420d1757b01a1663d8cc.tar.gz
llvm-1bf5846abf2ce98c4c9c420d1757b01a1663d8cc.tar.bz2
Save a copy expression for non-trivial copy constructions of catch variables.
llvm-svn: 125661
Diffstat (limited to 'clang/test/CodeGenCXX/exceptions.cpp')
-rw-r--r--clang/test/CodeGenCXX/exceptions.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/exceptions.cpp b/clang/test/CodeGenCXX/exceptions.cpp
index 2413eb0..84d55c8 100644
--- a/clang/test/CodeGenCXX/exceptions.cpp
+++ b/clang/test/CodeGenCXX/exceptions.cpp
@@ -259,3 +259,37 @@ namespace test4 {
return new(foo(),bar()) A(5);
}
}
+
+// PR7908
+namespace test5 {
+ struct T { T(); ~T(); };
+
+ struct A {
+ A(const A &x, const T &t = T());
+ ~A();
+ };
+
+ void foo();
+
+ // CHECK: define void @_ZN5test54testEv()
+ // CHECK: [[EXNSLOT:%.*]] = alloca i8*
+ // CHECK-NEXT: [[A:%.*]] = alloca [[A_T:%.*]], align 1
+ // CHECK-NEXT: [[T:%.*]] = alloca [[T_T:%.*]], align 1
+ // CHECK-NEXT: alloca i32
+ // CHECK-NEXT: invoke void @_ZN5test53fooEv()
+ // CHECK: [[EXN:%.*]] = load i8** [[EXNSLOT]]
+ // CHECK-NEXT: [[ADJ:%.*]] = call i8* @__cxa_get_exception_ptr(i8* [[EXN]])
+ // CHECK-NEXT: [[SRC:%.*]] = bitcast i8* [[ADJ]] to [[A_T]]*
+ // CHECK-NEXT: invoke void @_ZN5test51TC1Ev([[T_T]]* [[T]])
+ // CHECK: invoke void @_ZN5test51AC1ERKS0_RKNS_1TE([[A_T]]* [[A]], [[A_T]]* [[SRC]], [[T_T]]* [[T]])
+ // CHECK: invoke void @_ZN5test51TD1Ev([[T_T]]* [[T]])
+ // CHECK: call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind
+ // CHECK-NEXT: invoke void @_ZN5test51AD1Ev([[A_T]]* [[A]])
+ // CHECK: call void @__cxa_end_catch()
+ void test() {
+ try {
+ foo();
+ } catch (A a) {
+ }
+ }
+}