Provide basic static analyzer support for CXXTemporaryObjectExpr. Patch by Jim Goodnow II.
llvm-svn: 141433
This commit is contained in:
parent
34e8b0f560
commit
d79719b144
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue