summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-07-23 02:15:20 +0000
committerJordan Rose <jordan_rose@apple.com>2013-07-23 02:15:20 +0000
commit316cdda54bd6e25a02a4f01012fa8e7d0da2fe3d (patch)
tree4eb869eac808b30ebb8663d5752ec8bec19424fc
parenta45ffe17c717047a0286c44ef5074fe6f37f7caa (diff)
downloadbcm5719-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.cpp2
-rw-r--r--clang/test/Analysis/dtor.cpp14
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}}
+ }
+}
OpenPOWER on IntegriCloud