From a91f86f95f553e344da603080dcc760eaecd683f Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 23:22:14 +0300 Subject: [PATCH] parser: fix c functions do not warn for param named interface (fixes #25859) --- .../v/checker/tests/c_fn_param_named_interface_err.out | 8 ++++++++ vlib/v/checker/tests/c_fn_param_named_interface_err.vv | 10 ++++++++++ vlib/v/parser/fn.v | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/c_fn_param_named_interface_err.out create mode 100644 vlib/v/checker/tests/c_fn_param_named_interface_err.vv diff --git a/vlib/v/checker/tests/c_fn_param_named_interface_err.out b/vlib/v/checker/tests/c_fn_param_named_interface_err.out new file mode 100644 index 000000000..2a858b4da --- /dev/null +++ b/vlib/v/checker/tests/c_fn_param_named_interface_err.out @@ -0,0 +1,8 @@ +vlib/v/checker/tests/c_fn_param_named_interface_err.vv:9:4: error: expected 4 arguments, but got 3 + 7 | fn main() { + 8 | registry := C.wl_registry{} + 9 | C.wl_registry_bind(®istry, u32(0), u32(0)) + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 10 | } +Details: have (&C.wl_registry, u32, u32) + want (&C.wl_registry, u32, &C.wl_interface, u32) diff --git a/vlib/v/checker/tests/c_fn_param_named_interface_err.vv b/vlib/v/checker/tests/c_fn_param_named_interface_err.vv new file mode 100644 index 000000000..367dc3c1f --- /dev/null +++ b/vlib/v/checker/tests/c_fn_param_named_interface_err.vv @@ -0,0 +1,10 @@ +pub struct C.wl_interface {} + +pub struct C.wl_registry {} + +fn C.wl_registry_bind(wl_registry &C.wl_registry, name u32, interface &C.wl_interface, version u32) voidptr + +fn main() { + registry := C.wl_registry{} + C.wl_registry_bind(®istry, u32(0), u32(0)) +} diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index e2abaaddf..171144b6d 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -1332,7 +1332,8 @@ fn (mut p Parser) fn_params() ([]ast.Param, bool, bool, bool) { if is_mut { p.next() } - if p.fn_language == .c && p.tok.kind == .name + if p.fn_language == .c && is_ident_name(p.tok.lit) + && p.tok.kind !in [.key_fn, .key_struct] && p.peek_tok.kind !in [.comma, .rpar, .dot] { name = p.tok.lit p.next() -- 2.39.5