@@ -185,7 +185,7 @@ void recursive_initializationt::initialize(
185
185
186
186
code_blockt recursive_initializationt::build_constructor_body (
187
187
const exprt &depth_symbol,
188
- const exprt &result_symbol,
188
+ const symbol_exprt &result_symbol,
189
189
const optionalt<exprt> &size_symbol,
190
190
const optionalt<irep_idt> &lhs_name)
191
191
{
@@ -220,7 +220,7 @@ code_blockt recursive_initializationt::build_constructor_body(
220
220
}
221
221
}
222
222
223
- const irep_idt & recursive_initializationt::build_constructor (const exprt &expr)
223
+ irep_idt recursive_initializationt::build_constructor (const exprt &expr)
224
224
{
225
225
// for `expr` of type T builds a declaration of a function:
226
226
//
@@ -235,7 +235,9 @@ const irep_idt &recursive_initializationt::build_constructor(const exprt &expr)
235
235
{
236
236
expr_name = to_symbol_expr (expr).get_identifier ();
237
237
if (should_be_treated_as_array (*expr_name))
238
+ {
238
239
size_var = get_associated_size_variable (*expr_name);
240
+ }
239
241
}
240
242
const typet &type = expr.type ();
241
243
if (type_constructor_names.find (type) != type_constructor_names.end ())
@@ -554,7 +556,7 @@ symbol_exprt recursive_initializationt::get_free_function()
554
556
555
557
code_blockt recursive_initializationt::build_pointer_constructor (
556
558
const exprt &depth,
557
- const exprt &result)
559
+ const symbol_exprt &result)
558
560
{
559
561
PRECONDITION (result.type ().id () == ID_pointer);
560
562
const typet &type = result.type ().subtype ();
@@ -639,7 +641,7 @@ code_blockt recursive_initializationt::build_pointer_constructor(
639
641
}
640
642
641
643
code_blockt recursive_initializationt::build_array_string_constructor (
642
- const exprt &result) const
644
+ const symbol_exprt &result) const
643
645
{
644
646
PRECONDITION (result.type ().id () == ID_pointer);
645
647
const typet &type = result.type ().subtype ();
@@ -668,7 +670,7 @@ code_blockt recursive_initializationt::build_array_string_constructor(
668
670
669
671
code_blockt recursive_initializationt::build_array_constructor (
670
672
const exprt &depth,
671
- const exprt &result)
673
+ const symbol_exprt &result)
672
674
{
673
675
PRECONDITION (result.type ().id () == ID_pointer);
674
676
const typet &type = result.type ().subtype ();
@@ -690,7 +692,7 @@ code_blockt recursive_initializationt::build_array_constructor(
690
692
691
693
code_blockt recursive_initializationt::build_struct_constructor (
692
694
const exprt &depth,
693
- const exprt &result)
695
+ const symbol_exprt &result)
694
696
{
695
697
PRECONDITION (result.type ().id () == ID_pointer);
696
698
const typet &struct_type = result.type ().subtype ();
@@ -705,8 +707,8 @@ code_blockt recursive_initializationt::build_struct_constructor(
705
707
return body;
706
708
}
707
709
708
- code_blockt
709
- recursive_initializationt::build_nondet_constructor ( const exprt &result) const
710
+ code_blockt recursive_initializationt::build_nondet_constructor (
711
+ const symbol_exprt &result) const
710
712
{
711
713
PRECONDITION (result.type ().id () == ID_pointer);
712
714
code_blockt body{};
@@ -718,7 +720,7 @@ recursive_initializationt::build_nondet_constructor(const exprt &result) const
718
720
719
721
code_blockt recursive_initializationt::build_dynamic_array_constructor (
720
722
const exprt &depth,
721
- const exprt &result,
723
+ const symbol_exprt &result,
722
724
const exprt &size,
723
725
const optionalt<irep_idt> &lhs_name)
724
726
{
@@ -820,7 +822,19 @@ code_blockt recursive_initializationt::build_dynamic_array_constructor(
820
822
821
823
bool recursive_initializationt::needs_freeing (const exprt &expr) const
822
824
{
823
- return expr.type ().id () == ID_pointer && expr.type ().id () != ID_code;
825
+ if (expr.type ().id () != ID_pointer || expr.type ().subtype ().id () == ID_code)
826
+ return false ;
827
+ for (auto const &common_arguments_origin : common_arguments_origins)
828
+ {
829
+ if (common_arguments_origin.has_value () && expr.id () == ID_symbol)
830
+ {
831
+ auto origin_name =
832
+ to_symbol_expr (*common_arguments_origin).get_identifier ();
833
+ auto expr_name = to_symbol_expr (expr).get_identifier ();
834
+ return origin_name == expr_name;
835
+ }
836
+ }
837
+ return true ;
824
838
}
825
839
826
840
void recursive_initializationt::free_if_possible (
0 commit comments