Skip to content

Commit

Permalink
patch 8.2.3051: Vim9: for loop with one list variable does not work
Browse files Browse the repository at this point in the history
Problem:    Vim9: for loop with one list variable does not work.
Solution:   Use a separate flag for unpacking a list. (closes #8452)
  • Loading branch information
brammool committed Jun 26, 2021
1 parent f3caeb6 commit 444d878
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
7 changes: 7 additions & 0 deletions src/testdir/test_vim9_script.vim
Expand Up @@ -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'
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -755,6 +755,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3051,
/**/
3050,
/**/
Expand Down
11 changes: 7 additions & 4 deletions src/vim9compile.c
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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 '['
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 444d878

Please sign in to comment.