diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index b07258481d..fe1297eb5b 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -508,9 +508,9 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { fn (mut g Gen) gen_multi_return_assign(node &ast.AssignStmt, return_type ast.Type) { // multi return // TODO Handle in if_expr - is_opt := return_type.has_flag(.optional) + is_opt := return_type.has_flag(.optional) || return_type.has_flag(.result) mr_var_name := 'mr_$node.pos.pos' - mr_styp := g.typ(return_type.clear_flag(.optional)) + mr_styp := g.typ(return_type.clear_flag(.optional).clear_flag(.result)) g.write('$mr_styp $mr_var_name = ') g.expr(node.right[0]) g.writeln(';') diff --git a/vlib/v/tests/results_multi_return_test.v b/vlib/v/tests/results_multi_return_test.v new file mode 100644 index 0000000000..f8b5a2ed06 --- /dev/null +++ b/vlib/v/tests/results_multi_return_test.v @@ -0,0 +1,29 @@ +struct Err { + msg string + code int +} + +fn (e Err) msg() string { + return e.msg +} + +fn (e Err) code() int { + return e.code +} + +fn foo() ?string { + return 'foo' +} + +fn bar() !(string, int) { + a := foo() or { return IError(Err{ + msg: 'error test' + }) } + return a, 1 +} + +fn test_results_multi_return() { + b, _ := bar() or { panic(err) } + println(b) + assert b == 'foo' +}