@@ -367,7 +367,7 @@ smt2_incremental_decision_proceduret::get_identifier(const exprt &expr) const
367
367
return {};
368
368
}
369
369
370
- array_exprt smt2_incremental_decision_proceduret::get_expr (
370
+ optionalt<exprt> smt2_incremental_decision_proceduret::get_expr (
371
371
const smt_termt &array,
372
372
const array_typet &type) const
373
373
{
@@ -388,16 +388,25 @@ array_exprt smt2_incremental_decision_proceduret::get_expr(
388
388
pointer_sizes_map,
389
389
object_size_function.make_application ,
390
390
is_dynamic_object_function.make_application );
391
- elements.push_back (get_expr (
392
- smt_array_theoryt::select (array, index_term), type.element_type ()));
391
+ auto element = get_expr (
392
+ smt_array_theoryt::select (array, index_term), type.element_type ());
393
+ if (!element)
394
+ return {};
395
+ elements.push_back (std::move (*element));
393
396
}
394
397
return array_exprt{elements, type};
395
398
}
396
399
397
- exprt smt2_incremental_decision_proceduret::get_expr (
400
+ optionalt< exprt> smt2_incremental_decision_proceduret::get_expr (
398
401
const smt_termt &descriptor,
399
402
const typet &type) const
400
403
{
404
+ if (const auto array_type = type_try_dynamic_cast<array_typet>(type))
405
+ {
406
+ if (array_type->is_incomplete ())
407
+ return {};
408
+ return get_expr (descriptor, *array_type);
409
+ }
401
410
const smt_get_value_commandt get_value_command{descriptor};
402
411
const smt_responset response = get_response_to_command (
403
412
*solver_process, get_value_command, identifier_table);
@@ -483,13 +492,9 @@ exprt smt2_incremental_decision_proceduret::get(const exprt &expr) const
483
492
irep_pretty_diagnosticst{expr});
484
493
return build_expr_based_on_getting_operands (expr, *this );
485
494
}
486
- if (const auto array_type = type_try_dynamic_cast<array_typet>(expr.type ()))
487
- {
488
- if (array_type->is_incomplete ())
489
- return expr;
490
- return get_expr (*descriptor, *array_type);
491
- }
492
- return get_expr (*descriptor, expr.type ());
495
+ if (auto result = get_expr (*descriptor, expr.type ()))
496
+ return std::move (*result);
497
+ return expr;
493
498
}
494
499
495
500
void smt2_incremental_decision_proceduret::print_assignment (
0 commit comments