From 068dfb9eb9fc5aa891a764caca07a02ca6b4dfe0 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 14 Apr 2026 22:56:59 +0300 Subject: [PATCH] checker: fix simple generic structure declaration error (fixes #21989) --- vlib/v/checker/checker.v | 6 ++++ .../tests/generic_method_value_err.out | 14 ++++++++++ .../checker/tests/generic_method_value_err.vv | 28 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 vlib/v/checker/tests/generic_method_value_err.out create mode 100644 vlib/v/checker/tests/generic_method_value_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 792ea4779..a27a4cad6 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3020,6 +3020,12 @@ fn (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type { method.name = '' fn_type := ast.new_type(c.table.find_or_register_fn_type(method, false, true)) node.typ = c.unwrap_generic(fn_type) + if c.type_has_unresolved_generic_parts(fn_type) { + c.error('cannot use `${node.expr}.${node.field_name}` as a generic function value', + node.pos) + c.table.used_features.anon_fn = true + return fn_type + } c.table.used_features.anon_fn = true return fn_type } diff --git a/vlib/v/checker/tests/generic_method_value_err.out b/vlib/v/checker/tests/generic_method_value_err.out new file mode 100644 index 000000000..81a926aa2 --- /dev/null +++ b/vlib/v/checker/tests/generic_method_value_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/generic_method_value_err.vv:25:17: error: cannot use `TCount(4).take_part` as a generic function value + 23 | + 24 | fn main() { + 25 | _ = [TCount(4).take_part] + | ~~~~~~~~~ + 26 | f := TCount(4).print_part + 27 | _ = f +vlib/v/checker/tests/generic_method_value_err.vv:26:17: error: cannot use `TCount(4).print_part` as a generic function value + 24 | fn main() { + 25 | _ = [TCount(4).take_part] + 26 | f := TCount(4).print_part + | ~~~~~~~~~~ + 27 | _ = f + 28 | } diff --git a/vlib/v/checker/tests/generic_method_value_err.vv b/vlib/v/checker/tests/generic_method_value_err.vv new file mode 100644 index 000000000..4ea4b574c --- /dev/null +++ b/vlib/v/checker/tests/generic_method_value_err.vv @@ -0,0 +1,28 @@ +module main + +struct ParserResult[I, O] { + i []I + o []O +} + +type TCount = u32 + +fn (count TCount) take_part[I, O](i []I) !ParserResult[I, O] { + if i.len < count { + return error('error1') + } + return ParserResult{ + i: i[count..] + o: i[..count] + } +} + +fn (count TCount) print_part[T](v T) { + _ = v +} + +fn main() { + _ = [TCount(4).take_part] + f := TCount(4).print_part + _ = f +} -- 2.39.5