]> granicus.if.org Git - clang/commitdiff
PR5483: Generate missing form of destructor when it is virtual. (Someone
authorEli Friedman <eli.friedman@gmail.com>
Sat, 14 Nov 2009 04:19:37 +0000 (04:19 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 14 Nov 2009 04:19:37 +0000 (04:19 +0000)
more familiar with this stuff should double-check that there isn't some more
general rule; this is purely from inspecting g++ output.)

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

lib/CodeGen/CGCXX.cpp
test/CodeGenCXX/virt-dtor-gen.cpp [new file with mode: 0644]

index bcb0b5c5c3b1de66cc05b2166224d9c6cad1dd0e..a8261a5585a3252d07be94ce45a2ed21aa92993b 100644 (file)
@@ -752,6 +752,8 @@ const char *CodeGenModule::getMangledCXXCtorName(const CXXConstructorDecl *D,
 }
 
 void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
+  if (D->isVirtual())
+    EmitCXXDestructor(D, Dtor_Deleting);
   EmitCXXDestructor(D, Dtor_Complete);
   EmitCXXDestructor(D, Dtor_Base);
 }
diff --git a/test/CodeGenCXX/virt-dtor-gen.cpp b/test/CodeGenCXX/virt-dtor-gen.cpp
new file mode 100644 (file)
index 0000000..470c1a4
--- /dev/null
@@ -0,0 +1,10 @@
+// clang-cc -o - -emit-llvm %s | FileCheck %s
+// PR5483
+
+// Make sure we generate all three forms of the destructor when it is virtual.
+class Foo {
+  virtual ~Foo();
+};
+Foo::~Foo() {}
+
+// CHECK: define void @_ZN3FooD0Ev