cgen: fix `return if cond { x,y } else { a,b }` generation
parent
a1121d0eb0
commit
1ef718c1e1
|
@ -4687,6 +4687,16 @@ fn (mut g Gen) return_stmt(node ast.Return) {
|
||||||
}
|
}
|
||||||
// regular cases
|
// regular cases
|
||||||
if fn_return_is_multi && node.exprs.len > 0 && !g.expr_is_multi_return_call(node.exprs[0]) { // not_optional_none { //&& !fn_return_is_optional {
|
if fn_return_is_multi && node.exprs.len > 0 && !g.expr_is_multi_return_call(node.exprs[0]) { // not_optional_none { //&& !fn_return_is_optional {
|
||||||
|
if node.exprs.len == 1 && node.exprs[0] is ast.IfExpr {
|
||||||
|
// use a temporary for `return if cond { x,y } else { a,b }`
|
||||||
|
tmpvar := g.new_tmp_var()
|
||||||
|
tmptyp := g.typ(g.fn_decl.return_type)
|
||||||
|
g.write('$tmptyp $tmpvar = ')
|
||||||
|
g.expr(node.exprs[0])
|
||||||
|
g.writeln(';')
|
||||||
|
g.writeln('return $tmpvar;')
|
||||||
|
return
|
||||||
|
}
|
||||||
// typ_sym := g.table.get_type_symbol(g.fn_decl.return_type)
|
// typ_sym := g.table.get_type_symbol(g.fn_decl.return_type)
|
||||||
// mr_info := typ_sym.info as ast.MultiReturn
|
// mr_info := typ_sym.info as ast.MultiReturn
|
||||||
mut styp := ''
|
mut styp := ''
|
||||||
|
|
|
@ -72,3 +72,13 @@ fn test_multiple_ret() {
|
||||||
assert res3_1 == 'replaced'
|
assert res3_1 == 'replaced'
|
||||||
assert res3_2 == 'val'
|
assert res3_2 == 'val'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn multi_values() (string, string) {
|
||||||
|
return if 1 > 0 { 'abc', 'def' } else { 'jkl', 'mno' }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_multi_values() {
|
||||||
|
x, y := multi_values()
|
||||||
|
assert x == 'abc'
|
||||||
|
assert y == 'def'
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue