]> granicus.if.org Git - vim/commitdiff
patch 8.2.3051: Vim9: for loop with one list variable does not work v8.2.3051
authorBram Moolenaar <Bram@vim.org>
Sat, 26 Jun 2021 10:40:56 +0000 (12:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 26 Jun 2021 10:40:56 +0000 (12:40 +0200)
Problem:    Vim9: for loop with one list variable does not work.
Solution:   Use a separate flag for unpacking a list. (closes #8452)

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 1584f173a8033ea77623cd731ffe39806d5ee7c9..84bf907cd7b898127a57fb718ba915d8801fd9f8 100644 (file)
@@ -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'
index 32aec1b506fee471b7335e2370c39deea0cdcf67..1270c0c06c066e45f51d235b82106c0a6764ff87 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3051,
 /**/
     3050,
 /**/
index cd83aea7362ba342dff1c76e7ca264c32856e4ba..dd3f3aec320d0aa5ae3665c74ab6ae9c090cb4af 100644 (file)
@@ -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);