From dc15f9d3333b08ca2b9befa25642e68c701af716 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 19 Nov 2024 13:12:48 -0300 Subject: [PATCH] cgen: fix codegen for assigning aliased fixed array (fix #22907) (#22909) --- vlib/v/gen/c/assign.v | 14 ++++++++++---- vlib/v/tests/aliases/alias_array_fixed_test.v | 10 ++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 vlib/v/tests/aliases/alias_array_fixed_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 80fb746ab..910cf4a17 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -411,12 +411,12 @@ 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 := unaliased_right_sym.kind == .array_fixed && val !is ast.ArrayInit + is_fixed_array_var := !g.pref.translated && 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])) - && !g.pref.translated g.is_assign_lhs = true g.assign_op = node.op @@ -450,13 +450,19 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { g.expr(val) g.writeln(';}') } - } else if node.op == .assign && !g.pref.translated - && (is_fixed_array_init || (right_sym.kind == .array_fixed && val is ast.Ident)) { + } else if node.op == .assign && !g.pref.translated && (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) { g.expr(left) g.write(' = ') g.expr_with_opt(val, val_type, var_type) + } else if unaliased_right_sym.kind == .array_fixed && val is ast.CastExpr { + g.write('memcpy(') + g.expr(left) + g.write(', ') + g.expr(val) + g.writeln(', sizeof(${g.styp(var_type)}));') } else { mut v_var := '' arr_typ := styp.trim('*') diff --git a/vlib/v/tests/aliases/alias_array_fixed_test.v b/vlib/v/tests/aliases/alias_array_fixed_test.v new file mode 100644 index 000000000..a21a5107e --- /dev/null +++ b/vlib/v/tests/aliases/alias_array_fixed_test.v @@ -0,0 +1,10 @@ +module main + +type Arr = [4]u8 + +fn test_main() { + mut a := Arr{} + a = Arr([u8(5), 4, 3, 2]!) + assert a == Arr([u8(5), 4, 3, 2]!) + assert a == [u8(5), 4, 3, 2]! +} -- 2.39.5