summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/blocks.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-08-17 21:34:14 +0000
committerJohn McCall <rjmccall@apple.com>2011-08-17 21:34:14 +0000
commit75f92b519c5d7fdbdf5c8e9db9a5cd3ce239c769 (patch)
treeb1d074552a49d4a199cab1693e1edc09e0e7cd3a /clang/test/CodeGenCXX/blocks.cpp
parent8bbcbedeaf8a9cf5c396ce3e77806bf64b858adf (diff)
downloadbcm5719-llvm-75f92b519c5d7fdbdf5c8e9db9a5cd3ce239c769.tar.gz
bcm5719-llvm-75f92b519c5d7fdbdf5c8e9db9a5cd3ce239c769.zip
Gather cleanups correctly in block return statements.
Thanks to Ted for finding this with magic tools. llvm-svn: 137877
Diffstat (limited to 'clang/test/CodeGenCXX/blocks.cpp')
-rw-r--r--clang/test/CodeGenCXX/blocks.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/blocks.cpp b/clang/test/CodeGenCXX/blocks.cpp
index 0e310bdbbc1..a35b5a370e8 100644
--- a/clang/test/CodeGenCXX/blocks.cpp
+++ b/clang/test/CodeGenCXX/blocks.cpp
@@ -104,3 +104,29 @@ namespace test3 {
consume(^{ (void) b; });
}
}
+
+// rdar://problem/9971485
+namespace test4 {
+ struct A {
+ A();
+ ~A();
+ };
+
+ void foo(A a);
+
+ void test() {
+ extern void consume(void(^)());
+ consume(^{ return foo(A()); });
+ }
+ // CHECK: define void @_ZN5test44testEv()
+ // CHECK: define internal void @__test_block_invoke
+ // CHECK: [[TMP:%.*]] = alloca [[A:%.*]], align 1
+ // CHECK-NEXT: alloca i32
+ // CHECK-NEXT: bitcast i8*
+ // CHECK-NEXT: call void @_ZN5test41AC1Ev([[A]]* [[TMP]])
+ // CHECK-NEXT: call void @_ZN5test43fooENS_1AE([[A]]* [[TMP]])
+ // CHECK-NEXT: store i32 1,
+ // CHECK-NEXT: call void @_ZN5test41AD1Ev([[A]]* [[TMP]])
+ // CHECK-NEXT: ret void
+}
+
OpenPOWER on IntegriCloud