diff options
Diffstat (limited to 'lib/Checker/Environment.cpp')
-rw-r--r-- | lib/Checker/Environment.cpp | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/lib/Checker/Environment.cpp b/lib/Checker/Environment.cpp index 798f9ba9da..aac4afaafb 100644 --- a/lib/Checker/Environment.cpp +++ b/lib/Checker/Environment.cpp @@ -17,32 +17,25 @@ using namespace clang; -SVal Environment::GetSVal(const Stmt *E, ValueManager& ValMgr) const { - +SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder) const { for (;;) { - switch (E->getStmtClass()) { - case Stmt::AddrLabelExprClass: - return ValMgr.makeLoc(cast<AddrLabelExpr>(E)); - - // ParenExprs are no-ops. - + return svalBuilder.makeLoc(cast<AddrLabelExpr>(E)); case Stmt::ParenExprClass: + // ParenExprs are no-ops. E = cast<ParenExpr>(E)->getSubExpr(); continue; - case Stmt::CharacterLiteralClass: { const CharacterLiteral* C = cast<CharacterLiteral>(E); - return ValMgr.makeIntVal(C->getValue(), C->getType()); + return svalBuilder.makeIntVal(C->getValue(), C->getType()); } - case Stmt::CXXBoolLiteralExprClass: { const SVal *X = ExprBindings.lookup(E); if (X) return *X; else - return ValMgr.makeIntVal(cast<CXXBoolLiteralExpr>(E)); + return svalBuilder.makeIntVal(cast<CXXBoolLiteralExpr>(E)); } case Stmt::IntegerLiteralClass: { // In C++, this expression may have been bound to a temporary object. @@ -50,47 +43,37 @@ SVal Environment::GetSVal(const Stmt *E, ValueManager& ValMgr) const { if (X) return *X; else - return ValMgr.makeIntVal(cast<IntegerLiteral>(E)); + return svalBuilder.makeIntVal(cast<IntegerLiteral>(E)); } - - // We blast through no-op casts to get the descendant - // subexpression that has a value. - case Stmt::ImplicitCastExprClass: case Stmt::CStyleCastExprClass: { + // We blast through no-op casts to get the descendant + // subexpression that has a value. const CastExpr* C = cast<CastExpr>(E); QualType CT = C->getType(); - if (CT->isVoidType()) return UnknownVal(); - if (C->getCastKind() == CK_NoOp) { E = C->getSubExpr(); continue; } break; } - case Stmt::CXXExprWithTemporariesClass: E = cast<CXXExprWithTemporaries>(E)->getSubExpr(); continue; - case Stmt::CXXBindTemporaryExprClass: E = cast<CXXBindTemporaryExpr>(E)->getSubExpr(); continue; - case Stmt::CXXFunctionalCastExprClass: E = cast<CXXFunctionalCastExpr>(E)->getSubExpr(); - continue; - + continue; // Handle all other Stmt* using a lookup. default: break; }; - break; } - return LookupExpr(E); } |