From f4c07213a278af38e7dd89415c9a9ef42126790e Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 15 Apr 2026 03:01:35 +0300 Subject: [PATCH] cgen: fix c error when inserting struct reference into map that doesn't expect one (fixes #26860) --- vlib/v/gen/c/assign.v | 3 ++- .../builtin_maps/map_assign_ref_to_value_test.v | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/builtin_maps/map_assign_ref_to_value_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 2b0c955b4..6724477f2 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -1962,7 +1962,8 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { } else { var_type }.clear_flag(.shared_f) // don't reset the mutex, just change the value - if val is ast.PrefixExpr && val.op == .amp && val.right is ast.Ident + if exp_type.is_any_kind_of_pointer() && val is ast.PrefixExpr + && val.op == .amp && val.right is ast.Ident && ((val.right as ast.Ident).is_auto_heap() || g.resolved_ident_is_auto_heap(val.right as ast.Ident)) { old_inside_assign_fn_var := g.inside_assign_fn_var diff --git a/vlib/v/tests/builtin_maps/map_assign_ref_to_value_test.v b/vlib/v/tests/builtin_maps/map_assign_ref_to_value_test.v new file mode 100644 index 000000000..0edece49a --- /dev/null +++ b/vlib/v/tests/builtin_maps/map_assign_ref_to_value_test.v @@ -0,0 +1,16 @@ +struct Foo { +mut: + val int +} + +fn test_map_assign_ref_to_value_uses_copy_for_value_map() { + mut values := map[string]Foo{} + mut b := Foo{ + val: 2 + } + + values['two'] = &b + b.val = 3 + + assert values['two'].val == 2 +} -- 2.39.5