xref: /aosp_15_r20/external/clang/test/CodeGenObjC/autorelease.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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