From 3fdbfca2025f8073c9c63668d6f165c75ddbc13f Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 2 Nov 2021 23:40:13 +0800 Subject: [PATCH] cgen: fix `for in` with mutable structs (#12368) --- vlib/v/gen/c/cgen.v | 6 ++- vlib/v/tests/for_in_mut_struct_val_test.v | 45 +++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/for_in_mut_struct_val_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index eb74902d15..45fe12130e 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2165,7 +2165,11 @@ fn (mut g Gen) for_in_stmt(node ast.ForInStmt) { g.writeln('\tif (${t_var}.state != 0) break;') val := if node.val_var in ['', '_'] { g.new_tmp_var() } else { node.val_var } val_styp := g.typ(node.val_type) - g.writeln('\t$val_styp $val = *($val_styp*)${t_var}.data;') + if node.val_is_mut { + g.writeln('\t$val_styp* $val = ($val_styp*)${t_var}.data;') + } else { + g.writeln('\t$val_styp $val = *($val_styp*)${t_var}.data;') + } } else { typ_str := g.table.type_to_str(node.cond_type) g.error('for in: unhandled symbol `$node.cond` of type `$typ_str`', node.pos) diff --git a/vlib/v/tests/for_in_mut_struct_val_test.v b/vlib/v/tests/for_in_mut_struct_val_test.v new file mode 100644 index 0000000000..9bb5ba299a --- /dev/null +++ b/vlib/v/tests/for_in_mut_struct_val_test.v @@ -0,0 +1,45 @@ +struct Struct { +mut: + array [][]int +} + +fn (s Struct) rows() StructsRowIterator { + return StructsRowIterator{ + array: s.array + position: 0 + } +} + +struct StructsRowIterator { + Struct +mut: + position int +} + +fn (mut s StructsRowIterator) next() ?[]int { + if s.position >= s.array.len { + return error('out of range') + } + defer { + s.position++ + } + return s.array[s.position] +} + +fn test_for_in_mut_struct_val() { + mut s := Struct{ + array: [[1, 2, 3], [4, 5, 6]] + } + println(s) + mut si := s.rows() + println(si) + + mut rets := []string{} + for mut row in si { + println(row) + rets << '$row' + } + assert rets.len == 2 + assert rets[0] == '[1, 2, 3]' + assert rets[1] == '[4, 5, 6]' +}