From 706b6f5867cb0fe65c4fefac8382fe2995eedde7 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Wed, 13 Aug 2025 22:39:37 +0200 Subject: [PATCH] patch 9.1.1629: Vim9: Not able to use more than 10 type arguments in a generic function Problem: Vim9: Not able to use more than 10 type arguments in a generic function Solution: Initialize the types after reading all the type arg variable names (Yegappan Lakshmanan) closes: #17981 Signed-off-by: Yegappan Lakshmanan Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_generics.vim | 17 +++++++++++++++ src/version.c | 2 ++ src/vim9generics.c | 35 +++++++++++++++++++----------- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/testdir/test_vim9_generics.vim b/src/testdir/test_vim9_generics.vim index be279821d6..07648a3326 100644 --- a/src/testdir/test_vim9_generics.vim +++ b/src/testdir/test_vim9_generics.vim @@ -3553,4 +3553,21 @@ def Test_generic_enum_constructor_error() v9.CheckSourceFailure(lines, "E1010: Type not recognized: A", 4) enddef +" Test for using more than 10 type arguments +def Test_generic_max_type_args() + var lines =<< trim END + vim9script + + def Fn(a1: A1): A1 + var x: A1 = a1 + return x + enddef + + assert_equal(10, Fn(10)) + + assert_equal('abc', Fn('abc')) + END + v9.CheckSourceSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index 01eadc2f00..14178370ae 100644 --- a/src/version.c +++ b/src/version.c @@ -719,6 +719,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1629, /**/ 1628, /**/ diff --git a/src/vim9generics.c b/src/vim9generics.c index e74e3436ea..54400903e4 100644 --- a/src/vim9generics.c +++ b/src/vim9generics.c @@ -526,16 +526,6 @@ parse_generic_func_type_params( if (name_exists) return NULL; - if (ga_grow(&gfatab->gfat_param_types, 1) == FAIL) - return NULL; - type_T *gt = - &((type_T *)gfatab->gfat_param_types.ga_data)[gfatab->gfat_param_types.ga_len]; - gfatab->gfat_param_types.ga_len++; - - CLEAR_POINTER(gt); - gt->tt_type = VAR_ANY; - gt->tt_flags = TTFLAG_GENERIC; - if (ga_grow(&gfatab->gfat_args, 1) == FAIL) return NULL; generic_T *generic = @@ -546,7 +536,7 @@ parse_generic_func_type_params( if (generic->gt_name == NULL) return NULL; vim_strncpy(generic->gt_name, name_start, name_len); - generic->gt_type = gt; + generic->gt_type = NULL; if (VIM_ISWHITE(*p)) { @@ -572,13 +562,32 @@ parse_generic_func_type_params( } if (*p != '>') return NULL; + p++; - if (generic_func_args_table_size(gfatab) == 0) + int gfat_sz = generic_func_args_table_size(gfatab); + + if (gfat_sz == 0) { emsg_funcname(e_empty_type_list_for_generic_function_str, func_name); return NULL; } - p++; + + // set the generic parms to VAR_ANY type + if (ga_grow(&gfatab->gfat_param_types, gfat_sz) == FAIL) + return NULL; + + gfatab->gfat_param_types.ga_len = gfat_sz; + for (int i = 0; i < generic_func_args_table_size(gfatab); i++) + { + type_T *gt = &((type_T *)gfatab->gfat_param_types.ga_data)[i]; + + CLEAR_POINTER(gt); + gt->tt_type = VAR_ANY; + gt->tt_flags = TTFLAG_GENERIC; + + generic_T *generic = &((generic_T *)gfatab->gfat_args.ga_data)[i]; + generic->gt_type = gt; + } return p; }