summaryrefslogtreecommitdiffstats
path: root/clang/Analysis/RValues.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/Analysis/RValues.cpp')
-rw-r--r--clang/Analysis/RValues.cpp18
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 {
OpenPOWER on IntegriCloud