xref: /llvm-project/clang/test/CodeGenObjC/autorelease.m (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
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
4@interface I
5{
6  id ivar;
7}
8- (id) Meth;
9+ (id) MyAlloc;;
10@end
11
12@implementation I
13- (id) Meth {
14   @autoreleasepool {
15      id p = [I MyAlloc];
16      if (!p)
17        return ivar;
18   }
19  return 0;
20}
21+ (id) MyAlloc {
22    return 0;
23}
24@end
25
26// CHECK: call ptr @llvm.objc.autoreleasePoolPush
27// CHECK: [[T:%.*]] = load ptr, ptr [[A:%.*]]
28// CHECK: call void @llvm.objc.autoreleasePoolPop
29
30int tryTo(int (*f)(void)) {
31  @try {
32    @autoreleasepool {
33      return f();
34    }
35  } @catch (...) {
36    return 0;
37  }
38}
39// CHECK-LABEL:    define{{.*}} i32 @tryTo(ptr
40// CHECK:      [[RET:%.*]] = alloca i32,
41// CHECK:      [[T0:%.*]] = call ptr @llvm.objc.autoreleasePoolPush()
42// CHECK-NEXT: [[T1:%.*]] = load ptr, ptr {{%.*}},
43// CHECK-NEXT: [[T2:%.*]] = invoke i32 [[T1]]()
44// CHECK:      store i32 [[T2]], ptr [[RET]]
45// CHECK:      invoke void @objc_autoreleasePoolPop(ptr [[T0]])
46// CHECK:      landingpad { ptr, i32 }
47// CHECK-NEXT:   catch ptr null
48// CHECK:      call ptr @objc_begin_catch
49// CHECK-NEXT: store i32 0, ptr [[RET]]
50// CHECK:      call void @objc_end_catch()
51