From 565dbc40511cda06e36af66ab9e692da6026c285 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sat, 22 May 2021 16:04:19 +0800 Subject: [PATCH] checker: fix inferring method receiver types (#10166) --- vlib/v/checker/check_types.v | 3 ++- vlib/v/tests/generics_struct_anon_fn_type_test.v | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 118919f04d..b1a7e62ad4 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -503,7 +503,8 @@ pub fn (mut c Checker) infer_fn_generic_types(f ast.Fn, mut call_expr ast.CallEx if sym.kind == .struct_ { info := sym.info as ast.Struct receiver_generic_names := info.generic_types.map(c.table.get_type_symbol(it).name) - if gt_name in receiver_generic_names { + if gt_name in receiver_generic_names + && info.generic_types.len == info.concrete_types.len { idx := receiver_generic_names.index(gt_name) typ = info.concrete_types[idx] } diff --git a/vlib/v/tests/generics_struct_anon_fn_type_test.v b/vlib/v/tests/generics_struct_anon_fn_type_test.v index eb0f21556d..0da23114f0 100644 --- a/vlib/v/tests/generics_struct_anon_fn_type_test.v +++ b/vlib/v/tests/generics_struct_anon_fn_type_test.v @@ -40,14 +40,30 @@ fn holder_call_21(func T, a int) int { return h.call(a) } +fn holder_call_12(func T, a int) int { + return FnHolder1{func}.call(a) +} + +fn holder_call_22(func T, a int) int { + return FnHolder2{func}.call(a) +} + fn test_generic_struct_with_anon_fn_parameter() { mut ret := holder_call_1(neg, 1) assert ret == -1 ret = holder_call_11(neg, 2) assert ret == -2 + ret = holder_call_12(neg, 3) + assert ret == -3 + ret = FnHolder1{neg}.call(4) + assert ret == -4 ret = holder_call_2(neg, 3) assert ret == -3 ret = holder_call_21(neg, 4) assert ret == -4 + ret = holder_call_22(neg, 5) + assert ret == -5 + ret = FnHolder2{neg}.call(6) + assert ret == -6 }