cgen: fix match sumtype var returning sumtype value (#13184)

pull/13191/head
yuyi 2022-01-16 19:12:27 +08:00 committed by GitHub
parent ab7cc5809a
commit 315b2deda9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 3 deletions

View File

@ -2421,9 +2421,9 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ
got_styp := g.typ(got_type) got_styp := g.typ(got_type)
if expected_type != ast.void_type { if expected_type != ast.void_type {
unwrapped_expected_type := g.unwrap_generic(expected_type) unwrapped_expected_type := g.unwrap_generic(expected_type)
unwrapped_got_type := g.unwrap_generic(got_type)
unwrapped_exp_sym := g.table.sym(unwrapped_expected_type) unwrapped_exp_sym := g.table.sym(unwrapped_expected_type)
unwrapped_got_sym := g.table.sym(unwrapped_got_type) mut unwrapped_got_type := g.unwrap_generic(got_type)
mut unwrapped_got_sym := g.table.sym(unwrapped_got_type)
expected_deref_type := if expected_is_ptr { expected_deref_type := if expected_is_ptr {
unwrapped_expected_type.deref() unwrapped_expected_type.deref()
@ -2445,11 +2445,15 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ
is_already_sum_type = true is_already_sum_type = true
} }
} }
if is_already_sum_type { if is_already_sum_type && !g.inside_return {
// Don't create a new sum type wrapper if there is already one // Don't create a new sum type wrapper if there is already one
g.prevent_sum_type_unwrapping_once = true g.prevent_sum_type_unwrapping_once = true
g.expr(expr) g.expr(expr)
} else { } else {
if mut unwrapped_got_sym.info is ast.Aggregate {
unwrapped_got_type = unwrapped_got_sym.info.types[g.aggregate_type_idx]
unwrapped_got_sym = g.table.sym(unwrapped_got_type)
}
g.get_sumtype_casting_fn(unwrapped_got_type, unwrapped_expected_type) g.get_sumtype_casting_fn(unwrapped_got_type, unwrapped_expected_type)
fname := '${unwrapped_got_sym.cname}_to_sumtype_$unwrapped_exp_sym.cname' fname := '${unwrapped_got_sym.cname}_to_sumtype_$unwrapped_exp_sym.cname'
g.call_cfn_for_casting_expr(fname, expr, expected_is_ptr, unwrapped_exp_sym.cname, g.call_cfn_for_casting_expr(fname, expr, expected_is_ptr, unwrapped_exp_sym.cname,

View File

@ -0,0 +1,30 @@
module main
type Sum = Struct | int
struct Struct {
mut:
value int
}
fn sum(mut s Sum) Sum {
match mut s {
Struct {
return s
}
else {
return s
}
}
}
fn test_match_sumtype_var_return_sumtype() {
mut s := Sum(Struct{
value: 42
})
s = sum(mut s)
dump(s)
ret := '$s'
assert ret.contains('Sum(Struct{')
assert ret.contains('value: 42')
}