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: ret void
     35 }
     36 
     37 // CHECK-LABEL: define void @bridge_from_cf
     38 void bridge_from_cf(int *i) {
     39   // CHECK: store i32 7
     40   *i = 7;
     41   // CHECK: call i8* @CFCreateSomething()
     42   id obj1 = (__bridge id)CFCreateSomething();
     43   // CHECK: objc_retainAutoreleasedReturnValue
     44   // CHECK: store i32 11
     45   *i = 11;
     46   // CHECK: call i8* @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 @objc_release
     53   // CHECK-NEXT: ret void
     54 }
     55 
     56 // CHECK-LABEL: define void @bridge_retained_of_cf
     57 void bridge_retained_of_cf(int *i) {
     58   *i = 7;
     59   // CHECK: call i8* @CreateSomething()
     60   CFTypeRef cf1 = (__bridge_retained CFTypeRef)CreateSomething();
     61   // CHECK-NEXT: call i8* @objc_retainAutoreleasedReturnValue
     62   // CHECK: store i32 11
     63   *i = 11;
     64   // CHECK: call i8* @CreateSomething()
     65   (__bridge_retained CFTypeRef)CreateSomething(), *i = 13;
     66   // CHECK-NEXT: call i8* @objc_retainAutoreleasedReturnValue
     67   // CHECK: store i32 13
     68   // CHECK: store i32 17
     69   *i = 17;
     70   // CHECK-NEXT: ret void
     71 }
     72 
     73 // CHECK-LABEL: define void @bridge_of_cf
     74 void bridge_of_cf(int *i) {
     75   // CHECK: store i32 7
     76   *i = 7;
     77   // CHECK: call i8* @CreateSomething()
     78   CFTypeRef cf1 = (__bridge CFTypeRef)CreateSomething();
     79   // CHECK-NOT: retain
     80   // CHECK: store i32 11
     81   *i = 11;
     82   // CHECK: call i8* @CreateSomething
     83   (__bridge CFTypeRef)CreateSomething(), *i = 13;
     84   // CHECK: store i32 13
     85   // CHECK-NOT: release
     86   // CHECK: store i32 17
     87   *i = 17;
     88   // CHECK-NEXT: ret void
     89 }
     90 
     91