cgen: fix codegen for sumtype casting on selector on as cast with non pointer field (fix #23387) (#23391)

This commit is contained in:
Felipe Pena 2025-01-06 12:07:45 -03:00 committed by GitHub
parent f06ff69bb9
commit 0c9d0762c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 0 deletions

View File

@ -2713,6 +2713,10 @@ fn (mut g Gen) call_cfn_for_casting_expr(fname string, expr ast.Expr, exp_is_ptr
// Note: the `_to_sumtype_` family of functions do call memdup internally, making
// another duplicate with the HEAP macro is redundant, so use ADDR instead:
if expr.is_as_cast() {
if !got_is_ptr && expr is ast.SelectorExpr {
// (var as Type).field_non_ptr
g.write('&')
}
old_inside_smartcast := g.inside_smartcast
g.inside_smartcast = true
defer {

View File

@ -0,0 +1,26 @@
struct Foo {
expr SumType
}
struct Bar {
expr SumType
}
type SumType = Foo | string | Bar
type SumType2 = SumType | int
struct Gen {}
fn (g Gen) t(arg SumType2) {
}
fn test_main() {
gen := Gen{}
s := Bar{
expr: Foo{
expr: 'foobar'
}
}
gen.t((s.expr as Foo).expr)
assert true
}