From 65a5e968d713dd795152b55e64981bd6b63bf22d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 30 Jun 2025 16:00:05 -0300 Subject: [PATCH] cgen: fix codegen for multi return assignment with option type (fix #24812) (#24817) --- vlib/v/gen/c/assign.v | 5 +++- .../tests/options/option_fn_multi_ret_test.v | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/options/option_fn_multi_ret_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index daf27b204..f64208cca 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -1083,8 +1083,11 @@ fn (mut g Gen) gen_multi_return_assign(node &ast.AssignStmt, return_type ast.Typ '${mr_var_name}.arg${i}' } if mr_types[i].has_flag(.option) { + old_left_is_opt := g.left_is_opt + g.left_is_opt = true g.expr(lx) - g.write(' = ${tmp_var};') + g.writeln(' = ${tmp_var};') + g.left_is_opt = old_left_is_opt } else { g.write('_option_ok(&(${base_typ}[]) { ${tmp_var} }, (${option_name}*)(&') tmp_left_is_opt := g.left_is_opt diff --git a/vlib/v/tests/options/option_fn_multi_ret_test.v b/vlib/v/tests/options/option_fn_multi_ret_test.v new file mode 100644 index 000000000..98da83696 --- /dev/null +++ b/vlib/v/tests/options/option_fn_multi_ret_test.v @@ -0,0 +1,23 @@ +module main + +type Cmd = fn () string + +fn cplx() (bool, ?Cmd) { + return true, stringer +} + +fn stringer() string { + return 'a string' +} + +fn test_main() { + mut cmd := ?Cmd(none) + mut truth := false + truth, cmd = cplx() + if cmd != none { + println(cmd()) + assert true + } else { + assert false + } +} -- 2.39.5