From 9a6e335601a3bf7f1a736633472081375f8204ce Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 17 Dec 2024 20:39:27 +0800 Subject: [PATCH] cgen: fix assign optional aliases of fixed array (fix #23185) (#23188) --- 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 2b03545b6..1204a4ae7 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 000000000..c3a316ed7 --- /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]))' +} -- 2.39.5