diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 8f5ba0645f37b8673100cfb69c788439cf35769d..04629dc01705bcfde356180336dd99d1f3956155 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -606,7 +606,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // C++ and ARC stuff we don't support yet. case Expr::ObjCIndirectCopyRestoreExprClass: case Stmt::CXXDependentScopeMemberExprClass: - case Stmt::CXXPseudoDestructorExprClass: case Stmt::CXXTryStmtClass: case Stmt::CXXTypeidExprClass: case Stmt::CXXUuidofExprClass: @@ -720,6 +719,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, case Stmt::StringLiteralClass: case Stmt::ObjCStringLiteralClass: case Stmt::CXXBindTemporaryExprClass: + case Stmt::CXXPseudoDestructorExprClass: case Stmt::SubstNonTypeTemplateParmExprClass: case Stmt::CXXNullPtrLiteralExprClass: { Bldr.takeNodes(Pred); diff --git a/test/Analysis/dtor.cpp b/test/Analysis/dtor.cpp index 58bdcea6317a5cd066390aa9f458da9c5bce6be8..436da2ed9f378aa96e55e1a98dd56ddf2ec37366 100644 --- a/test/Analysis/dtor.cpp +++ b/test/Analysis/dtor.cpp @@ -417,3 +417,17 @@ namespace NoReturn { *x = 47; // no warning } } + +namespace PseudoDtor { + template <typename T> + void destroy(T &obj) { + clang_analyzer_checkInlined(true); // expected-warning{{TRUE}} + obj.~T(); + } + + void test() { + int i; + destroy(i); + clang_analyzer_eval(true); // expected-warning{{TRUE}} + } +}