From 898c49b526289741a1f10c877277accf65765fdd Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 17 Dec 2024 11:08:34 +0800 Subject: [PATCH] cgen: fix assign optional aliases of fixed array --- vlib/v/gen/c/assign.v | 20 ++++++++++++++----- .../assign_option_of_fixed_array_test.v | 8 ++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 vlib/v/tests/assign/assign_option_of_fixed_array_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 4d3fda156d47a3..2cf1e23e327a50 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -492,11 +492,21 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { 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)}));') + if var_type.has_flag(.option) { + g.expr(left) + g.writeln('.state = 0;') + g.write('memcpy(') + g.expr(left) + g.write('.data, ') + g.expr(val) + g.writeln(', sizeof(${g.styp(var_type.clear_flag(.option))}));') + } else { + 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/assign/assign_option_of_fixed_array_test.v b/vlib/v/tests/assign/assign_option_of_fixed_array_test.v new file mode 100644 index 00000000000000..c3a316ed7c0dac --- /dev/null +++ b/vlib/v/tests/assign/assign_option_of_fixed_array_test.v @@ -0,0 +1,8 @@ +type Addr = [4]u8 + +fn test_assign_option_of_fixed_array() { + mut addr := ?Addr(none) + addr = Addr([u8(1), 2, 3, 4]!) + println(addr) + assert '${addr}' == 'Option(Addr([1, 2, 3, 4]))' +}