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:
@ -2275,6 +2275,20 @@ def Test_for_loop()
|
|||||||
v9.CheckDefAndScriptSuccess(lines)
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
enddef
|
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()
|
def Test_for_loop_with_closure()
|
||||||
# using the loop variable in a closure results in the last used value
|
# using the loop variable in a closure results in the last used value
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
|
|||||||
@ -699,6 +699,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
726,
|
||||||
/**/
|
/**/
|
||||||
725,
|
725,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
@ -1048,7 +1048,7 @@ compile_for(char_u *arg_start, cctx_T *cctx)
|
|||||||
&& need_type_where(item_type, lhs_type, -1,
|
&& need_type_where(item_type, lhs_type, -1,
|
||||||
where, cctx, FALSE, FALSE) == FAIL)
|
where, cctx, FALSE, FALSE) == FAIL)
|
||||||
goto failed;
|
goto failed;
|
||||||
var_lvar = reserve_local(cctx, arg, varlen, ASSIGN_CONST,
|
var_lvar = reserve_local(cctx, arg, varlen, ASSIGN_FINAL,
|
||||||
lhs_type);
|
lhs_type);
|
||||||
if (var_lvar == NULL)
|
if (var_lvar == NULL)
|
||||||
// out of memory or used as an argument
|
// out of memory or used as an argument
|
||||||
|
|||||||
Reference in New Issue
Block a user