]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.3209: Vim9: lambda doesn't find block-local variable v8.2.3209
authorBram Moolenaar <Bram@vim.org>
Sat, 24 Jul 2021 12:14:52 +0000 (14:14 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 24 Jul 2021 12:14:52 +0000 (14:14 +0200)
Problem:    Vim9: lambda doesn't find block-local variable.
Solution:   Adjust how a script-local variable is found. (closes #8614)

src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index 8ac05d421aa7a7541505be0c5171370b3e4462eb..e8df8a75d5d25759d8b3e6444bcb3d976f5430e1 100644 (file)
@@ -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')
 
index 64622c31159392d8b109b3d8fe0b0f8200feeb1c..76c6db9bc4024bace033c875fdff81c3189559cb 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3209,
 /**/
     3208,
 /**/
index 06098d84c509086e54b081485aae5c7b7687e646..5ec3b3d3908927aa74603e43c2015d413e1f950b 100644 (file)
@@ -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;
 }
 
 /*