diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index c425b85abe..1fac84338b 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -192,7 +192,7 @@ pub fn (t &Table) fn_type_signature(f &Fn) string { typ := arg.typ.set_nr_muls(0) arg_type_sym := t.get_type_symbol(typ) sig += arg_type_sym.str().to_lower().replace_each(['.', '__', '&', '', '[]', 'arr_', 'chan ', - 'chan_', 'map[', 'map_of_', ']', '_to_']) + 'chan_', 'map[', 'map_of_', ']', '_to_', '<', '_T_', ',', '_', '>', '']) if i < f.params.len - 1 { sig += '_' } diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 8159851afa..0c5c23f69a 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -7466,7 +7466,7 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) { node.pos) } } - if node.language == .v && !c.is_builtin_mod { + if node.language == .v && !c.is_builtin_mod && !node.is_anon { c.check_valid_snake_case(node.name, 'function name', node.pos) } if node.name == 'main.main' { 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 99ee6f8e4e..893ea8e9fa 100644 --- a/vlib/v/tests/generics_with_anon_generics_fn_test.v +++ b/vlib/v/tests/generics_with_anon_generics_fn_test.v @@ -32,6 +32,11 @@ fn call(f fn (T) T, v T) T { return f(v) } +struct Pair { + a T + b U +} + fn test_generics_with_anon_generics_fn() { mut s := MyStruct{ arr: [1, 2, 3, 4, 5] @@ -44,4 +49,9 @@ fn test_generics_with_anon_generics_fn() { assert call(consume_str, '1') == '1' assert call(consume, 1) == 1 assert call(consume_str, '1') == '1' + + pair := Pair{1, 's'} + assert call(fn (v Pair) Pair { + return v + }, pair) == pair }