From d433835ac131572b2c5d4189f5139a580f404498 Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 16 May 2025 19:11:43 +0800 Subject: [PATCH] cgen: fix map of fixed array value in if guard (fix #24488) (#24496) --- vlib/v/gen/c/if.v | 13 +++++++-- vlib/v/gen/c/index.v | 6 +++- .../map_fixed_array_if_guard_test.v | 29 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 vlib/v/tests/builtin_maps/map_fixed_array_if_guard_test.v diff --git a/vlib/v/gen/c/if.v b/vlib/v/gen/c/if.v index 8501da259..89f1f0ec1 100644 --- a/vlib/v/gen/c/if.v +++ b/vlib/v/gen/c/if.v @@ -343,9 +343,16 @@ fn (mut g Gen) if_expr(node ast.IfExpr) { } else { branch.cond.vars[0].name } - g.write('\t${base_type} ${cond_var_name} = ') - g.expr(branch.cond.expr) - g.writeln(';') + if g.table.sym(branch.cond.expr_type).kind == .array_fixed { + g.writeln('\t${base_type} ${cond_var_name} = {0};') + g.write('\tmemcpy((${base_type}*)${cond_var_name}, &') + g.expr(branch.cond.expr) + g.writeln(', sizeof(${base_type}));') + } else { + g.write('\t${base_type} ${cond_var_name} = ') + g.expr(branch.cond.expr) + g.writeln(';') + } } else { mut is_auto_heap := false if branch.stmts.len > 0 { diff --git a/vlib/v/gen/c/index.v b/vlib/v/gen/c/index.v index d990a97cd..85983baad 100644 --- a/vlib/v/gen/c/index.v +++ b/vlib/v/gen/c/index.v @@ -546,7 +546,11 @@ fn (mut g Gen) index_of_map(node ast.IndexExpr, sym ast.TypeSymbol) { opt_val_type := g.styp(val_type.set_flag(.option)) g.writeln('${opt_val_type} ${tmp_opt} = {0};') g.writeln('if (${tmp_opt_ptr}) {') - g.writeln('\t*((${val_type_str}*)&${tmp_opt}.data) = *((${val_type_str}*)${tmp_opt_ptr});') + if val_sym.kind == .array_fixed { + g.writeln('\tmemcpy((${val_type_str}*)${tmp_opt}.data, (${val_type_str}*)${tmp_opt_ptr}, sizeof(${val_type_str}));') + } else { + g.writeln('\t*((${val_type_str}*)&${tmp_opt}.data) = *((${val_type_str}*)${tmp_opt_ptr});') + } g.writeln('} else {') g.writeln('\t${tmp_opt}.state = 2; ${tmp_opt}.err = _v_error(_SLIT("map key does not exist"));') g.writeln('}') diff --git a/vlib/v/tests/builtin_maps/map_fixed_array_if_guard_test.v b/vlib/v/tests/builtin_maps/map_fixed_array_if_guard_test.v new file mode 100644 index 000000000..f7d0a95dc --- /dev/null +++ b/vlib/v/tests/builtin_maps/map_fixed_array_if_guard_test.v @@ -0,0 +1,29 @@ +struct Serials { + a u8 + b u8 + c u8 +pub mut: + ids map[u8][3]u8 +} + +pub fn (mut s Serials) id(id u8) { + if _ := s.ids[id] { + } else { + s3 := u8(s.c + s.ids.len) + s.ids[id] = [s.a, s.a, s3]! + } +} + +fn test_map_fixed_array_if_guard() { + mut s := Serials{ + a: 1 + b: 2 + } + s.id(u8(3)) + println(s) + assert s.ids[3] == [u8(1), 1, 0]! + + s.id(u8(4)) + println(s) + assert s.ids[4] == [u8(1), 1, 1]! +} -- 2.39.5