summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenObjCXX/arc-new-delete.mm
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-06-15 23:02:42 +0000
committerJohn McCall <rjmccall@apple.com>2011-06-15 23:02:42 +0000
commit31168b077c3687bb79985102b08718cd77db353d (patch)
tree489434d90661950c25716a5db40be446d933c95c /clang/test/CodeGenObjCXX/arc-new-delete.mm
parentce45f88e451387c46bfd6b53c75c7fa72b730ba1 (diff)
downloadbcm5719-llvm-31168b077c3687bb79985102b08718cd77db353d.tar.gz
bcm5719-llvm-31168b077c3687bb79985102b08718cd77db353d.zip
Automatic Reference Counting.
Language-design credit goes to a lot of people, but I particularly want to single out Blaine Garst and Patrick Beard for their contributions. Compiler implementation credit goes to Argyrios, Doug, Fariborz, and myself, in no particular order. llvm-svn: 133103
Diffstat (limited to 'clang/test/CodeGenObjCXX/arc-new-delete.mm')
-rw-r--r--clang/test/CodeGenObjCXX/arc-new-delete.mm86
1 files changed, 86 insertions, 0 deletions
diff --git a/clang/test/CodeGenObjCXX/arc-new-delete.mm b/clang/test/CodeGenObjCXX/arc-new-delete.mm
new file mode 100644
index 00000000000..e638870fdd0
--- /dev/null
+++ b/clang/test/CodeGenObjCXX/arc-new-delete.mm
@@ -0,0 +1,86 @@
+// RUN: %clang_cc1 -fobjc-nonfragile-abi -fobjc-arc -fblocks -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s
+
+typedef __strong id strong_id;
+typedef __weak id weak_id;
+
+// CHECK: define void @_Z8test_newP11objc_object
+void test_new(id invalue) {
+ // CHECK: alloca i8*
+ // CHECK-NEXT: call i8* @objc_retain
+
+ // CHECK: call noalias i8* @_Znwm
+ // CHECK-NEXT: {{bitcast i8\*.*to i8\*\*}}
+ // CHECK-NEXT: store i8* null, i8**
+ new strong_id;
+ // CHECK: call noalias i8* @_Znwm
+ // CHECK-NEXT: {{bitcast i8\*.*to i8\*\*}}
+ // CHECK-NEXT: store i8* null, i8**
+ new weak_id;
+
+ // CHECK: call noalias i8* @_Znwm
+ // CHECK-NEXT: {{bitcast i8\*.*to i8\*\*}}
+ // CHECK-NEXT: store i8* null, i8**
+ new __strong id;
+ // CHECK: call noalias i8* @_Znwm
+ // CHECK-NEXT: {{bitcast i8\*.*to i8\*\*}}
+ // CHECK-NEXT: store i8* null, i8**
+ new __weak id;
+
+ // CHECK: call noalias i8* @_Znwm
+ // CHECK: call i8* @objc_retain
+ // CHECK: store i8*
+ new __strong id(invalue);
+
+ // CHECK: call noalias i8* @_Znwm
+ // CHECK: call i8* @objc_initWeak
+ new __weak id(invalue);
+
+ // CHECK: call void @objc_release
+ // CHECK: ret void
+}
+
+// CHECK: define void @_Z14test_array_new
+void test_array_new() {
+ // CHECK: call noalias i8* @_Znam
+ // CHECK: store i64 17, i64*
+ // CHECK: call void @llvm.memset.p0i8.i64
+ new strong_id[17];
+
+ // CHECK: call noalias i8* @_Znam
+ // CHECK: store i64 17, i64*
+ // CHECK: call void @llvm.memset.p0i8.i64
+ new weak_id[17];
+ // CHECK: ret void
+}
+
+// CHECK: define void @_Z11test_deletePU8__strongP11objc_objectPU6__weakS0_
+void test_delete(__strong id *sptr, __weak id *wptr) {
+ // CHECK: br i1
+ // CHECK: load i8**
+ // CHECK-NEXT: call void @objc_release
+ // CHECK: call void @_ZdlPv
+ delete sptr;
+
+ // CHECK: call void @objc_destroyWeak
+ // CHECK: call void @_ZdlPv
+ delete wptr;
+
+ // CHECK: ret void
+}
+
+// CHECK: define void @_Z17test_array_deletePU8__strongP11objc_objectPU6__weakS0_
+void test_array_delete(__strong id *sptr, __weak id *wptr) {
+ // CHECK: load i64*
+ // CHECK: {{icmp ne i64.*, 0}}
+ // CHECK: call void @objc_release
+ // CHECK: br label
+ // CHECK: call void @_ZdaPv
+ delete [] sptr;
+
+ // CHECK: load i64*
+ // CHECK: {{icmp ne i64.*, 0}}
+ // CHECK: call void @objc_destroyWeak
+ // CHECK: br label
+ // CHECK: call void @_ZdaPv
+ delete [] wptr;
+}
OpenPOWER on IntegriCloud