100 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-passes -o - %s | FileCheck %s2 3typedef const void *CFTypeRef;4typedef const struct __CFString *CFStringRef;5 6@interface NSString7@end8 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_cf18void bridge_transfer_from_cf(int *i) {19 // CHECK: store i32 720 *i = 7;21 // CHECK: call ptr @CFCreateSomething()22 id obj1 = (__bridge_transfer id)CFCreateSomething();23 // CHECK-NOT: retain24 // CHECK: store i32 1125 *i = 11;26 // CHECK: call ptr @CFCreateSomething()27 // CHECK-NOT: retain28 // CHECK: store i32 1329 (void)(__bridge_transfer id)CFCreateSomething(), *i = 13;30 // CHECK: call void @llvm.objc.release31 // CHECK: store i32 1732 *i = 17;33 // CHECK: call void @llvm.objc.release34 // CHECK-NEXT: call void @llvm.lifetime.end35 // CHECK-NEXT: ret void36}37 38// CHECK-LABEL: define{{.*}} void @bridge_from_cf39void bridge_from_cf(int *i) {40 // CHECK: store i32 741 *i = 7;42 // CHECK: call ptr @CFCreateSomething() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]43 id obj1 = (__bridge id)CFCreateSomething();44 // CHECK: store i32 1145 *i = 11;46 // CHECK: call ptr @CFCreateSomething()47 // CHECK-NOT: release48 // CHECK: store i32 1349 (void)(__bridge id)CFCreateSomething(), *i = 13;50 // CHECK: store i32 1751 *i = 17;52 // CHECK: call void @llvm.objc.release53 // CHECK-NEXT: call void @llvm.lifetime.end54 // CHECK-NEXT: ret void55}56 57// CHECK-LABEL: define{{.*}} void @bridge_retained_of_cf58void 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 1163 *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 1367 // CHECK: store i32 1768 *i = 17;69 // CHECK-NEXT: call void @llvm.lifetime.end70 // CHECK-NEXT: ret void71}72 73// CHECK-LABEL: define{{.*}} void @bridge_of_cf74void bridge_of_cf(int *i) {75 // CHECK: store i32 776 *i = 7;77 // CHECK: call void @llvm.lifetime.start78 // CHECK-NEXT: call ptr @CreateSomething()79 CFTypeRef cf1 = (__bridge CFTypeRef)CreateSomething();80 // CHECK-NOT: retain81 // CHECK: store i32 1182 *i = 11;83 // CHECK: call ptr @CreateSomething84 (__bridge CFTypeRef)CreateSomething(), *i = 13;85 // CHECK: store i32 1386 // CHECK-NOT: release87 // CHECK: store i32 1788 *i = 17;89 // CHECK-NEXT: call void @llvm.lifetime.end90 // CHECK-NEXT: ret void91}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