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