1 | // We run this twice, once as Objective-C and once as Objective-C++. |
2 | // RUN: %clang_cc1 %s -emit-llvm -o - -fobjc-gc -fblocks -fexceptions -triple i386-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 | FileCheck %s |
3 | // RUN: %clang_cc1 %s -emit-llvm -o - -fobjc-gc -fblocks -fexceptions -triple i386-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 -x objective-c++ | FileCheck %s |
4 | |
5 | |
6 | // CHECK: define i8* @{{.*}}test0 |
7 | // CHECK: define internal void @{{.*}}_block_invoke( |
8 | // CHECK: call i8* @objc_assign_strongCast( |
9 | // CHECK-NEXT: ret void |
10 | id test0(id x) { |
11 | __block id result; |
12 | ^{ result = x; }(); |
13 | return result; |
14 | } |
15 | |
16 | // <rdar://problem/8224178>: cleanup __block variables on EH path |
17 | // CHECK: define void @{{.*}}test1 |
18 | void test1() { |
19 | extern void test1_help(void (^x)(void)); |
20 | |
21 | // CHECK: [[N:%.*]] = alloca [[N_T:%.*]], align 8 |
22 | // CHECK: [[T0:%.*]] = getelementptr inbounds [[N_T]], [[N_T]]* [[N]], i32 0, i32 4 |
23 | // CHECK-NEXT: store double 1.000000e+{{0?}}01, double* [[T0]], align 8 |
24 | __block double n = 10; |
25 | |
26 | // CHECK: invoke void @{{.*}}test1_help |
27 | test1_help(^{ n = 20; }); |
28 | |
29 | // CHECK: [[T1:%.*]] = bitcast [[N_T]]* [[N]] to i8* |
30 | // CHECK-NEXT: call void @_Block_object_dispose(i8* [[T1]], i32 8) |
31 | // CHECK-NEXT: ret void |
32 | |
33 | // CHECK: landingpad { i8*, i32 } |
34 | // CHECK-NEXT: cleanup |
35 | // CHECK: [[T1:%.*]] = bitcast [[N_T]]* [[N]] to i8* |
36 | // CHECK-NEXT: call void @_Block_object_dispose(i8* [[T1]], i32 8) |
37 | // CHECK: resume { i8*, i32 } |
38 | } |
39 | |