xref: /llvm-project/clang/test/CodeGenObjC/arc-bridged-cast.m (revision 9466b49171dc4b21f56a48594fc82b1e52f5358a)
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-passes -o - %s | FileCheck %s
2
3typedef const void *CFTypeRef;
4typedef const struct __CFString *CFStringRef;
5
6@interface NSString
7@end
8
9CFTypeRef CFCreateSomething(void);
10CFStringRef CFCreateString(void);
11CFTypeRef CFGetSomething(void);
12CFStringRef CFGetString(void);
13
14id CreateSomething(void);
15NSString *CreateNSString(void);
16
17// CHECK-LABEL: define{{.*}} void @bridge_transfer_from_cf
18void bridge_transfer_from_cf(int *i) {
19  // CHECK: store i32 7
20  *i = 7;
21  // CHECK: call ptr @CFCreateSomething()
22  id obj1 = (__bridge_transfer id)CFCreateSomething();
23  // CHECK-NOT: retain
24  // CHECK: store i32 11
25  *i = 11;
26  // CHECK: call ptr @CFCreateSomething()
27  // CHECK-NOT: retain
28  // CHECK: store i32 13
29  (void)(__bridge_transfer id)CFCreateSomething(), *i = 13;
30  // CHECK: call void @llvm.objc.release
31  // CHECK: store i32 17
32  *i = 17;
33  // CHECK: call void @llvm.objc.release
34  // CHECK-NEXT: call void @llvm.lifetime.end
35  // CHECK-NEXT: ret void
36}
37
38// CHECK-LABEL: define{{.*}} void @bridge_from_cf
39void bridge_from_cf(int *i) {
40  // CHECK: store i32 7
41  *i = 7;
42  // CHECK: call ptr @CFCreateSomething() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
43  id obj1 = (__bridge id)CFCreateSomething();
44  // CHECK: store i32 11
45  *i = 11;
46  // CHECK: call ptr @CFCreateSomething()
47  // CHECK-NOT: release
48  // CHECK: store i32 13
49  (void)(__bridge id)CFCreateSomething(), *i = 13;
50  // CHECK: store i32 17
51  *i = 17;
52  // CHECK: call void @llvm.objc.release
53  // CHECK-NEXT: call void @llvm.lifetime.end
54  // CHECK-NEXT: ret void
55}
56
57// CHECK-LABEL: define{{.*}} void @bridge_retained_of_cf
58void bridge_retained_of_cf(int *i) {
59  *i = 7;
60  // CHECK: call ptr @CreateSomething() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
61  CFTypeRef cf1 = (__bridge_retained CFTypeRef)CreateSomething();
62  // CHECK: store i32 11
63  *i = 11;
64  // CHECK: call ptr @CreateSomething() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
65  (__bridge_retained CFTypeRef)CreateSomething(), *i = 13;
66  // CHECK: store i32 13
67  // CHECK: store i32 17
68  *i = 17;
69  // CHECK-NEXT: call void @llvm.lifetime.end
70  // CHECK-NEXT: ret void
71}
72
73// CHECK-LABEL: define{{.*}} void @bridge_of_cf
74void bridge_of_cf(int *i) {
75  // CHECK: store i32 7
76  *i = 7;
77  // CHECK: call void @llvm.lifetime.start
78  // CHECK-NEXT: call ptr @CreateSomething()
79  CFTypeRef cf1 = (__bridge CFTypeRef)CreateSomething();
80  // CHECK-NOT: retain
81  // CHECK: store i32 11
82  *i = 11;
83  // CHECK: call ptr @CreateSomething
84  (__bridge CFTypeRef)CreateSomething(), *i = 13;
85  // CHECK: store i32 13
86  // CHECK-NOT: release
87  // CHECK: store i32 17
88  *i = 17;
89  // CHECK-NEXT: call void @llvm.lifetime.end
90  // CHECK-NEXT: ret void
91}
92
93// CHECK-LABEL: define{{.*}} ptr @bridge_of_paren_expr()
94CFStringRef bridge_of_paren_expr(void) {
95  // CHECK-NOT: "@llvm.objc"
96  CFStringRef r = (__bridge CFStringRef)(CreateNSString());
97  r = (__bridge CFStringRef)((NSString *)(CreateNSString()));
98  return r;
99}
100