`stripConstantEndpoints()` was returning `true` when the first argument
was a list only containing an empty string, which could lead to rewrite
loops. This commit checks for that case and adds a unit test for it.
unsigned index1 = r == 0 ? 0 : n2.size() - 1;
bool removeComponent = false;
Node n1cmp = n1[index0];
+
+ if (n1cmp.isConst() && n1cmp.getConst<String>().size() == 0)
+ {
+ return false;
+ }
+
std::vector<Node> sss;
std::vector<Node> sls;
n1cmp = decomposeSubstrChain(n1cmp, sss, sls);
}
}
+ void testStripConstantEndpoints()
+ {
+ Node empty = d_nm->mkConst(::CVC4::String(""));
+ Node a = d_nm->mkConst(::CVC4::String("A"));
+
+ {
+ // stripConstantEndpoints({ "" }, { "a" }, {}, {}, 0) ---> false
+ std::vector<Node> n1 = {empty};
+ std::vector<Node> n2 = {a};
+ std::vector<Node> nb;
+ std::vector<Node> ne;
+ bool res =
+ TheoryStringsRewriter::stripConstantEndpoints(n1, n2, nb, ne, 0);
+ TS_ASSERT(!res);
+ }
+ }
+
private:
ExprManager* d_em;
SmtEngine* d_smt;