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