From 11eab6120d9e50512da6b39dc9c6c60b4ca722ce Mon Sep 17 00:00:00 2001 From: Ben Langmuir Date: Fri, 26 Sep 2014 15:27:29 +0000 Subject: 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 --- clang/test/CodeGenObjCXX/destroy.mm | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 clang/test/CodeGenObjCXX/destroy.mm (limited to 'clang/test') 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 +struct tderived : public base { + MyObject *myobject; +}; +void test3() { + tderived d1; +} +// CHECK-LABEL: define void @_Z5test3v() +// CHECK: call void @_ZN8tderivedIiEC1Ev +// CHECK: call void @_ZN8tderivedIiED1Ev + +void test4() { + tderived *d2 = new tderived; + 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) -- cgit v1.2.3