1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fobjc-runtime=macosx-10.7 -fexceptions -fobjc-exceptions -o - %s | FileCheck %s |
2 | // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -emit-llvm -fobjc-runtime=macosx-10.7 -fexceptions -fobjc-exceptions -o - %s | FileCheck %s |
3 | // rdar://8881826 |
4 | // rdar://9412038 |
5 | |
6 | @interface I |
7 | { |
8 | id ivar; |
9 | } |
10 | - (id) Meth; |
11 | + (id) MyAlloc;; |
12 | @end |
13 | |
14 | @implementation I |
15 | - (id) Meth { |
16 | @autoreleasepool { |
17 | id p = [I MyAlloc]; |
18 | if (!p) |
19 | return ivar; |
20 | } |
21 | return 0; |
22 | } |
23 | + (id) MyAlloc { |
24 | return 0; |
25 | } |
26 | @end |
27 | |
28 | // CHECK: call i8* @llvm.objc.autoreleasePoolPush |
29 | // CHECK: [[T:%.*]] = load i8*, i8** [[A:%.*]] |
30 | // CHECK: call void @llvm.objc.autoreleasePoolPop |
31 | |
32 | // rdar://13660038 |
33 | int tryTo(int (*f)(void)) { |
34 | @try { |
35 | @autoreleasepool { |
36 | return f(); |
37 | } |
38 | } @catch (...) { |
39 | return 0; |
40 | } |
41 | } |
42 | // CHECK-LABEL: define i32 @tryTo(i32 ()* |
43 | // CHECK: [[RET:%.*]] = alloca i32, |
44 | // CHECK: [[T0:%.*]] = call i8* @llvm.objc.autoreleasePoolPush() |
45 | // CHECK-NEXT: [[T1:%.*]] = load i32 ()*, i32 ()** {{%.*}}, |
46 | // CHECK-NEXT: [[T2:%.*]] = invoke i32 [[T1]]() |
47 | // CHECK: store i32 [[T2]], i32* [[RET]] |
48 | // CHECK: invoke void @objc_autoreleasePoolPop(i8* [[T0]]) |
49 | // CHECK: landingpad { i8*, i32 } |
50 | // CHECK-NEXT: catch i8* null |
51 | // CHECK: call i8* @objc_begin_catch |
52 | // CHECK-NEXT: store i32 0, i32* [[RET]] |
53 | // CHECK: call void @objc_end_catch() |
54 | |