From afc81277befe3cb5a61c681d2c52c4f92966dbbf Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 20 Jun 2021 13:09:24 +0800 Subject: [PATCH] v.gen.c: fix assigning a fixed array variable to a map value (#10523) --- vlib/builtin/map_test.v | 13 +++++++++++++ vlib/v/gen/c/cgen.v | 26 ++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/vlib/builtin/map_test.v b/vlib/builtin/map_test.v index 9a9f7ab9ea..9c50ab73ed 100644 --- a/vlib/builtin/map_test.v +++ b/vlib/builtin/map_test.v @@ -932,3 +932,16 @@ fn test_u64_keys() { } assert m.len == 0 } + +fn test_map_set_fixed_array_variable() { + mut m := map[string][2]f64{} + m['A'] = [1.1, 2.2]! + println(m) + assert '$m' == "{'A': [1.1, 2.2]}" + + mut m2 := map[string][2]f64{} + arr := [1.1, 2.2]! + m2['A'] = arr + println(m2) + assert '$m2' == "{'A': [1.1, 2.2]}" +} diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index ee8a081cb9..6abcfd3870 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -2474,7 +2474,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { else {} } right_sym := g.table.get_type_symbol(g.unwrap_generic(val_type)) - is_fixed_array_copy := right_sym.kind == .array_fixed && val is ast.Ident + is_fixed_array_var := right_sym.kind == .array_fixed && val is ast.Ident g.is_assign_lhs = true g.assign_op = assign_stmt.op if val_type.has_flag(.optional) { @@ -2491,13 +2491,19 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { g.expr(val) g.writeln(';}') } - } else if is_fixed_array_init && assign_stmt.op == .assign { - right := val as ast.ArrayInit - v_var := g.new_tmp_var() + } else if assign_stmt.op == .assign && (is_fixed_array_init || is_fixed_array_var) { + mut v_var := '' arr_typ := styp.trim('*') - g.write('$arr_typ $v_var = ') - g.expr(right) - g.writeln(';') + if is_fixed_array_init { + right := val as ast.ArrayInit + v_var = g.new_tmp_var() + g.write('$arr_typ $v_var = ') + g.expr(right) + g.writeln(';') + } else { + right := val as ast.Ident + v_var = right.name + } pos := g.out.len g.expr(left) @@ -2580,7 +2586,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { if left is ast.Ident || left is ast.SelectorExpr { g.prevent_sum_type_unwrapping_once = true } - if !is_fixed_array_copy || is_decl { + if !is_fixed_array_var || is_decl { if !is_decl && left.is_auto_deref_var() { g.write('*') } @@ -2593,7 +2599,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { g.expr(left) } g.is_assign_lhs = false - if is_fixed_array_copy { + if is_fixed_array_var { if is_decl { g.writeln(';') } @@ -2628,7 +2634,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { } g.is_shared = var_type.has_flag(.shared_f) if !cloned { - if is_fixed_array_copy { + if is_fixed_array_var { typ_str := g.typ(val_type).trim('*') ref_str := if val_type.is_ptr() { '' } else { '&' } g.write('memcpy(($typ_str*)')