From 6a98e38f0d9846531d09d231fc7ffcc5b7b9f1ca Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 10 May 2025 15:10:52 -0300 Subject: [PATCH] cgen: fix assign from `for mut var in arr {` to pointer (fix #24432) (#24456) --- vlib/v/gen/c/assign.v | 5 ++++ vlib/v/tests/assign/assign_mut_for_var_test.v | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 vlib/v/tests/assign/assign_mut_for_var_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index e12b9180a..2c444a0fc 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -969,6 +969,11 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { defer { g.is_option_auto_heap = old_is_auto_heap } + if val is ast.Ident && val.is_mut() && var_type.is_ptr() { + if var_type.nr_muls() < val_type.nr_muls() { + g.write('*'.repeat(var_type.nr_muls())) + } + } g.is_option_auto_heap = val_type.has_flag(.option) && val is ast.PrefixExpr && val.right is ast.Ident && (val.right as ast.Ident).is_auto_heap() if var_type.has_flag(.option) || gen_or { diff --git a/vlib/v/tests/assign/assign_mut_for_var_test.v b/vlib/v/tests/assign/assign_mut_for_var_test.v new file mode 100644 index 000000000..fac0f613d --- /dev/null +++ b/vlib/v/tests/assign/assign_mut_for_var_test.v @@ -0,0 +1,24 @@ +@[heap] +struct Demo { + a string +} + +fn test_main() { + mut rl := [&Demo{'A'}] + + assert rl[0].a == 'A' + + mut p := &Demo{} + for mut e in rl { + p = e + } + + assert p.a == 'A' + + for i in 0 .. rl.len { + mut e := rl[i] + p = e + } + + assert p.a == 'A' +} -- 2.39.5