cgen: fix codegen for nested selector option ptr (fix #24339) (#24345)

This commit is contained in:
Felipe Pena 2025-04-27 22:35:12 -03:00 committed by GitHub
parent 1f8f6d0e7d
commit 11acee1a5b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 54 additions and 5 deletions

View File

@ -4065,11 +4065,12 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
g.write('*')
}
g.write('${tmp_var} = ')
if is_ptr {
mut needs_addr := false
needs_deref := is_ptr && !is_option_unwrap
if needs_deref {
g.write('*(')
}
needs_addr := is_option_unwrap && node.expr !in [ast.Ident, ast.PrefixExpr]
if is_option_unwrap {
} else if is_option_unwrap && !is_ptr {
needs_addr = node.expr !in [ast.Ident, ast.PrefixExpr]
if !needs_addr {
g.write('&')
} else {
@ -4098,7 +4099,7 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
g.write('.')
}
g.write(field_name)
if is_ptr {
if needs_deref {
g.write(')')
}
if needs_addr {

View File

@ -0,0 +1,48 @@
module main
@[heap]
interface IGameObject {
mut:
name string
parent ?&IGameObject
next ?&IGameObject
child ?&IGameObject
last_child ?&IGameObject
add_child(mut o IGameObject)
}
@[heap]
struct GameObject implements IGameObject {
mut:
name string
parent ?&IGameObject
next ?&IGameObject
child ?&IGameObject
last_child ?&IGameObject
}
fn (mut gameobject GameObject) add_child(mut o IGameObject) {
o.parent = gameobject
if gameobject.last_child != none {
gameobject.last_child.next = o
} else {
gameobject.child = o
}
gameobject.last_child = o
}
fn test_main() {
mut v1 := &GameObject{
name: 'v1'
}
mut v2 := &GameObject{
name: 'v2'
}
mut v3 := &GameObject{
name: 'v3'
}
v1.add_child(mut v2)
v1.add_child(mut v3)
assert v1.child?.next?.name == 'v3'
}