summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-07-24 14:14:52 +0200
committerBram Moolenaar <Bram@vim.org>2021-07-24 14:14:52 +0200
commit88421d6dc812a2f3b0eab34740f174c9558cb734 (patch)
tree46827e25c442a42bea8946ded58bdd8d0f1da4a7 /src
parent1a3e5747b7df7ddda312bbfd18e04fc2122001fb (diff)
downloadvim-git-88421d6dc812a2f3b0eab34740f174c9558cb734.tar.gz
patch 8.2.3209: Vim9: lambda doesn't find block-local variablev8.2.3209
Problem: Vim9: lambda doesn't find block-local variable. Solution: Adjust how a script-local variable is found. (closes #8614)
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_func.vim36
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c5
3 files changed, 42 insertions, 1 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 8ac05d421..e8df8a75d 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -2352,6 +2352,42 @@ def Test_list_lambda()
assert_match('def <lambda>\d\+(_: any): number\n1 return 0\n enddef', body)
enddef
+def Test_lamba_block_variable()
+ var lines =<< trim END
+ vim9script
+ var flist: list<func>
+ for i in range(10)
+ var inloop = i
+ flist[i] = () => inloop
+ endfor
+ END
+ CheckScriptSuccess(lines)
+
+ lines =<< trim END
+ vim9script
+ if true
+ var outloop = 5
+ var flist: list<func>
+ for i in range(10)
+ flist[i] = () => outloop
+ endfor
+ endif
+ END
+ CheckScriptSuccess(lines)
+
+ lines =<< trim END
+ vim9script
+ if true
+ var outloop = 5
+ endif
+ var flist: list<func>
+ for i in range(10)
+ flist[i] = () => outloop
+ endfor
+ END
+ CheckScriptFailure(lines, 'E1001: Variable not found: outloop', 1)
+enddef
+
def Test_legacy_lambda()
legacy echo {x -> 'hello ' .. x}('foo')
diff --git a/src/version.c b/src/version.c
index 64622c311..76c6db9bc 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3209,
+/**/
3208,
/**/
3207,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 06098d84c..5ec3b3d39 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -339,6 +339,7 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
hashitem_T *hi;
int cc;
sallvar_T *sav;
+ sallvar_T *found_sav;
ufunc_T *ufunc;
// Find the list of all script variables with the right name.
@@ -361,6 +362,7 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
// Go over the variables with this name and find one that was visible
// from the function.
ufunc = cctx->ctx_ufunc;
+ found_sav = sav;
while (sav != NULL)
{
int idx;
@@ -373,7 +375,8 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
sav = sav->sav_next;
}
- return NULL;
+ // Not found, assume variable at script level was visible.
+ return found_sav;
}
/*