summaryrefslogtreecommitdiff
path: root/clang/test/CodeGenObjC/arc-bridged-cast.m
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/CodeGenObjC/arc-bridged-cast.m')
-rw-r--r--clang/test/CodeGenObjC/arc-bridged-cast.m90
1 files changed, 90 insertions, 0 deletions
diff --git a/clang/test/CodeGenObjC/arc-bridged-cast.m b/clang/test/CodeGenObjC/arc-bridged-cast.m
new file mode 100644
index 0000000..eb9045d
--- /dev/null
+++ b/clang/test/CodeGenObjC/arc-bridged-cast.m
@@ -0,0 +1,90 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -O2 -disable-llvm-optzns -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: 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 @objc_release
+ // CHECK: store i32 17
+ *i = 17;
+ // CHECK: call void @objc_release
+ // CHECK-NEXT: ret void
+}
+
+// CHECK: 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: 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 @objc_release
+ // CHECK-NEXT: ret void
+}
+
+// CHECK: 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* @objc_retainAutoreleasedReturnValue
+ // CHECK: store i32 11
+ *i = 11;
+ // CHECK: call i8* @CreateSomething()
+ (__bridge_retained CFTypeRef)CreateSomething(), *i = 13;
+ // CHECK-NEXT: call i8* @objc_retainAutoreleasedReturnValue
+ // CHECK: store i32 13
+ // CHECK: store i32 17
+ *i = 17;
+ // CHECK-NEXT: ret void
+}
+
+// CHECK: define void @bridge_of_cf
+void bridge_of_cf(int *i) {
+ // CHECK: store i32 7
+ *i = 7;
+ // CHECK: 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: ret void
+}
+