Patch 8.2.3209
Problem:    Vim9: lambda doesn't find block-local variable.
Solution:   Adjust how a script-local variable is found. (closes #8614)
Files:      src/vim9compile.c, src/testdir/test_vim9_func.vim


*** ../vim-8.2.3208/src/vim9compile.c   2021-07-24 13:18:43.861887612 +0200
--- src/vim9compile.c   2021-07-24 14:08:47.007729983 +0200
***************
*** 339,344 ****
--- 339,345 ----
      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,366 ****
--- 362,368 ----
      // 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,379 ****
        sav = sav->sav_next;
      }
  
!     return NULL;
  }
  
  /*
--- 375,382 ----
        sav = sav->sav_next;
      }
  
!     // Not found, assume variable at script level was visible.
!     return found_sav;
  }
  
  /*
*** ../vim-8.2.3208/src/testdir/test_vim9_func.vim      2021-07-21 
20:38:43.283635192 +0200
--- src/testdir/test_vim9_func.vim      2021-07-24 14:13:44.699038696 +0200
***************
*** 2352,2357 ****
--- 2352,2393 ----
    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')
  
*** ../vim-8.2.3208/src/version.c       2021-07-24 13:57:25.481296527 +0200
--- src/version.c       2021-07-24 14:14:06.550987862 +0200
***************
*** 757,758 ****
--- 757,760 ----
  {   /* Add new patch number below this line */
+ /**/
+     3209,
  /**/

-- 
If evolution theories are correct, humans will soon grow a third
hand for operating the mouse.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202107241215.16OCFT48797905%40masaka.moolenaar.net.

Raspunde prin e-mail lui