From 0d797e73d7d8f4613ce3b6d481331ab2e5a6b565 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 17:14:22 +0300 Subject: [PATCH] markused: fix deducing generic type k from internal generic chain (fixes #22494) --- vlib/v/markused/walker.v | 5 ++- ...ics_with_nested_generic_method_call_test.v | 41 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index efec303c2..6f437dbac 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -1308,7 +1308,10 @@ pub fn (mut w Walker) call_expr(mut node ast.CallExpr) { w.mark_by_type(exp_type) } } - source_concrete_types := if node.raw_concrete_types.len > 0 { + source_concrete_types := if node.is_method + && node.concrete_types.len > node.raw_concrete_types.len { + node.concrete_types + } else if node.raw_concrete_types.len > 0 { node.raw_concrete_types } else { node.concrete_types diff --git a/vlib/v/tests/generics/generics_with_nested_generic_method_call_test.v b/vlib/v/tests/generics/generics_with_nested_generic_method_call_test.v index bdbda9350..151f33ab8 100644 --- a/vlib/v/tests/generics/generics_with_nested_generic_method_call_test.v +++ b/vlib/v/tests/generics/generics_with_nested_generic_method_call_test.v @@ -38,3 +38,44 @@ fn test_generics_with_nested_generic_method_call() { } println('OK!!') } + +struct Issue22494In[T] { + internal chan T +} + +fn issue22494_init[T](value T) Issue22494In[T] { + mut ch := chan T{cap: 1} + ch <- value + return Issue22494In[T]{ + internal: ch + } +} + +type Issue22494MapFn[T, K] = fn (T) K + +fn issue22494_do_map[T, K](from chan T, to chan K, map_fn Issue22494MapFn[T, K]) { + to <- map_fn[T, K](<-from) +} + +fn (i Issue22494In[T]) map[K](map_fn Issue22494MapFn[T, K]) Issue22494In[K] { + k_src := Issue22494In[K]{ + internal: chan K{cap: 1} + } + issue22494_do_map[T, K](i.internal, k_src.internal, map_fn) + return k_src +} + +fn (i Issue22494In[T]) get() T { + return <-i.internal +} + +fn test_generic_method_chain_keeps_receiver_and_method_specializations() { + result := issue22494_init[int](1).map[string](fn (value int) string { + return match value { + 1 { 'one' } + else { 'zero' } + } + }).get() + + assert result == 'one' +} -- 2.39.5