Skip to content

Commit 4473f06

Browse files
committed
Fix Java multinewarray
Simply assigning to a temporary symbol of the correct type and amending the type passed to the elaboration of the sub-array seems to suffice to properly initialise a multi-dimensional array.
1 parent a7663cb commit 4473f06

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

src/goto-programs/builtin_functions.cpp

+19-3
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)