Skip to content

Commit

Permalink
cgen: fix codegen for sumtype casting on selector on as cast with non…
Browse files Browse the repository at this point in the history
… pointer field (fix #23387) (#23391)
  • Loading branch information
felipensp authored Jan 6, 2025
1 parent f06ff69 commit 0c9d076
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
4 changes: 4 additions & 0 deletions vlib/v/gen/c/cgen.v
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
26 changes: 26 additions & 0 deletions vlib/v/tests/selector_as_cast_test.v
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 0c9d076

Please sign in to comment.