patch 8.2.3222: Vim9: cannot used loop variable later as lambda argument
Problem: Vim9: cannot used loop variable later as lambda argument.
Solution: When not in function context check the current block ID.
(closes #8637)
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 2df5ff4..62d7373 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -355,10 +355,23 @@
return NULL;
sav = HI2SAV(hi);
- if (sav->sav_block_id == 0 || cctx == NULL)
- // variable defined in the script scope or not in a function.
+ if (sav->sav_block_id == 0)
+ // variable defined in the top script scope is always visible
return sav;
+ if (cctx == NULL)
+ {
+ // Not in a function scope, find variable with block id equal to or
+ // smaller than the current block id.
+ while (sav != NULL)
+ {
+ if (sav->sav_block_id <= si->sn_current_block_id)
+ break;
+ sav = sav->sav_next;
+ }
+ return sav;
+ }
+
// Go over the variables with this name and find one that was visible
// from the function.
ufunc = cctx->ctx_ufunc;