1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-optzns -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 i8* @CFCreateSomething()
22  id obj1 = (__bridge_transfer id)CFCreateSomething();
23  // CHECK-NOT: retain
24  // CHECK: store i32 11
25  *i = 11;
26  // CHECK: call i8* @CFCreateSomething()
27  // CHECK-NOT: retain
28  // CHECK: store i32 13
29  (void)(__bridge_transfer id)CFCreateSomething(), *i = 13;
30  // CHECK: call void @objc_release
31  // CHECK: store i32 17
32  *i = 17;
33  // CHECK: call void @objc_release
34  // CHECK-NEXT: ret void
35}
36
37// CHECK-LABEL: define void @bridge_from_cf
38void bridge_from_cf(int *i) {
39  // CHECK: store i32 7
40  *i = 7;
41  // CHECK: call i8* @CFCreateSomething()
42  id obj1 = (__bridge id)CFCreateSomething();
43  // CHECK: objc_retainAutoreleasedReturnValue
44  // CHECK: store i32 11
45  *i = 11;
46  // CHECK: call i8* @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 @objc_release
53  // CHECK-NEXT: ret void
54}
55
56// CHECK-LABEL: define void @bridge_retained_of_cf
57void bridge_retained_of_cf(int *i) {
58  *i = 7;
59  // CHECK: call i8* @CreateSomething()
60  CFTypeRef cf1 = (__bridge_retained CFTypeRef)CreateSomething();
61  // CHECK-NEXT: call i8* @objc_retainAutoreleasedReturnValue
62  // CHECK: store i32 11
63  *i = 11;
64  // CHECK: call i8* @CreateSomething()
65  (__bridge_retained CFTypeRef)CreateSomething(), *i = 13;
66  // CHECK-NEXT: call i8* @objc_retainAutoreleasedReturnValue
67  // CHECK: store i32 13
68  // CHECK: store i32 17
69  *i = 17;
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 i8* @CreateSomething()
78  CFTypeRef cf1 = (__bridge CFTypeRef)CreateSomething();
79  // CHECK-NOT: retain
80  // CHECK: store i32 11
81  *i = 11;
82  // CHECK: call i8* @CreateSomething
83  (__bridge CFTypeRef)CreateSomething(), *i = 13;
84  // CHECK: store i32 13
85  // CHECK-NOT: release
86  // CHECK: store i32 17
87  *i = 17;
88  // CHECK-NEXT: ret void
89}
90
91