From: Jordan Rose Date: Tue, 23 Jul 2013 02:15:20 +0000 (+0000) Subject: [analyzer] Enable pseudo-destructor expressions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fee16225a103ee1459af4f3ecb89fa2804e81ac3;p=clang [analyzer] Enable pseudo-destructor expressions. These are cases where a scalar type is "destructed", usually due to template instantiation (e.g. "obj.~T()", where 'T' is 'int'). This has no actual effect and the analyzer should just skip over it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186927 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 8f5ba0645f..04629dc017 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 58bdcea631..436da2ed9f 100644 --- a/test/Analysis/dtor.cpp +++ b/test/Analysis/dtor.cpp @@ -417,3 +417,17 @@ namespace NoReturn { *x = 47; // no warning } } + +namespace PseudoDtor { + template + 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}} + } +}