From 7801f5b16b087d765c2f398fc3cd3531a2f01a1c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 29 Oct 2025 12:44:13 -0300 Subject: [PATCH] comptime: fix codegen ptr field reading from comptimeselector (fix #25616) (#25620) --- vlib/v/gen/c/comptime.v | 2 +- .../tests/comptime/comptime_ptr_field_test.v | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/comptime/comptime_ptr_field_test.v diff --git a/vlib/v/gen/c/comptime.v b/vlib/v/gen/c/comptime.v index 3cc0cae05..b0087a63c 100644 --- a/vlib/v/gen/c/comptime.v +++ b/vlib/v/gen/c/comptime.v @@ -15,7 +15,7 @@ fn (mut g Gen) comptime_selector(node ast.ComptimeSelector) { g.write('*(') } g.expr(node.left) - if node.left_type.is_ptr() { + if g.unwrap_generic(node.left_type).is_ptr() { g.write('->') } else { g.write('.') diff --git a/vlib/v/tests/comptime/comptime_ptr_field_test.v b/vlib/v/tests/comptime/comptime_ptr_field_test.v new file mode 100644 index 000000000..621fa2f82 --- /dev/null +++ b/vlib/v/tests/comptime/comptime_ptr_field_test.v @@ -0,0 +1,29 @@ +fn encode[T](values T) string { + $if T is $pointer { + if voidptr(values) == unsafe { nil } { + return 'nil' + } + return encode_pointer_struct(values) + } + return 'other' +} + +fn encode_pointer_struct[T](values T) string { + $for field in T.fields { + dump('${field.name}') // works `name` + mut val := values.$(field.name) // C error `root` + dump('${val}') + } + return 'struct' +} + +struct Node { + name string + children []&Node +} + +fn test_main() { + assert encode('string') == 'other' + assert encode(&Node(unsafe { nil })) == 'nil' + assert encode(&Node{ name: 'root' }) == 'struct' +} -- 2.39.5