| // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fobjc-runtime=macosx-10.7 -fexceptions -fobjc-exceptions -o - %s | FileCheck %s |
| // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -emit-llvm -fobjc-runtime=macosx-10.7 -fexceptions -fobjc-exceptions -o - %s | FileCheck %s |
| // rdar://8881826 |
| // rdar://9412038 |
| |
| @interface I |
| { |
| id ivar; |
| } |
| - (id) Meth; |
| + (id) MyAlloc;; |
| @end |
| |
| @implementation I |
| - (id) Meth { |
| @autoreleasepool { |
| id p = [I MyAlloc]; |
| if (!p) |
| return ivar; |
| } |
| return 0; |
| } |
| + (id) MyAlloc { |
| return 0; |
| } |
| @end |
| |
| // CHECK: call i8* @objc_autoreleasePoolPush |
| // CHECK: [[T:%.*]] = load i8*, i8** [[A:%.*]] |
| // CHECK: call void @objc_autoreleasePoolPop |
| |
| // rdar://13660038 |
| int tryTo(int (*f)(void)) { |
| @try { |
| @autoreleasepool { |
| return f(); |
| } |
| } @catch (...) { |
| return 0; |
| } |
| } |
| // CHECK-LABEL: define i32 @tryTo(i32 ()* |
| // CHECK: [[RET:%.*]] = alloca i32, |
| // CHECK: [[T0:%.*]] = call i8* @objc_autoreleasePoolPush() |
| // CHECK-NEXT: [[T1:%.*]] = load i32 ()*, i32 ()** {{%.*}}, |
| // CHECK-NEXT: [[T2:%.*]] = invoke i32 [[T1]]() |
| // CHECK: store i32 [[T2]], i32* [[RET]] |
| // CHECK: invoke void @objc_autoreleasePoolPop(i8* [[T0]]) |
| // CHECK: landingpad { i8*, i32 } |
| // CHECK-NEXT: catch i8* null |
| // CHECK: call i8* @objc_begin_catch |
| // CHECK-NEXT: store i32 0, i32* [[RET]] |
| // CHECK: call void @objc_end_catch() |