]> granicus.if.org Git - clang/commitdiff
Fix a crash introduced in r189828.
authorMatt Beaumont-Gay <matthewbg@google.com>
Mon, 9 Sep 2013 21:07:58 +0000 (21:07 +0000)
committerMatt Beaumont-Gay <matthewbg@google.com>
Mon, 9 Sep 2013 21:07:58 +0000 (21:07 +0000)
The predicates in CXXRecordDecl which test various properties of special
members can't be called on incomplete decls.

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

lib/Analysis/CFG.cpp
test/Analysis/dtor.cpp

index 191c324b3c694a448209a35984d4143764a3797a..c7fe9f3a8869d1944f84728e104bb8eb4ea641df 100644 (file)
@@ -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);
   }
 
index 436da2ed9f378aa96e55e1a98dd56ddf2ec37366..11ce0d57ef4f4121d8d0709bddb6ad3924aa852b 100644 (file)
@@ -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}}
+}