diff options
-rw-r--r-- | lib/Analysis/SimpleSValuator.cpp | 9 | ||||
-rw-r--r-- | test/Analysis/misc-ps.m | 11 |
2 files changed, 18 insertions, 2 deletions
diff --git a/lib/Analysis/SimpleSValuator.cpp b/lib/Analysis/SimpleSValuator.cpp index 2869fabea3..636ce15c33 100644 --- a/lib/Analysis/SimpleSValuator.cpp +++ b/lib/Analysis/SimpleSValuator.cpp @@ -349,8 +349,13 @@ SVal SimpleSValuator::EvalBinOpNN(const GRState *state, // Does the symbol simplify to a constant? if (Sym->getType(ValMgr.getContext())->isIntegerType()) if (const llvm::APSInt *Constant = state->getSymVal(Sym)) { - lhs = nonloc::ConcreteInt(*Constant); - continue; + // What should we convert it to? + if (nonloc::ConcreteInt *rhs_I = dyn_cast<nonloc::ConcreteInt>(&rhs)){ + BasicValueFactory &BVF = ValMgr.getBasicValueFactory(); + lhs = nonloc::ConcreteInt(BVF.Convert(rhs_I->getValue(), + *Constant)); + continue; + } } if (isa<nonloc::ConcreteInt>(rhs)) { diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 565dc61f3b..10e5823c20 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -681,3 +681,14 @@ void *rdar7152418_bar(); return 1; } +// Test constant-folding of symbolic values, automatically handling type +// conversions of the symbol as necessary. Previously this would crash +// once we started eagerly evaluating symbols whose values were constrained +// to a single value. +void test_constant_symbol(signed char x) { + while (1) { + if (x == ((signed char) 0)) {} + } +} + + |