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