blob: eb9045d3d8404ad71c7a869534b0baf6111c639e [file] [log] [blame]
John McCalld1e40d52011-10-02 01:16:38 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-optzns -o - %s | FileCheck %s
John McCallf85e1932011-06-15 23:02:42 +00002
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: 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: 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: 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: 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