Index: lib/CodeGen/CGExprCXX.cpp =================================================================== --- lib/CodeGen/CGExprCXX.cpp +++ lib/CodeGen/CGExprCXX.cpp @@ -1862,7 +1862,7 @@ if (RD->hasDefinition() && !RD->hasTrivialDestructor()) { Dtor = RD->getDestructor(); - if (Dtor->isVirtual()) { + if (Dtor && Dtor->isVirtual()) { CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType, Dtor); return; Index: test/CodeGenCXX/pr36749.cpp =================================================================== --- /dev/null +++ test/CodeGenCXX/pr36749.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -cc1 -triple x86_64-- -emit-llvm-only %s +class a { +protected: + ~a(); +}; +struct b : a {}; +struct c; +struct d { + c *e; + virtual ~d() { delete e; } // expected-warning {{deleting pointer to incomplete type 'c' may cause undefined behavior}} +}; +struct c { + b f; +}; +void g() { new d; }