[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
This commit is contained in:
parent
a45ffe17c7
commit
316cdda54b
|
@ -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);
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue