summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGClass.cpp4
-rw-r--r--clang/test/CodeGenCXX/destructor-crash.cpp19
2 files changed, 23 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index 1d2b7875d8f..4d6a4e288dd 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -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/clang/test/CodeGenCXX/destructor-crash.cpp b/clang/test/CodeGenCXX/destructor-crash.cpp
new file mode 100644
index 00000000000..43291986514
--- /dev/null
+++ b/clang/test/CodeGenCXX/destructor-crash.cpp
@@ -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 {}
OpenPOWER on IntegriCloud