summaryrefslogtreecommitdiff
path: root/test/CodeGenObjCXX/destroy.mm
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGenObjCXX/destroy.mm')
-rw-r--r--test/CodeGenObjCXX/destroy.mm50
1 files changed, 50 insertions, 0 deletions
diff --git a/test/CodeGenObjCXX/destroy.mm b/test/CodeGenObjCXX/destroy.mm
new file mode 100644
index 0000000000000..c53ac393de8f9
--- /dev/null
+++ b/test/CodeGenObjCXX/destroy.mm
@@ -0,0 +1,50 @@
+// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -disable-llvm-optzns -o - %s | FileCheck %s
+// rdar://18249673
+
+@class MyObject;
+struct base {
+ ~base() = default;
+};
+struct derived : public base {
+ MyObject *myobject;
+};
+
+void test1() {
+ derived d1;
+}
+// CHECK-LABEL: define void @_Z5test1v()
+// CHECK: call void @_ZN7derivedC1Ev
+// CHECK: call void @_ZN7derivedD1Ev
+
+void test2() {
+ derived *d2 = new derived;
+ delete d2;
+}
+// CHECK-LABEL: define void @_Z5test2v()
+// CHECK: call void @_ZN7derivedC1Ev
+// CHECK: call void @_ZN7derivedD1Ev
+
+template <typename T>
+struct tderived : public base {
+ MyObject *myobject;
+};
+void test3() {
+ tderived<int> d1;
+}
+// CHECK-LABEL: define void @_Z5test3v()
+// CHECK: call void @_ZN8tderivedIiEC1Ev
+// CHECK: call void @_ZN8tderivedIiED1Ev
+
+void test4() {
+ tderived<int> *d2 = new tderived<int>;
+ delete d2;
+}
+// CHECK-LABEL: define void @_Z5test4v()
+// CHECK: call void @_ZN8tderivedIiEC1Ev
+// CHECK: call void @_ZN8tderivedIiED1Ev
+
+// CHECK-LABEL: define linkonce_odr void @_ZN8tderivedIiED2Ev
+// CHECK: call void @objc_storeStrong(i8** {{.*}}, i8* null)
+
+// CHECK-LABEL: define linkonce_odr void @_ZN7derivedD2Ev
+// CHECK: call void @objc_storeStrong(i8** {{.*}}, i8* null)