diff options
| author | Jordan Rose <jordan_rose@apple.com> | 2013-07-23 02:15:20 +0000 | 
|---|---|---|
| committer | Jordan Rose <jordan_rose@apple.com> | 2013-07-23 02:15:20 +0000 | 
| commit | 316cdda54bd6e25a02a4f01012fa8e7d0da2fe3d (patch) | |
| tree | 4eb869eac808b30ebb8663d5752ec8bec19424fc | |
| parent | a45ffe17c717047a0286c44ef5074fe6f37f7caa (diff) | |
| download | bcm5719-llvm-316cdda54bd6e25a02a4f01012fa8e7d0da2fe3d.tar.gz bcm5719-llvm-316cdda54bd6e25a02a4f01012fa8e7d0da2fe3d.zip | |
[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.
llvm-svn: 186927
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Analysis/dtor.cpp | 14 | 
2 files changed, 15 insertions, 1 deletions
| diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 8f5ba0645f3..04629dc0170 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/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/clang/test/Analysis/dtor.cpp b/clang/test/Analysis/dtor.cpp index 58bdcea6317..436da2ed9f3 100644 --- a/clang/test/Analysis/dtor.cpp +++ b/clang/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}} +  } +} | 

