summaryrefslogtreecommitdiff
path: root/clang/include/clang/Analysis/Analyses/IntervalSolver/VariableAssignment.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/include/clang/Analysis/Analyses/IntervalSolver/VariableAssignment.hpp')
-rw-r--r--clang/include/clang/Analysis/Analyses/IntervalSolver/VariableAssignment.hpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/clang/include/clang/Analysis/Analyses/IntervalSolver/VariableAssignment.hpp b/clang/include/clang/Analysis/Analyses/IntervalSolver/VariableAssignment.hpp
index 0bbebfc..ba5f650 100644
--- a/clang/include/clang/Analysis/Analyses/IntervalSolver/VariableAssignment.hpp
+++ b/clang/include/clang/Analysis/Analyses/IntervalSolver/VariableAssignment.hpp
@@ -35,8 +35,12 @@ struct DynamicVariableAssignment : public VariableAssignment<Domain> {
void invalidate(const Variable<Domain>& x) const {
solver_log::fixpoint << indent() << "Invalidating " << x << std::endl;
- _stable.remove(x);
- _values[x] = infinity<Domain>();
+ if (_stable.contains(x)) {
+ _stable.remove(x);
+ _values[x] = infinity<Domain>();
+
+ solve(x);
+ }
}
private:
@@ -49,8 +53,8 @@ private:
stack_depth++;
if (!_system[x])
return;
- Domain val = _system[x]->eval(DependencyAssignment(*this, x),
- _strategy);
+ Domain val = _system[x]->evalWithStrat(DependencyAssignment(*this, x),
+ _strategy);
stack_depth--;
if (val != _values[x]) {