Provide basic static analyzer support for CXXTemporaryObjectExpr. Patch by Jim Goodnow II.

llvm-svn: 141433
This commit is contained in:
Ted Kremenek 2011-10-07 22:48:13 +00:00
parent 34e8b0f560
commit d79719b144
2 changed files with 25 additions and 1 deletions

View File

@ -455,7 +455,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
case Stmt::CXXDependentScopeMemberExprClass:
case Stmt::CXXForRangeStmtClass:
case Stmt::CXXPseudoDestructorExprClass:
case Stmt::CXXTemporaryObjectExprClass:
case Stmt::CXXThrowExprClass:
case Stmt::CXXTryStmtClass:
case Stmt::CXXTypeidExprClass:
@ -628,6 +627,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
break;
}
case Stmt::CXXTemporaryObjectExprClass:
case Stmt::CXXConstructExprClass: {
const CXXConstructExpr *C = cast<CXXConstructExpr>(S);
// For block-level CXXConstructExpr, we don't have a destination region.

View File

@ -21,3 +21,27 @@ void test_rdar10243398(RDar10243398 *p) {
RDar10243398MemberFn q = &RDar10243398::bar;
((*p).*(q))(1);
}
// Tests for CXXTemporaryObjectExpr.
struct X {
X( int *ip, int );
};
// Test to see if CXXTemporaryObjectExpr is being handled.
int tempobj1()
{
int j;
int i;
X a = X( &j, 1 );
return i; // expected-warning {{Undefined or garbage value returned to caller}}
}
// Test to see if CXXTemporaryObjectExpr invalidates arguments.
int tempobj2()
{
int j;
X a = X( &j, 1 );
return j; // no-warning
}