From 2f48288a250d71757a36c3784855952119b1dd9f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 28 Apr 2023 11:06:28 -0300 Subject: [PATCH] checker: fix generic argument resolution for multiple generic args (#18073) --- vlib/v/checker/check_types.v | 4 ++-- vlib/v/tests/multiple_generic_resolve_test.v | 24 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/multiple_generic_resolve_test.v diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 69700b25f7..ff203d196b 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -1014,8 +1014,8 @@ fn (mut c Checker) infer_fn_generic_types(func ast.Fn, mut node ast.CallExpr) { && c.table.cur_fn.params.len > 0 && func.generic_names.len > 0 && arg.expr is ast.Ident { var_name := (arg.expr as ast.Ident).name - for cur_param in c.table.cur_fn.params { - if !cur_param.typ.has_flag(.generic) || cur_param.name != var_name { + for k, cur_param in c.table.cur_fn.params { + if !cur_param.typ.has_flag(.generic) || k < gi || cur_param.name != var_name { continue } typ = cur_param.typ diff --git a/vlib/v/tests/multiple_generic_resolve_test.v b/vlib/v/tests/multiple_generic_resolve_test.v new file mode 100644 index 0000000000..49df8a5f5b --- /dev/null +++ b/vlib/v/tests/multiple_generic_resolve_test.v @@ -0,0 +1,24 @@ +struct App { +} + +struct Config[T] { + val T +} + +fn pre_start[T, R](app T, config R) string { + return start(app, config.val) +} + +fn start[T, R](app T, otherthing R) R { + println(otherthing) + return otherthing +} + +fn test_main() { + app := App{} + testval := 'hello' + config := Config[string]{ + val: testval + } + assert pre_start(app, config) == 'hello' +}