]> granicus.if.org Git - clang/commitdiff
Disable the optimization that skips emission of complete, non-virtual
authorDouglas Gregor <dgregor@apple.com>
Tue, 26 Jul 2011 23:18:30 +0000 (23:18 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 26 Jul 2011 23:18:30 +0000 (23:18 +0000)
destructors of abstract classes. It's undefined behavior to actually
call the destructor (e.g., via delete), but the presence of code that
calls this destructor doesn't make the program
ill-formed. Fixes <rdar://problem/9819242>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136180 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp
test/CodeGenCXX/abstract-class-ctors-dtors.cpp

index f7f8a1271cd2442a7eead3958bf15d512dd50706..e1463e98ecae18381f0e65be4382f324db7fe786 100644 (file)
@@ -236,11 +236,7 @@ void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
 
   // The destructor used for destructing this as a most-derived class;
   // call the base destructor and then destructs any virtual bases.
-  if (!D->getParent()->isAbstract() || D->isVirtual()) {
-    // We don't need to emit the complete ctor if the class is abstract,
-    // unless the destructor is virtual and needs to be in the vtable.
-    EmitGlobal(GlobalDecl(D, Dtor_Complete));
-  }
+  EmitGlobal(GlobalDecl(D, Dtor_Complete));
 
   // The destructor used for destructing this as a base class; ignores
   // virtual bases.
index e1c1a75e4790412e696a6b2d6d76b1b0b503ef68..012c2231551d9f5b35554a3de7ce9dae5704974d 100644 (file)
@@ -9,7 +9,7 @@ struct A {
 
 // CHECK-NOT: define void @_ZN1AC1Ev
 // CHECK: define void @_ZN1AC2Ev
-// CHECK-NOT: define void @_ZN1AD1Ev
+// CHECK: define void @_ZN1AD1Ev
 // CHECK: define void @_ZN1AD2Ev
 A::A() { }