From d3327ba50fd5cc2099b24ba0a468ab14f9e4a771 Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 25 Jan 2021 06:18:11 +0800 Subject: [PATCH] cgen: fix for_mut_val_in_map_fixed_array (#8314) --- vlib/v/gen/cgen.v | 18 ++++++++++++++++-- vlib/v/tests/for_in_mut_val_test.v | 9 +++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 9dd72c5470..8ba1d5fe3f 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -1978,7 +1978,14 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { right := val as ast.ArrayInit if right.has_val { for j, expr in right.exprs { - g.expr(left) + if !is_decl && left is ast.Ident + && g.for_in_mul_val_name == (left as ast.Ident).name { + g.write('(*') + g.expr(left) + g.write(')') + } else { + g.expr(left) + } if g.is_array_set { g.out.go_back(2) } else { @@ -1995,7 +2002,14 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { } else { fixed_array := right_sym.info as table.ArrayFixed for j in 0 .. fixed_array.size { - g.expr(left) + if !is_decl && left is ast.Ident + && g.for_in_mul_val_name == (left as ast.Ident).name { + g.write('(*') + g.expr(left) + g.write(')') + } else { + g.expr(left) + } if g.is_array_set { g.out.go_back(2) } else { diff --git a/vlib/v/tests/for_in_mut_val_test.v b/vlib/v/tests/for_in_mut_val_test.v index 7ad6053fe6..a7f35ae9e4 100644 --- a/vlib/v/tests/for_in_mut_val_test.v +++ b/vlib/v/tests/for_in_mut_val_test.v @@ -58,3 +58,12 @@ fn test_for_in_mut_val_of_map_direct() { println(m) assert '$m' == "{'foo': 3, 'bar': 3}" } + +fn test_for_in_mut_val_of_map_fixed_array() { + mut m := {'foo': [{'a': 1}]!, 'bar': [{'b': 2}]!} + for _, mut j in m { + j = [{'c': 3}]! + } + println(m) + assert '$m' == "{'foo': [{'c': 3}], 'bar': [{'c': 3}]}" +}