summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-06 12:23:30 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-06 12:23:30 +0000
commit58493cfae255adec2d5b407593b82d07abcc0975 (patch)
tree4c8505b32457d372dbf4d6a8291f3c469123900c
parent269dc6361888ca23ef8d87f2795753f0bacd95e6 (diff)
patch 8.2.4016: Vim9: incorrect error for argument that is shadowing varv8.2.4016
Problem: Vim9: incorrect error for argument that is shadowing var. Solution: Ignore variable that is not in block where the function was defined.
-rw-r--r--src/testdir/test_vim9_func.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c6
3 files changed, 19 insertions, 4 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 025edd5daf..9e420ade74 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -933,6 +933,21 @@ def Test_local_function_shadows_global()
delfunc g:Func
END
CheckScriptSuccess(lines)
+
+ # This does not shadow "i" which is visible only inside the for loop
+ lines =<< trim END
+ vim9script
+
+ def Foo(i: number)
+ echo i
+ enddef
+
+ for i in range(3)
+ # Foo() is compiled here
+ Foo(i)
+ endfor
+ END
+ CheckScriptSuccess(lines)
enddef
func TakesOneArg(arg)
diff --git a/src/version.c b/src/version.c
index d331c87085..dafef8ec98 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4016,
+/**/
4015,
/**/
4014,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index da93c1b893..453e3f5452 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -162,7 +162,6 @@ 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.
@@ -198,7 +197,6 @@ 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;
@@ -211,8 +209,8 @@ find_script_var(char_u *name, size_t len, cctx_T *cctx)
sav = sav->sav_next;
}
- // Not found, assume variable at script level was visible.
- return found_sav;
+ // Not found, variable was not visible.
+ return NULL;
}
/*