Skip to content

Commit 8e05175

Browse files
committed
Lower before converting to expression in ::get
In order to fix empty struct support.
1 parent 2cb9c45 commit 8e05175

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -497,14 +497,15 @@ exprt smt2_incremental_decision_proceduret::get(const exprt &expr) const
497497
{
498498
return identifier_descriptor;
499499
}
500-
if(gather_dependent_expressions(expr).empty())
500+
const exprt lowered = lower(expr);
501+
if(gather_dependent_expressions(lowered).empty())
501502
{
502503
INVARIANT(
503-
objects_are_already_tracked(expr, object_map),
504+
objects_are_already_tracked(lowered, object_map),
504505
"Objects in expressions being read should already be tracked from "
505506
"point of being set/handled.");
506507
return ::convert_expr_to_smt(
507-
expr,
508+
lowered,
508509
object_map,
509510
pointer_sizes_map,
510511
object_size_function.make_application,

unit/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -1044,4 +1044,18 @@ TEST_CASE(
10441044
REQUIRE(test.procedure() == decision_proceduret::resultt::D_SATISFIABLE);
10451045
CHECK(test.sent_commands == expected_check_commands);
10461046
test.sent_commands.clear();
1047+
1048+
INFO("Getting values involving empty structs.");
1049+
test.mock_responses.push_front(
1050+
smt_get_value_responset{{{expected_handle, smt_bool_literal_termt{true}}}});
1051+
CHECK(test.procedure.get(equality_expression) == true_exprt{});
1052+
test.mock_responses.push_front(smt_get_value_responset{
1053+
{{smt_identifier_termt{"foo", smt_bit_vector_sortt{8}},
1054+
smt_bit_vector_constant_termt{0, 8}}}});
1055+
const struct_exprt expected_empty{{}, type_reference};
1056+
CHECK(test.procedure.get(foo.symbol_expr()) == expected_empty);
1057+
const std::vector<smt_commandt> expected_get_commands{
1058+
smt_get_value_commandt{expected_handle},
1059+
smt_get_value_commandt{expected_foo}};
1060+
CHECK(test.sent_commands == expected_get_commands);
10471061
}

0 commit comments

Comments
 (0)