Generalize VisitLValue: not only can CallExprs and ObjCMessageExprs return aggregate temporaries, so can many other expressions.

llvm-svn: 57761
This commit is contained in:
Ted Kremenek 2008-10-18 04:15:35 +00:00
parent 8f5dc295ce
commit 850422e5d2
1 changed files with 9 additions and 12 deletions

View File

@ -408,9 +408,6 @@ void GRExprEngine::VisitLValue(Expr* Ex, NodeTy* Pred, NodeSet& Dst) {
}
switch (Ex->getStmtClass()) {
default:
Ex->dump();
assert(0 && "Other kinds of expressions do not have lvalue.");
case Stmt::ArraySubscriptExprClass:
VisitArraySubscriptExpr(cast<ArraySubscriptExpr>(Ex), Pred, Dst, true);
@ -447,16 +444,16 @@ void GRExprEngine::VisitLValue(Expr* Ex, NodeTy* Pred, NodeSet& Dst) {
Dst.Add(Pred);
return;
case Stmt::CallExprClass:
case Stmt::ObjCMessageExprClass:
// Function calls and message expressions that return temporaries
// that are objects can be called in this context. We need to
// enhance our support of struct return values, so right now just
// do a regular visit.
assert (!Ex->getType()->isIntegerType());
assert (!Ex->getType()->isPointerType());
Visit(Ex, Pred, Dst);
default:
// Arbitrary subexpressions can return aggregate temporaries that
// can be used in a lvalue context. We need to enhance our support
// of such temporaries in both the environment and the store, so right
// now we just do a regular visit.
assert (Ex->getType()->isAggregateType() &&
"Other kinds of expressions with non-aggregate types do not "
"have lvalues.");
Visit(Ex, Pred, Dst);
}
}