@@ -851,13 +851,19 @@ void goto_convertt::do_java_new_array(
851
851
goto_programt tmp;
852
852
853
853
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 ();
855
855
856
856
code_fort for_loop;
857
857
858
858
side_effect_exprt sub_java_new=rhs;
859
859
sub_java_new.operands ().erase (sub_java_new.operands ().begin ());
860
860
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
+
861
867
side_effect_exprt inc (ID_assign);
862
868
inc.operands ().resize (2 );
863
869
inc.op0 ()=tmp_i;
@@ -866,11 +872,21 @@ void goto_convertt::do_java_new_array(
866
872
dereference_exprt deref_expr (
867
873
plus_exprt (data, tmp_i), data.type ().subtype ());
868
874
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
+
869
886
for_loop.init ()=code_assignt (tmp_i, from_integer (0 , tmp_i.type ()));
870
887
for_loop.cond ()=binary_relation_exprt (tmp_i, ID_lt, rhs.op0 ());
871
888
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;
874
890
875
891
convert (for_loop, tmp);
876
892
dest.destructive_append (tmp);
0 commit comments