]> granicus.if.org Git - clang/commitdiff
[Codegen] Don't crash if destructor is not accessible.
authorDavide Italiano <davide@freebsd.org>
Sun, 21 Jun 2015 16:33:50 +0000 (16:33 +0000)
committerDavide Italiano <davide@freebsd.org>
Sun, 21 Jun 2015 16:33:50 +0000 (16:33 +0000)
Testcase provided, in the PR, by Christian Shelton and
reduced by David Majnemer.

PR: 23584
Differential Revision: http://reviews.llvm.org/D10508
Reviewed by: rnk

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

lib/CodeGen/CGClass.cpp
test/CodeGenCXX/destructor-crash.cpp [new file with mode: 0644]

index 1d2b7875d8f79446991460721f249da81e6a38ef..4d6a4e288dd3faaea2c5cabfa153cd6b9f746c3e 100644 (file)
@@ -1297,6 +1297,10 @@ HasTrivialDestructorBody(ASTContext &Context,
   if (BaseClassDecl->hasTrivialDestructor())
     return true;
 
+  // Give up if the destructor is not accessible.
+  if (!BaseClassDecl->getDestructor())
+    return false;
+
   if (!BaseClassDecl->getDestructor()->hasTrivialBody())
     return false;
 
diff --git a/test/CodeGenCXX/destructor-crash.cpp b/test/CodeGenCXX/destructor-crash.cpp
new file mode 100644 (file)
index 0000000..4329198
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -emit-llvm -std=c++11 -o %t
+
+struct A {
+  ~A();
+};
+
+struct B {
+  A a;
+};
+
+struct C {
+  union {
+    B b;
+  };
+
+  ~C() noexcept;
+};
+
+C::~C() noexcept {}