]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGenObjC/arc-bridged-cast.m
Vendor import of clang release_34 branch r197841 (effectively, 3.4 RC3):
[FreeBSD/FreeBSD.git] / test / CodeGenObjC / arc-bridged-cast.m
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-optzns -o - %s | FileCheck %s
2
3 typedef const void *CFTypeRef;
4 typedef const struct __CFString *CFStringRef;
5
6 @interface NSString
7 @end
8
9 CFTypeRef CFCreateSomething(void);
10 CFStringRef CFCreateString(void);
11 CFTypeRef CFGetSomething(void);
12 CFStringRef CFGetString(void);
13
14 id CreateSomething(void);
15 NSString *CreateNSString(void);
16
17 // CHECK-LABEL: define void @bridge_transfer_from_cf
18 void 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
38 void 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
57 void 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
74 void 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