From 3fc4d7efd98df4698243d88d5426c6a53a834dd3 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 16:42:21 +0300 Subject: [PATCH] checker: fix clang build generic issue (fixes #15285) --- vlib/v/checker/assign.v | 2 +- .../fns/generic_closure_assignment_test.v | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/fns/generic_closure_assignment_test.v diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index de3aba4d9..6ff9cfb7d 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -124,7 +124,7 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { c.error('cannot use `none` in `unsafe` blocks', right.expr.pos) } if mut right is ast.AnonFn { - if right.decl.generic_names.len > 0 { + if right.decl.generic_names.len > 0 && right.inherited_vars.len == 0 { c.error('cannot assign generic function to a variable', right.decl.pos) } } diff --git a/vlib/v/tests/fns/generic_closure_assignment_test.v b/vlib/v/tests/fns/generic_closure_assignment_test.v new file mode 100644 index 000000000..37491d28d --- /dev/null +++ b/vlib/v/tests/fns/generic_closure_assignment_test.v @@ -0,0 +1,23 @@ +struct Test[T] { +mut: + val T +} + +fn (mut t Test[T]) set_val(val T) { + t.val = val +} + +fn process[T](mut t Test[T]) int { + t.set_val('qqq') + anon := fn [t] [T]() int { + println(t) + return 1 + } + return anon() +} + +fn test_generic_closure_with_generic_capture_can_be_assigned_to_local_variable() { + mut t := Test[string]{} + assert process(mut t) == 1 + assert t.val == 'qqq' +} -- 2.39.5