summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorBen Langmuir <blangmuir@apple.com>2014-09-26 15:27:29 +0000
committerBen Langmuir <blangmuir@apple.com>2014-09-26 15:27:29 +0000
commit11eab6120d9e50512da6b39dc9c6c60b4ca722ce (patch)
tree83e8e46d787be5871edb6b9363b63c07cd186043 /clang/test
parentc2e0427b940c84195b65e96e8de35bc4e37353e8 (diff)
downloadbcm5719-llvm-11eab6120d9e50512da6b39dc9c6c60b4ca722ce.tar.gz
bcm5719-llvm-11eab6120d9e50512da6b39dc9c6c60b4ca722ce.zip
Fix an assertion failure trying to emit a trivial destructor in ObjC++
If a base class declares a destructor, we will add the implicit destructor for the subclass in ActOnFields -> AddImplicitlyDeclaredMembersToClass But in Objective C++, we did not compute whether we have a trivial destructor until after that in CXXRecordDecl::completeDefinition() This was leading to a mismatch between the class, which thought it had no trivial destructor, and the CXXDestructorDecl, which considered itself trivial. It turns out the reason we delayed setting this until completeDefinition() was for a warning that has since been removed as part of -Warc-abi, so we just do it eagerly now. llvm-svn: 218520
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenObjCXX/destroy.mm50
1 files changed, 50 insertions, 0 deletions
diff --git a/clang/test/CodeGenObjCXX/destroy.mm b/clang/test/CodeGenObjCXX/destroy.mm
new file mode 100644
index 00000000000..c53ac393de8
--- /dev/null
+++ b/clang/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)
OpenPOWER on IntegriCloud