From 7b77f2ee5b6cc362ed9223e50dadaaae6e6fb695 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Sun, 10 Aug 2025 18:31:44 +0800 Subject: [PATCH] cgen: fix translated file fixed-array assignment (#25080) --- vlib/v/gen/c/assign.v | 18 ++++++++++++++---- vlib/v/tests/translated_test.v | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 5a0622dc2a..114855d482 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -508,12 +508,14 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { unwrapped_val_type := g.unwrap_generic(val_type) right_sym := g.table.sym(unwrapped_val_type) unaliased_right_sym := g.table.final_sym(unwrapped_val_type) - is_fixed_array_var := !g.pref.translated && unaliased_right_sym.kind == .array_fixed - && val !is ast.ArrayInit + unaliased_left_sym := g.table.final_sym(g.unwrap_generic(var_type)) + is_fixed_array_var := unaliased_right_sym.kind == .array_fixed && val !is ast.ArrayInit && (val in [ast.Ident, ast.IndexExpr, ast.CallExpr, ast.SelectorExpr, ast.DumpExpr, ast.InfixExpr] || (val is ast.CastExpr && val.expr !is ast.ArrayInit) || (val is ast.PrefixExpr && val.op == .arrow) || (val is ast.UnsafeExpr && val.expr in [ast.SelectorExpr, ast.Ident, ast.CallExpr])) + && !((g.pref.translated || g.file.is_translated) + && unaliased_left_sym.kind != .array_fixed) g.is_assign_lhs = true g.assign_op = node.op @@ -553,10 +555,18 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { } g.writeln(';}') } - } else if node.op == .assign && !g.pref.translated && (is_fixed_array_init + } else if node.op == .assign && (is_fixed_array_init || (unaliased_right_sym.kind == .array_fixed && val in [ast.Ident, ast.CastExpr])) { // Fixed arrays - if is_fixed_array_init && var_type.has_flag(.option) { + if unaliased_left_sym.kind != .array_fixed && unaliased_right_sym.kind == .array_fixed + && (g.pref.translated || g.file.is_translated) { + // translated: + // arr = [5]u8{} + // ptr = arr => ptr = &arr[0] + g.expr(left) + g.write(' = ') + g.expr(val) + } else if is_fixed_array_init && var_type.has_flag(.option) { g.expr(left) g.write(' = ') g.expr_with_opt(val, val_type, var_type) diff --git a/vlib/v/tests/translated_test.v b/vlib/v/tests/translated_test.v index 78380506ff..e9ac2d05b3 100644 --- a/vlib/v/tests/translated_test.v +++ b/vlib/v/tests/translated_test.v @@ -12,3 +12,36 @@ const ssf = [1, 2, 3]! fn test_const_name_without_main_prefix() { assert ssf[0] == 1 } + +struct ASMOperand { + constraint [2]i8 +} + +fn test_pointer_assign_without_memcpy() { + op := ASMOperand{ + constraint: [i8(5), 4]! + } + str := &i8(0) + str = op.constraint + assert !isnil(str) + + ops := [3]ASMOperand{} + pop := &ASMOperand(0) + pop = ops + assert pop[1].constraint[0] == 0 +} + +struct StubIndex { +pub mut: + data [5][5]map[string]string +} + +fn test_pointer_assign_with_memcpy() { + mut s := StubIndex{} + s.data[1] = [5]map[string]string{} + + mut data := s.data[1] + data[0]['abc'] = '123' + k := data[0]['abc'] + assert k == '123' +}