diff options
Diffstat (limited to 'clang/Analysis/RValues.cpp')
| -rw-r--r-- | clang/Analysis/RValues.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/clang/Analysis/RValues.cpp b/clang/Analysis/RValues.cpp index d7c4dac252b..6369da4d7ff 100644 --- a/clang/Analysis/RValues.cpp +++ b/clang/Analysis/RValues.cpp @@ -48,11 +48,16 @@ RVal::symbol_iterator RVal::symbol_end() const { // Transfer function dispatch for Non-LVals. //===----------------------------------------------------------------------===// -nonlval::ConcreteInt +RVal nonlval::ConcreteInt::EvalBinOp(ValueManager& ValMgr, BinaryOperator::Opcode Op, const nonlval::ConcreteInt& R) const { - return ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue()); + const llvm::APSInt* X = ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue()); + + if (X) + return nonlval::ConcreteInt(*X); + else + return UndefinedVal(); } @@ -76,14 +81,19 @@ nonlval::ConcreteInt::EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const { // Transfer function dispatch for LVals. //===----------------------------------------------------------------------===// -lval::ConcreteInt +RVal lval::ConcreteInt::EvalBinOp(ValueManager& ValMgr, BinaryOperator::Opcode Op, const lval::ConcreteInt& R) const { assert (Op == BinaryOperator::Add || Op == BinaryOperator::Sub || (Op >= BinaryOperator::LT && Op <= BinaryOperator::NE)); - return ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue()); + const llvm::APSInt* X = ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue()); + + if (X) + return lval::ConcreteInt(*X); + else + return UndefinedVal(); } NonLVal LVal::EQ(ValueManager& ValMgr, const LVal& R) const { |

