@@ -851,13 +851,19 @@ void goto_convertt::do_java_new_array(
851851 goto_programt tmp;
852852
853853 symbol_exprt tmp_i=
854- new_tmp_symbol (index_type (), " index" , tmp, location).symbol_expr ();
854+ new_tmp_symbol (length. type (), " index" , tmp, location).symbol_expr ();
855855
856856 code_fort for_loop;
857857
858858 side_effect_exprt sub_java_new=rhs;
859859 sub_java_new.operands ().erase (sub_java_new.operands ().begin ());
860860
861+ assert (rhs.type ().id ()==ID_pointer);
862+ typet sub_type=
863+ static_cast <const typet &>(rhs.type ().subtype ().find (" #element_type" ));
864+ assert (sub_type.id ()==ID_pointer);
865+ sub_java_new.type ()=sub_type;
866+
861867 side_effect_exprt inc (ID_assign);
862868 inc.operands ().resize (2 );
863869 inc.op0 ()=tmp_i;
@@ -866,11 +872,21 @@ void goto_convertt::do_java_new_array(
866872 dereference_exprt deref_expr (
867873 plus_exprt (data, tmp_i), data.type ().subtype ());
868874
875+ code_blockt for_body;
876+ symbol_exprt init_sym=
877+ new_tmp_symbol (sub_type, " subarray_init" , tmp, location).symbol_expr ();
878+
879+ code_assignt init_subarray (init_sym, sub_java_new);
880+ code_assignt assign_subarray (
881+ deref_expr,
882+ typecast_exprt (init_sym, deref_expr.type ()));
883+ for_body.move_to_operands (init_subarray);
884+ for_body.move_to_operands (assign_subarray);
885+
869886 for_loop.init ()=code_assignt (tmp_i, from_integer (0 , tmp_i.type ()));
870887 for_loop.cond ()=binary_relation_exprt (tmp_i, ID_lt, rhs.op0 ());
871888 for_loop.iter ()=inc;
872- for_loop.body ()=code_skipt ();
873- for_loop.body ()=code_assignt (deref_expr, sub_java_new);
889+ for_loop.body ()=for_body;
874890
875891 convert (for_loop, tmp);
876892 dest.destructive_append (tmp);
0 commit comments