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