patch 9.0.0726: looping over list of lists works in script, not in function

Problem:    Looping over list of lists and changing the list contents works in
            Vim9 script, not in a compiled function.
Solution:   Mark the loop variable final instead of const. (closes #11347)
This commit is contained in:
Bram Moolenaar
2022-10-11 21:41:25 +01:00
parent 7e017461e2
commit 159b2d5bfc
3 changed files with 17 additions and 1 deletions

View File

@ -2275,6 +2275,20 @@ def Test_for_loop()
v9.CheckDefAndScriptSuccess(lines)
enddef
def Test_for_loop_list_of_lists()
# loop variable is final, not const
var lines =<< trim END
# Filter out all odd numbers in each sublist
var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
for i in list
filter(i, (_, n: number): bool => n % 2 == 0)
endfor
assert_equal([[], [2], [2], [2, 4]], list)
END
v9.CheckDefAndScriptSuccess(lines)
enddef
def Test_for_loop_with_closure()
# using the loop variable in a closure results in the last used value
var lines =<< trim END

View File

@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
726,
/**/
725,
/**/

View File

@ -1048,7 +1048,7 @@ compile_for(char_u *arg_start, cctx_T *cctx)
&& need_type_where(item_type, lhs_type, -1,
where, cctx, FALSE, FALSE) == FAIL)
goto failed;
var_lvar = reserve_local(cctx, arg, varlen, ASSIGN_CONST,
var_lvar = reserve_local(cctx, arg, varlen, ASSIGN_FINAL,
lhs_type);
if (var_lvar == NULL)
// out of memory or used as an argument