cgen: fix error for optional multi return (#13959)
parent
c9dcdf6744
commit
a58dde48f8
|
@ -471,7 +471,7 @@ fn (mut g Gen) gen_multi_return_assign(node &ast.AssignStmt, return_type ast.Typ
|
|||
// TODO Handle in if_expr
|
||||
is_opt := return_type.has_flag(.optional)
|
||||
mr_var_name := 'mr_$node.pos.pos'
|
||||
mr_styp := g.typ(return_type)
|
||||
mr_styp := g.typ(return_type.clear_flag(.optional))
|
||||
g.write('$mr_styp $mr_var_name = ')
|
||||
g.expr(node.right[0])
|
||||
g.writeln(';')
|
||||
|
@ -505,9 +505,9 @@ fn (mut g Gen) gen_multi_return_assign(node &ast.AssignStmt, return_type ast.Typ
|
|||
if is_opt {
|
||||
mr_base_styp := g.base_type(return_type)
|
||||
if is_auto_heap {
|
||||
g.writeln('HEAP${noscan}($mr_base_styp, *($mr_base_styp*)${mr_var_name}.data).arg$i) });')
|
||||
g.writeln('HEAP${noscan}($mr_base_styp, ${mr_var_name}.arg$i) });')
|
||||
} else {
|
||||
g.writeln('(*($mr_base_styp*)${mr_var_name}.data).arg$i });')
|
||||
g.writeln('${mr_var_name}.arg$i });')
|
||||
}
|
||||
} else {
|
||||
if is_auto_heap {
|
||||
|
@ -520,9 +520,9 @@ fn (mut g Gen) gen_multi_return_assign(node &ast.AssignStmt, return_type ast.Typ
|
|||
if is_opt {
|
||||
mr_base_styp := g.base_type(return_type)
|
||||
if is_auto_heap {
|
||||
g.writeln(' = HEAP${noscan}($mr_base_styp, *($mr_base_styp*)${mr_var_name}.data).arg$i);')
|
||||
g.writeln(' = HEAP${noscan}($mr_base_styp, ${mr_var_name}.arg$i);')
|
||||
} else {
|
||||
g.writeln(' = (*($mr_base_styp*)${mr_var_name}.data).arg$i;')
|
||||
g.writeln(' = ${mr_var_name}.arg$i;')
|
||||
}
|
||||
} else {
|
||||
if is_auto_heap {
|
||||
|
|
|
@ -695,8 +695,6 @@ fn (mut g Gen) call_expr(node ast.CallExpr) {
|
|||
unwrapped_styp := g.typ(unwrapped_typ)
|
||||
if unwrapped_typ == ast.void_type {
|
||||
g.write('\n $cur_line')
|
||||
} else if g.table.sym(node.return_type).kind == .multi_return {
|
||||
g.write('\n $cur_line $tmp_opt /*U*/')
|
||||
} else {
|
||||
if !g.inside_const_optional {
|
||||
g.write('\n $cur_line (*($unwrapped_styp*)${tmp_opt}.data)')
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
fn tuple() ?(int, int) {
|
||||
return 1, 2
|
||||
}
|
||||
|
||||
fn test_optional_multi_return() ? {
|
||||
println(tuple() ?)
|
||||
a, b := tuple() ?
|
||||
assert a == 1
|
||||
assert b == 2
|
||||
}
|
Loading…
Reference in New Issue