Guard recursion into terms during substitution in arithmetic utility (#8234)
authorGereon Kremer <gereon.kremer@cs.rwth-aachen.de>
Fri, 4 Mar 2022 21:50:32 +0000 (22:50 +0100)
committerGitHub <noreply@github.com>
Fri, 4 Mar 2022 21:50:32 +0000 (21:50 +0000)
commitcf155cb1cc523eb0885351d18d8ef0c7b221f38f
tree2a3a436545a762c952b20d254c460e0c8cac6fca
parent3bc29d4e86534f779f6d94d3cf947a2dded4566f
Guard recursion into terms during substitution in arithmetic utility (#8234)

This PR fixes an issue during variable elimination using equalities in the nonlinear arithmetic solver. We need to make sure that we don't apply the substitutions within terms that are not native arithmetic terms. While we already did that whenever we actually used the resulting term, we did not when we just checked for a possible loop.
Although we always invalidate the substitution cache, the apply method also poisons the actual substitution map. By protecting the calls to apply where we don't actually store the result as well, we avoid this type of "poisoning".
Fixes #8161.
src/theory/arith/nl/equality_substitution.cpp
test/regress/CMakeLists.txt
test/regress/regress0/nl/issue8161-var-elim.smt2 [new file with mode: 0644]