From 0b792c541a29f0ba1434c60b2d102c4cf39e88ee Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 20 Feb 2024 14:35:30 +0800 Subject: [PATCH] cgen: fix comptime selector of interface (#20876) --- vlib/v/gen/c/comptime.v | 10 ++++++++++ .../inout/comptime_selector_of_interface.out | 2 ++ .../inout/comptime_selector_of_interface.vv | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 vlib/v/slow_tests/inout/comptime_selector_of_interface.out create mode 100644 vlib/v/slow_tests/inout/comptime_selector_of_interface.vv diff --git a/vlib/v/gen/c/comptime.v b/vlib/v/gen/c/comptime.v index e09ee82100..9d97cb5301 100644 --- a/vlib/v/gen/c/comptime.v +++ b/vlib/v/gen/c/comptime.v @@ -10,6 +10,10 @@ import v.pref import v.comptime fn (mut g Gen) comptime_selector(node ast.ComptimeSelector) { + is_interface_field := g.table.sym(node.left_type).kind == .interface_ + if is_interface_field { + g.write('*(') + } g.expr(node.left) if node.left_type.is_ptr() { g.write('->') @@ -23,11 +27,17 @@ fn (mut g Gen) comptime_selector(node ast.ComptimeSelector) { && node.field_expr.field_name == 'name' { _, field_name := g.comptime.get_comptime_selector_var_type(node) g.write(c_name(field_name)) + if is_interface_field { + g.write(')') + } return } } } g.expr(node.field_expr) + if is_interface_field { + g.write(')') + } } fn (mut g Gen) comptime_call(mut node ast.ComptimeCall) { diff --git a/vlib/v/slow_tests/inout/comptime_selector_of_interface.out b/vlib/v/slow_tests/inout/comptime_selector_of_interface.out new file mode 100644 index 0000000000..68b1368197 --- /dev/null +++ b/vlib/v/slow_tests/inout/comptime_selector_of_interface.out @@ -0,0 +1,2 @@ +[vlib/v/slow_tests/inout/comptime_selector_of_interface.vv:12] p.count: 42 +[vlib/v/slow_tests/inout/comptime_selector_of_interface.vv:14] p.$(f.name): 42 diff --git a/vlib/v/slow_tests/inout/comptime_selector_of_interface.vv b/vlib/v/slow_tests/inout/comptime_selector_of_interface.vv new file mode 100644 index 0000000000..21a46d3528 --- /dev/null +++ b/vlib/v/slow_tests/inout/comptime_selector_of_interface.vv @@ -0,0 +1,16 @@ +struct People { + count int +} + +interface IPeople { + count int +} + +fn main() { + p := IPeople(People{42}) + + dump(p.count) + $for f in IPeople.fields { + dump(p.$(f.name)) + } +}