Skip to content

Commit 0b792c5

Browse files
authored
cgen: fix comptime selector of interface (#20876)
1 parent c60a869 commit 0b792c5

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

vlib/v/gen/c/comptime.v

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import v.pref
1010
import v.comptime
1111

1212
fn (mut g Gen) comptime_selector(node ast.ComptimeSelector) {
13+
is_interface_field := g.table.sym(node.left_type).kind == .interface_
14+
if is_interface_field {
15+
g.write('*(')
16+
}
1317
g.expr(node.left)
1418
if node.left_type.is_ptr() {
1519
g.write('->')
@@ -23,11 +27,17 @@ fn (mut g Gen) comptime_selector(node ast.ComptimeSelector) {
2327
&& node.field_expr.field_name == 'name' {
2428
_, field_name := g.comptime.get_comptime_selector_var_type(node)
2529
g.write(c_name(field_name))
30+
if is_interface_field {
31+
g.write(')')
32+
}
2633
return
2734
}
2835
}
2936
}
3037
g.expr(node.field_expr)
38+
if is_interface_field {
39+
g.write(')')
40+
}
3141
}
3242

3343
fn (mut g Gen) comptime_call(mut node ast.ComptimeCall) {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[vlib/v/slow_tests/inout/comptime_selector_of_interface.vv:12] p.count: 42
2+
[vlib/v/slow_tests/inout/comptime_selector_of_interface.vv:14] p.$(f.name): 42
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
struct People {
2+
count int
3+
}
4+
5+
interface IPeople {
6+
count int
7+
}
8+
9+
fn main() {
10+
p := IPeople(People{42})
11+
12+
dump(p.count)
13+
$for f in IPeople.fields {
14+
dump(p.$(f.name))
15+
}
16+
}

0 commit comments

Comments
 (0)