cgen: fix multi-return in if/match exprs (#12139)
parent
0f7dfb984a
commit
e69df54a36
|
@ -4879,7 +4879,10 @@ fn (mut g Gen) cast_expr(node ast.CastExpr) {
|
|||
}
|
||||
|
||||
fn (mut g Gen) concat_expr(node ast.ConcatExpr) {
|
||||
styp := g.typ(node.return_type)
|
||||
mut styp := g.typ(node.return_type)
|
||||
if g.inside_return {
|
||||
styp = g.typ(g.fn_decl.return_type)
|
||||
}
|
||||
sym := g.table.get_type_symbol(node.return_type)
|
||||
is_multi := sym.kind == .multi_return
|
||||
if !is_multi {
|
||||
|
@ -5163,8 +5166,8 @@ fn (mut g Gen) return_stmt(node ast.Return) {
|
|||
}
|
||||
// regular cases
|
||||
if fn_return_is_multi && node.exprs.len > 0 && !g.expr_is_multi_return_call(node.exprs[0]) {
|
||||
if node.exprs.len == 1 && node.exprs[0] is ast.IfExpr {
|
||||
// use a temporary for `return if cond { x,y } else { a,b }`
|
||||
if node.exprs.len == 1 && (node.exprs[0] is ast.IfExpr || node.exprs[0] is ast.MatchExpr) {
|
||||
// use a temporary for `return if cond { x,y } else { a,b }` or `return match expr { abc { x, y } else { z, w } }`
|
||||
g.write('$ret_typ $tmpvar = ')
|
||||
g.expr(node.exprs[0])
|
||||
g.writeln(';')
|
||||
|
|
|
@ -82,3 +82,29 @@ fn test_multi_values() {
|
|||
assert x == 'abc'
|
||||
assert y == 'def'
|
||||
}
|
||||
|
||||
fn match_expr(x bool) (int, int) {
|
||||
return match x {
|
||||
true { 1, 1 }
|
||||
else { 0, 0 }
|
||||
}
|
||||
}
|
||||
|
||||
fn if_expr(x bool) (int, int) {
|
||||
return if x { 3, 3 } else { 2, 2 }
|
||||
}
|
||||
|
||||
fn test_multi_return_if_match_expr() {
|
||||
a, b := match_expr(true)
|
||||
c, d := match_expr(false)
|
||||
x, y := if_expr(true)
|
||||
z, w := if_expr(false)
|
||||
assert a == 1
|
||||
assert b == 1
|
||||
assert c == 0
|
||||
assert d == 0
|
||||
assert x == 3
|
||||
assert y == 3
|
||||
assert z == 2
|
||||
assert w == 2
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue