Renamed local variable.

Added transfer function support for CharacterLiteral.

llvm-svn: 47014
This commit is contained in:
Ted Kremenek 2008-02-12 18:50:32 +00:00
parent 07d65aa238
commit fb9cc188af
1 changed files with 19 additions and 11 deletions

View File

@ -165,14 +165,14 @@ ValueStateManager::AddEQ(ValueState St, SymbolID sym, const llvm::APSInt& V) {
return getPersistentState(NewSt);
}
RValue ValueStateManager::GetValue(ValueState St, Expr* S, bool* hasVal) {
RValue ValueStateManager::GetValue(ValueState St, Expr* E, bool* hasVal) {
for (;;) {
switch (S->getStmtClass()) {
switch (E->getStmtClass()) {
// ParenExprs are no-ops.
case Stmt::ParenExprClass:
S = cast<ParenExpr>(S)->getSubExpr();
E = cast<ParenExpr>(E)->getSubExpr();
continue;
// DeclRefExprs can either evaluate to an LValue or a Non-LValue
@ -181,31 +181,39 @@ RValue ValueStateManager::GetValue(ValueState St, Expr* S, bool* hasVal) {
// within the referenced variables.
case Stmt::DeclRefExprClass:
return GetValue(St, lval::DeclVal(cast<DeclRefExpr>(S)->getDecl()));
return GetValue(St, lval::DeclVal(cast<DeclRefExpr>(E)->getDecl()));
// Integer literals evaluate to an RValue. Simply retrieve the
// RValue for the literal.
case Stmt::IntegerLiteralClass:
return NonLValue::GetValue(ValMgr, cast<IntegerLiteral>(S));
return NonLValue::GetValue(ValMgr, cast<IntegerLiteral>(E));
case Stmt::CharacterLiteralClass: {
CharacterLiteral* C = cast<CharacterLiteral>(E);
return NonLValue::GetValue(ValMgr, C->getValue(), C->getType(),
C->getLoc());
}
// Casts where the source and target type are the same
// are no-ops. We blast through these to get the descendant
// subexpression that has a value.
case Stmt::ImplicitCastExprClass: {
ImplicitCastExpr* C = cast<ImplicitCastExpr>(S);
ImplicitCastExpr* C = cast<ImplicitCastExpr>(E);
if (C->getType() == C->getSubExpr()->getType()) {
S = C->getSubExpr();
E = C->getSubExpr();
continue;
}
break;
}
case Stmt::CastExprClass: {
CastExpr* C = cast<CastExpr>(S);
CastExpr* C = cast<CastExpr>(E);
if (C->getType() == C->getSubExpr()->getType()) {
S = C->getSubExpr();
E = C->getSubExpr();
continue;
}
break;
@ -220,14 +228,14 @@ RValue ValueStateManager::GetValue(ValueState St, Expr* S, bool* hasVal) {
break;
}
ValueState::ExprBindingsTy::TreeTy* T = St->SubExprBindings.SlimFind(S);
ValueState::ExprBindingsTy::TreeTy* T = St->SubExprBindings.SlimFind(E);
if (T) {
if (hasVal) *hasVal = true;
return T->getValue().second;
}
T = St->BlockExprBindings.SlimFind(S);
T = St->BlockExprBindings.SlimFind(E);
if (T) {
if (hasVal) *hasVal = true;