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
|
// TODO Handle in if_expr
|
||||||
is_opt := return_type.has_flag(.optional)
|
is_opt := return_type.has_flag(.optional)
|
||||||
mr_var_name := 'mr_$node.pos.pos'
|
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.write('$mr_styp $mr_var_name = ')
|
||||||
g.expr(node.right[0])
|
g.expr(node.right[0])
|
||||||
g.writeln(';')
|
g.writeln(';')
|
||||||
|
@ -505,9 +505,9 @@ fn (mut g Gen) gen_multi_return_assign(node &ast.AssignStmt, return_type ast.Typ
|
||||||
if is_opt {
|
if is_opt {
|
||||||
mr_base_styp := g.base_type(return_type)
|
mr_base_styp := g.base_type(return_type)
|
||||||
if is_auto_heap {
|
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 {
|
} else {
|
||||||
g.writeln('(*($mr_base_styp*)${mr_var_name}.data).arg$i });')
|
g.writeln('${mr_var_name}.arg$i });')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if is_auto_heap {
|
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 {
|
if is_opt {
|
||||||
mr_base_styp := g.base_type(return_type)
|
mr_base_styp := g.base_type(return_type)
|
||||||
if is_auto_heap {
|
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 {
|
} else {
|
||||||
g.writeln(' = (*($mr_base_styp*)${mr_var_name}.data).arg$i;')
|
g.writeln(' = ${mr_var_name}.arg$i;')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if is_auto_heap {
|
if is_auto_heap {
|
||||||
|
|
|
@ -695,8 +695,6 @@ fn (mut g Gen) call_expr(node ast.CallExpr) {
|
||||||
unwrapped_styp := g.typ(unwrapped_typ)
|
unwrapped_styp := g.typ(unwrapped_typ)
|
||||||
if unwrapped_typ == ast.void_type {
|
if unwrapped_typ == ast.void_type {
|
||||||
g.write('\n $cur_line')
|
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 {
|
} else {
|
||||||
if !g.inside_const_optional {
|
if !g.inside_const_optional {
|
||||||
g.write('\n $cur_line (*($unwrapped_styp*)${tmp_opt}.data)')
|
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