From 638b8dc212612d9508ebb81164da539d4c16a249 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 20 Apr 2026 18:15:14 +0300 Subject: [PATCH] cgen: deref fix --- vlib/v/gen/c/cgen.v | 7 ++++++- .../interfaces/interface_value_semantics_test.v | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 786dcb078..f83cc9eae 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -4026,6 +4026,7 @@ fn (mut g Gen) call_cfn_for_casting_expr(fname string, expr ast.Expr, exp ast.Ty got_is_ptr bool, got_is_fn bool, got_styp string) { mut rparen_n := 1 mut mutable_is_mut_arg_pos := 0 + mut force_auto_heap_value_deref := false is_not_ptr_and_fn := !got_is_ptr && !got_is_fn is_sumtype_cast := !got_is_fn && fname.contains('_to_sumtype_') @@ -4078,6 +4079,8 @@ fn (mut g Gen) call_cfn_for_casting_expr(fname string, expr ast.Expr, exp ast.Ty // stay connected to the concrete value instead of a detached clone. needs_interface_value_copy := is_interface_cast && !preserve_interface_field_aliasing && !g.expected_arg_mut && !got_is_ptr && expr_is_lvalue + force_auto_heap_value_deref = needs_interface_value_copy && expr is ast.Ident + && g.resolved_ident_is_auto_heap(expr) if !is_cast_fixed_array_init && (is_comptime_variant || !expr_is_lvalue || (expr is ast.Ident && (expr.obj.is_simple_define_const() @@ -4117,7 +4120,9 @@ fn (mut g Gen) call_cfn_for_casting_expr(fname string, expr ast.Expr, exp ast.Ty old_left_is_opt := g.left_is_opt g.left_is_opt = !exp.has_flag(.option) old_inside_assign_fn_var := g.inside_assign_fn_var - if is_stack_rooted_interface_expr && g.expr_root_ident_unwraps_option_or_result(expr) { + if force_auto_heap_value_deref { + g.inside_assign_fn_var = false + } else if is_stack_rooted_interface_expr && g.expr_root_ident_unwraps_option_or_result(expr) { g.inside_assign_fn_var = true } g.expr(expr) diff --git a/vlib/v/tests/interfaces/interface_value_semantics_test.v b/vlib/v/tests/interfaces/interface_value_semantics_test.v index 6bc470817..ade690890 100644 --- a/vlib/v/tests/interfaces/interface_value_semantics_test.v +++ b/vlib/v/tests/interfaces/interface_value_semantics_test.v @@ -25,3 +25,20 @@ fn test_append_to_interface_array_makes_detached_copy() { value.name = 'Second' assert values[0].name == 'First' } + +fn new_named_value() !NamedValue { + return NamedValue{ + name: 'First' + } +} + +fn read_name(n Named) string { + return n.name +} + +fn test_auto_heap_interface_arg_keeps_value_fields() { + value := new_named_value()! + face := Named(value) + assert read_name(value) == 'First' + assert read_name(face) == 'First' +} -- 2.39.5