diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 3b2343336b..0d97d365f3 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -1211,6 +1211,7 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name func.return_type = typ } } + func.params = func.params.clone() for mut param in func.params { if param.typ.has_flag(.generic) { if typ := t.resolve_generic_to_concrete(param.typ, generic_names, concrete_types, diff --git a/vlib/v/tests/generics_with_anon_generics_fn_test.v b/vlib/v/tests/generics_with_anon_generics_fn_test.v index 706720bea7..99ee6f8e4e 100644 --- a/vlib/v/tests/generics_with_anon_generics_fn_test.v +++ b/vlib/v/tests/generics_with_anon_generics_fn_test.v @@ -24,6 +24,14 @@ pub fn consume(data int) int { return data } +pub fn consume_str(data string) string { + return data +} + +fn call(f fn (T) T, v T) T { + return f(v) +} + fn test_generics_with_anon_generics_fn() { mut s := MyStruct{ arr: [1, 2, 3, 4, 5] @@ -31,4 +39,9 @@ fn test_generics_with_anon_generics_fn() { y := s.iterate(consume) println(y) assert y == 15 + + assert call(consume, 1) == 1 + assert call(consume_str, '1') == '1' + assert call(consume, 1) == 1 + assert call(consume_str, '1') == '1' }