From 40dea088fdac5859cf841c60934a4c5fc52cbbf6 Mon Sep 17 00:00:00 2001 From: CreeperFace <165158232+dy-tea@users.noreply.github.com> Date: Fri, 19 Dec 2025 12:54:28 +0000 Subject: [PATCH] checker: ensure fn pointer cannot be used as non-fn argument (fix #26017) (#26022) --- vlib/v/checker/checker.v | 6 ++++-- .../tests/method_ptr_used_as_argument_err.out | 14 ++++++++++++++ .../tests/method_ptr_used_as_argument_err.vv | 10 ++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 vlib/v/checker/tests/method_ptr_used_as_argument_err.out create mode 100644 vlib/v/checker/tests/method_ptr_used_as_argument_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 042bcaa66..61d8db7c3 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1900,8 +1900,10 @@ fn (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type { if mut method := c.table.sym(c.unwrap_generic(typ)).find_method_with_generic_parent(field_name) { c.markused_comptime_call(typ.has_flag(.generic), '${int(method.params[0].typ)}.${field_name}') if c.expected_type != 0 && c.expected_type != ast.none_type { - fn_type := ast.new_type(c.table.find_or_register_fn_type(method, false, true)) - // if the expected type includes the receiver, don't hide it behind a closure + mut method_copy := method + method_copy.name = '' + fn_type := ast.new_type(c.table.find_or_register_fn_type(method_copy, false, + true)) if c.check_types(fn_type, c.expected_type) { c.table.used_features.anon_fn = true return fn_type diff --git a/vlib/v/checker/tests/method_ptr_used_as_argument_err.out b/vlib/v/checker/tests/method_ptr_used_as_argument_err.out new file mode 100644 index 000000000..a1936b6b3 --- /dev/null +++ b/vlib/v/checker/tests/method_ptr_used_as_argument_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/method_ptr_used_as_argument_err.vv:8:16: error: cannot use `fn () int` as `int` in argument 1 to `add` + 6 | arg1 := '10' + 7 | arg2 := '20' + 8 | result := add(arg1.int, arg2.int) + | ~~~~~~~~ + 9 | println(result) + 10 | } +vlib/v/checker/tests/method_ptr_used_as_argument_err.vv:8:26: error: cannot use `fn () int` as `int` in argument 2 to `add` + 6 | arg1 := '10' + 7 | arg2 := '20' + 8 | result := add(arg1.int, arg2.int) + | ~~~~~~~~ + 9 | println(result) + 10 | } diff --git a/vlib/v/checker/tests/method_ptr_used_as_argument_err.vv b/vlib/v/checker/tests/method_ptr_used_as_argument_err.vv new file mode 100644 index 000000000..d0f082810 --- /dev/null +++ b/vlib/v/checker/tests/method_ptr_used_as_argument_err.vv @@ -0,0 +1,10 @@ +fn add(x int, y int) int { + return x + y +} + +fn main() { + arg1 := '10' + arg2 := '20' + result := add(arg1.int, arg2.int) + println(result) +} -- 2.39.5