// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-passes -o - %s | FileCheck %s typedef const void *CFTypeRef; typedef const struct __CFString *CFStringRef; @interface NSString @end CFTypeRef CFCreateSomething(void); CFStringRef CFCreateString(void); CFTypeRef CFGetSomething(void); CFStringRef CFGetString(void); id CreateSomething(void); NSString *CreateNSString(void); // CHECK-LABEL: define{{.*}} void @bridge_transfer_from_cf void bridge_transfer_from_cf(int *i) { // CHECK: store i32 7 *i = 7; // CHECK: call i8* @CFCreateSomething() id obj1 = (__bridge_transfer id)CFCreateSomething(); // CHECK-NOT: retain // CHECK: store i32 11 *i = 11; // CHECK: call i8* @CFCreateSomething() // CHECK-NOT: retain // CHECK: store i32 13 (void)(__bridge_transfer id)CFCreateSomething(), *i = 13; // CHECK: call void @llvm.objc.release // CHECK: store i32 17 *i = 17; // CHECK: call void @llvm.objc.release // CHECK-NEXT: bitcast // CHECK-NEXT: call void @llvm.lifetime.end // CHECK-NEXT: ret void } // CHECK-LABEL: define{{.*}} void @bridge_from_cf void bridge_from_cf(int *i) { // CHECK: store i32 7 *i = 7; // CHECK: call i8* @CFCreateSomething() id obj1 = (__bridge id)CFCreateSomething(); // CHECK: llvm.objc.retainAutoreleasedReturnValue // CHECK: store i32 11 *i = 11; // CHECK: call i8* @CFCreateSomething() // CHECK-NOT: release // CHECK: store i32 13 (void)(__bridge id)CFCreateSomething(), *i = 13; // CHECK: store i32 17 *i = 17; // CHECK: call void @llvm.objc.release // CHECK-NEXT: bitcast // CHECK-NEXT: call void @llvm.lifetime.end // CHECK-NEXT: ret void } // CHECK-LABEL: define{{.*}} void @bridge_retained_of_cf void bridge_retained_of_cf(int *i) { *i = 7; // CHECK: call i8* @CreateSomething() CFTypeRef cf1 = (__bridge_retained CFTypeRef)CreateSomething(); // CHECK-NEXT: call i8* @llvm.objc.retainAutoreleasedReturnValue // CHECK: store i32 11 *i = 11; // CHECK: call i8* @CreateSomething() (__bridge_retained CFTypeRef)CreateSomething(), *i = 13; // CHECK-NEXT: call i8* @llvm.objc.retainAutoreleasedReturnValue // CHECK: store i32 13 // CHECK: store i32 17 *i = 17; // CHECK-NEXT: bitcast // CHECK-NEXT: call void @llvm.lifetime.end // CHECK-NEXT: ret void } // CHECK-LABEL: define{{.*}} void @bridge_of_cf void bridge_of_cf(int *i) { // CHECK: store i32 7 *i = 7; // CHECK: call void @llvm.lifetime.start // CHECK-NEXT: call i8* @CreateSomething() CFTypeRef cf1 = (__bridge CFTypeRef)CreateSomething(); // CHECK-NOT: retain // CHECK: store i32 11 *i = 11; // CHECK: call i8* @CreateSomething (__bridge CFTypeRef)CreateSomething(), *i = 13; // CHECK: store i32 13 // CHECK-NOT: release // CHECK: store i32 17 *i = 17; // CHECK-NEXT: bitcast // CHECK-NEXT: call void @llvm.lifetime.end // CHECK-NEXT: ret void } // CHECK-LABEL: define{{.*}} %struct.__CFString* @bridge_of_paren_expr() CFStringRef bridge_of_paren_expr() { // CHECK-NOT: call i8* @llvm.objc.retainAutoreleasedReturnValue( // CHECK-NOT: call void @llvm.objc.release( CFStringRef r = (__bridge CFStringRef)(CreateNSString()); r = (__bridge CFStringRef)((NSString *)(CreateNSString())); return r; }