File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -5269,8 +5269,17 @@ fn (mut g Gen) ident(node ast.Ident) {
52695269 is_option_unwrap := is_option && typ == node.obj.typ.clear_flag (.option)
52705270 cast_sym := g.table.sym (g.unwrap_generic (typ))
52715271 if obj_sym.kind == .interface && cast_sym.kind == .interface {
5272- ptr := '*' .repeat (node.obj.typ.nr_muls ())
5273- g.write ('I_${obj_sym .cname }_as_I_${cast_sym .cname }(${ptr }${node .name })' )
5272+ if cast_sym.cname != obj_sym.cname {
5273+ ptr := '*' .repeat (node.obj.typ.nr_muls ())
5274+ g.write ('I_${obj_sym .cname }_as_I_${cast_sym .cname }(${ptr }${node .name })' )
5275+ } else {
5276+ ptr := if is_option {
5277+ ''
5278+ } else {
5279+ '*' .repeat (node.obj.typ.nr_muls ())
5280+ }
5281+ g.write ('${ptr }${node .name }' )
5282+ }
52745283 } else {
52755284 mut is_ptr := false
52765285 if i == 0 {
Original file line number Diff line number Diff line change 1+ module main
2+
3+ @[heap]
4+ interface IGameObject {
5+ mut :
6+ name string
7+ parent ? & IGameObject
8+ next ? & IGameObject
9+ child ? & IGameObject
10+ last_child ? & IGameObject
11+ }
12+
13+ @[heap]
14+ struct GameObject implements IGameObject {
15+ mut :
16+ name string
17+ parent ? & IGameObject
18+ next ? & IGameObject
19+ child ? & IGameObject
20+ last_child ? & IGameObject
21+ }
22+
23+ fn test_main () {
24+ mut v1 := & GameObject{
25+ name: 'v1'
26+ }
27+ v1 .next = & GameObject{
28+ name: 'v2'
29+ }
30+
31+ mut next := v1 .next
32+ for {
33+ if mut next != none {
34+ eprintln (next.name)
35+ assert next.name == 'v2'
36+ next = next.next
37+ } else {
38+ break
39+ }
40+ }
41+ assert next == none
42+ }
You can’t perform that action at this time.
0 commit comments