diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 1584f173a8033..84bf907cd7b89 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2385,6 +2385,13 @@ def Test_for_loop() endfor assert_equal('1a2b', res) + # unpack with one var + var reslist = [] + for [x] in [['aaa'], ['bbb']] + reslist->add(x) + endfor + assert_equal(['aaa', 'bbb'], reslist) + # loop over string res = '' for c in 'aéc̀d' diff --git a/src/version.c b/src/version.c index 32aec1b506fee..1270c0c06c066 100644 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3051, /**/ 3050, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index cd83aea7362ba..dd3f3aec320d0 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -7731,6 +7731,7 @@ compile_for(char_u *arg_start, cctx_T *cctx) char_u *p; char_u *wp; int var_count = 0; + int var_list = FALSE; int semicolon = FALSE; size_t varlen; garray_T *stack = &cctx->ctx_type_stack; @@ -7747,6 +7748,8 @@ compile_for(char_u *arg_start, cctx_T *cctx) return NULL; if (var_count == 0) var_count = 1; + else + var_list = TRUE; // can also be a list of one variable // consume "in" wp = p; @@ -7811,7 +7814,7 @@ compile_for(char_u *arg_start, cctx_T *cctx) else if (vartype->tt_type == VAR_LIST && vartype->tt_member->tt_type != VAR_ANY) { - if (var_count == 1) + if (!var_list) item_type = vartype->tt_member; else if (vartype->tt_member->tt_type == VAR_LIST && vartype->tt_member->tt_member->tt_type != VAR_ANY) @@ -7828,7 +7831,7 @@ compile_for(char_u *arg_start, cctx_T *cctx) generate_FOR(cctx, loop_lvar->lv_idx); arg = arg_start; - if (var_count > 1) + if (var_list) { generate_UNPACK(cctx, var_count, semicolon); arg = skipwhite(arg + 1); // skip white after '[' @@ -7899,12 +7902,12 @@ compile_for(char_u *arg_start, cctx_T *cctx) } // Reserve a variable to store "var". - where.wt_index = var_count > 1 ? idx + 1 : 0; + where.wt_index = var_list ? idx + 1 : 0; where.wt_variable = TRUE; if (lhs_type == &t_any) lhs_type = item_type; else if (item_type != &t_unknown - && !(var_count > 1 && item_type == &t_any) + && !(var_list && item_type == &t_any) && check_type(lhs_type, item_type, TRUE, where) == FAIL) goto failed; var_lvar = reserve_local(cctx, arg, varlen, TRUE, lhs_type);