# HG changeset patch # User Bram Moolenaar # Date 1610911803 -3600 # Node ID c8f26523d7d72764a1652a14a8590534349fbec7 # Parent 71b7eeac62fc282c40b4a385fdb7b1adf0681eb0 patch 8.2.2371: Vim9: crash when using types in :for with unpack Commit: https://github.com/vim/vim/commit/036d07144efe213199b1ed8de998e6f12a056499 Author: Bram Moolenaar Date: Sun Jan 17 20:23:38 2021 +0100 patch 8.2.2371: Vim9: crash when using types in :for with unpack Problem: Vim9: crash when using types in :for with unpack. Solution: Check for skip_var_list() failing. Pass include_type to skip_var_one(). Skip type when compiling. (closes #7694) diff --git a/src/evalvars.c b/src/evalvars.c --- a/src/evalvars.c +++ b/src/evalvars.c @@ -1019,7 +1019,7 @@ skip_var_list( for (;;) { p = skipwhite(p + 1); // skip whites after '[', ';' or ',' - s = skip_var_one(p, FALSE); + s = skip_var_one(p, include_type); if (s == p) { if (!silent) @@ -1067,11 +1067,14 @@ skip_var_one(char_u *arg, int include_ty return arg + 2; end = find_name_end(*arg == '$' || *arg == '&' ? arg + 1 : arg, NULL, NULL, FNE_INCL_BR | FNE_CHECK_START); + + // "a: type" is declaring variable "a" with a type, not "a:". + // Same for "s: type". + if (end == arg + 2 && end[-1] == ':') + --end; + if (include_type && in_vim9script()) { - // "a: type" is declaring variable "a" with a type, not "a:". - if (end == arg + 2 && end[-1] == ':') - --end; if (*end == ':') end = skip_type(skipwhite(end + 1), FALSE); } diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2060,6 +2060,12 @@ def Test_for_loop() total += nr endfor assert_equal(6, total) + + var res = "" + for [n: number, s: string] in [[1, 'a'], [2, 'b']] + res ..= n .. s + endfor + assert_equal('1a2b', res) enddef def Test_for_loop_fails() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2371, +/**/ 2370, /**/ 2369, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -6884,6 +6884,8 @@ compile_for(char_u *arg_start, cctx_T *c int idx; p = skip_var_list(arg_start, TRUE, &var_count, &semicolon, FALSE); + if (p == NULL) + return NULL; if (var_count == 0) var_count = 1; @@ -7018,6 +7020,8 @@ compile_for(char_u *arg_start, cctx_T *c generate_STORE(cctx, ISN_STORE, var_lvar->lv_idx, NULL); } + if (*p == ':') + p = skip_type(skipwhite(p + 1), FALSE); if (*p == ',' || *p == ';') ++p; arg = skipwhite(p);