Skip to content

Commit d9afebc

Browse files
authored
cgen: fix if mut var != none { for optional interface values (fix #24351) (#24410)
1 parent 0c1a02f commit d9afebc

2 files changed

Lines changed: 53 additions & 2 deletions

File tree

‎vlib/v/gen/c/cgen.v‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff 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 {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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+
}

0 commit comments

Comments
 (0)