1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-passes -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 ptr @CFCreateSomething() 22 id obj1 = (__bridge_transfer id)CFCreateSomething(); 23 // CHECK-NOT: retain 24 // CHECK: store i32 11 25 *i = 11; 26 // CHECK: call ptr @CFCreateSomething() 27 // CHECK-NOT: retain 28 // CHECK: store i32 13 29 (void)(__bridge_transfer id)CFCreateSomething(), *i = 13; 30 // CHECK: call void @llvm.objc.release 31 // CHECK: store i32 17 32 *i = 17; 33 // CHECK: call void @llvm.objc.release 34 // CHECK-NEXT: call void @llvm.lifetime.end 35 // CHECK-NEXT: ret void 36} 37 38// CHECK-LABEL: define{{.*}} void @bridge_from_cf 39void bridge_from_cf(int *i) { 40 // CHECK: store i32 7 41 *i = 7; 42 // CHECK: call ptr @CFCreateSomething() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ] 43 id obj1 = (__bridge id)CFCreateSomething(); 44 // CHECK: store i32 11 45 *i = 11; 46 // CHECK: call ptr @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 @llvm.objc.release 53 // CHECK-NEXT: call void @llvm.lifetime.end 54 // CHECK-NEXT: ret void 55} 56 57// CHECK-LABEL: define{{.*}} void @bridge_retained_of_cf 58void bridge_retained_of_cf(int *i) { 59 *i = 7; 60 // CHECK: call ptr @CreateSomething() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ] 61 CFTypeRef cf1 = (__bridge_retained CFTypeRef)CreateSomething(); 62 // CHECK: store i32 11 63 *i = 11; 64 // CHECK: call ptr @CreateSomething() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ] 65 (__bridge_retained CFTypeRef)CreateSomething(), *i = 13; 66 // CHECK: store i32 13 67 // CHECK: store i32 17 68 *i = 17; 69 // CHECK-NEXT: call void @llvm.lifetime.end 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 void @llvm.lifetime.start 78 // CHECK-NEXT: call ptr @CreateSomething() 79 CFTypeRef cf1 = (__bridge CFTypeRef)CreateSomething(); 80 // CHECK-NOT: retain 81 // CHECK: store i32 11 82 *i = 11; 83 // CHECK: call ptr @CreateSomething 84 (__bridge CFTypeRef)CreateSomething(), *i = 13; 85 // CHECK: store i32 13 86 // CHECK-NOT: release 87 // CHECK: store i32 17 88 *i = 17; 89 // CHECK-NEXT: call void @llvm.lifetime.end 90 // CHECK-NEXT: ret void 91} 92 93// CHECK-LABEL: define{{.*}} ptr @bridge_of_paren_expr() 94CFStringRef bridge_of_paren_expr(void) { 95 // CHECK-NOT: "@llvm.objc" 96 CFStringRef r = (__bridge CFStringRef)(CreateNSString()); 97 r = (__bridge CFStringRef)((NSString *)(CreateNSString())); 98 return r; 99} 100