Skip to content

Commit c391c08

Browse files
Merge pull request #6617 from thomasspriggs/tas/fix_smt_relational_conversion
Avoid down casting to `binary_relation_exprt` in expr to (incremental) SMT2 conversion
2 parents 637f138 + dfb5679 commit c391c08

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

src/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -287,40 +287,41 @@ static smt_termt convert_relational_to_smt(
287287
binary_relation.pretty());
288288
}
289289

290-
static smt_termt
291-
convert_expr_to_smt(const binary_relation_exprt &binary_relation)
290+
static optionalt<smt_termt> try_relational_conversion(const exprt &expr)
292291
{
293-
if(can_cast_expr<greater_than_exprt>(binary_relation))
292+
if(const auto greater_than = expr_try_dynamic_cast<greater_than_exprt>(expr))
294293
{
295294
return convert_relational_to_smt(
296-
binary_relation,
295+
*greater_than,
297296
smt_bit_vector_theoryt::unsigned_greater_than,
298297
smt_bit_vector_theoryt::signed_greater_than);
299298
}
300-
if(can_cast_expr<greater_than_or_equal_exprt>(binary_relation))
299+
if(
300+
const auto greater_than_or_equal =
301+
expr_try_dynamic_cast<greater_than_or_equal_exprt>(expr))
301302
{
302303
return convert_relational_to_smt(
303-
binary_relation,
304+
*greater_than_or_equal,
304305
smt_bit_vector_theoryt::unsigned_greater_than_or_equal,
305306
smt_bit_vector_theoryt::signed_greater_than_or_equal);
306307
}
307-
if(can_cast_expr<less_than_exprt>(binary_relation))
308+
if(const auto less_than = expr_try_dynamic_cast<less_than_exprt>(expr))
308309
{
309310
return convert_relational_to_smt(
310-
binary_relation,
311+
*less_than,
311312
smt_bit_vector_theoryt::unsigned_less_than,
312313
smt_bit_vector_theoryt::signed_less_than);
313314
}
314-
if(can_cast_expr<less_than_or_equal_exprt>(binary_relation))
315+
if(
316+
const auto less_than_or_equal =
317+
expr_try_dynamic_cast<less_than_or_equal_exprt>(expr))
315318
{
316319
return convert_relational_to_smt(
317-
binary_relation,
320+
*less_than_or_equal,
318321
smt_bit_vector_theoryt::unsigned_less_than_or_equal,
319322
smt_bit_vector_theoryt::signed_less_than_or_equal);
320323
}
321-
UNIMPLEMENTED_FEATURE(
322-
"Generation of SMT formula for binary relation expression: " +
323-
binary_relation.pretty());
324+
return {};
324325
}
325326

326327
static smt_termt convert_expr_to_smt(const plus_exprt &plus)
@@ -686,11 +687,9 @@ smt_termt convert_expr_to_smt(const exprt &expr)
686687
{
687688
return convert_expr_to_smt(*float_not_equal);
688689
}
689-
if(
690-
const auto binary_relation =
691-
expr_try_dynamic_cast<binary_relation_exprt>(expr))
690+
if(const auto converted_relational = try_relational_conversion(expr))
692691
{
693-
return convert_expr_to_smt(*binary_relation);
692+
return *converted_relational;
694693
}
695694
if(const auto plus = expr_try_dynamic_cast<plus_exprt>(expr))
696695
{

0 commit comments

Comments
 (0)