From 6201e78201b1d942a92df559f1914252694c1547 Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 20 Aug 2021 14:28:26 +0800 Subject: [PATCH] checker: fix generic struct with non-generic interface in generic fn (#11252) --- vlib/v/checker/checker.v | 5 +++++ ...nerics_struct_with_non_generic_interface_test.v | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 718ebd8761..122fbe1c6b 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -731,6 +731,11 @@ fn (mut c Checker) unwrap_generic_type(typ ast.Type, generic_names []string, con final_concrete_types << t_typ } } + if final_concrete_types.len > 0 { + for method in ts.methods { + c.table.register_fn_concrete_types(method.name, final_concrete_types) + } + } } } else {} diff --git a/vlib/v/tests/generics_struct_with_non_generic_interface_test.v b/vlib/v/tests/generics_struct_with_non_generic_interface_test.v index e9c22ce370..475f3f0c38 100644 --- a/vlib/v/tests/generics_struct_with_non_generic_interface_test.v +++ b/vlib/v/tests/generics_struct_with_non_generic_interface_test.v @@ -23,3 +23,17 @@ fn test_generic_struct_with_non_generic_interface() { println(ret) assert ret == 106 } + +fn run(data T) { + t := Test{ + data: data + salt: 6 + } + x := box_transform(t) + println(x) + assert x == 106 +} + +fn test_generic_struct_with_non_generic_interface_in_generic_fn() { + run('foo') +}