diff options
-rw-r--r-- | clang/lib/Analysis/CFG.cpp | 2 | ||||
-rw-r--r-- | clang/test/Analysis/dtor.cpp | 5 |
2 files changed, 6 insertions, 1 deletions
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 191c324b3c6..c7fe9f3a886 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -3133,7 +3133,7 @@ CFGBlock *CFGBuilder::VisitCXXDeleteExpr(CXXDeleteExpr *DE, DTy = DTy.getNonReferenceType(); CXXRecordDecl *RD = Context->getBaseElementType(DTy)->getAsCXXRecordDecl(); if (RD) { - if (!RD->hasTrivialDestructor()) + if (RD->isCompleteDefinition() && !RD->hasTrivialDestructor()) appendDeleteDtor(Block, RD, DE); } diff --git a/clang/test/Analysis/dtor.cpp b/clang/test/Analysis/dtor.cpp index 436da2ed9f3..11ce0d57ef4 100644 --- a/clang/test/Analysis/dtor.cpp +++ b/clang/test/Analysis/dtor.cpp @@ -431,3 +431,8 @@ namespace PseudoDtor { clang_analyzer_eval(true); // expected-warning{{TRUE}} } } + +namespace Incomplete { + class Foo; // expected-note{{forward declaration}} + void f(Foo *foo) { delete foo; } // expected-warning{{deleting pointer to incomplete type}} +} |