changeset 28723:930f1bb1649d v8.2.4886

patch 8.2.4886: Vim9: redir in skipped block seen as assignment Commit: https://github.com/vim/vim/commit/bc6f2bf78af28c93b48906408756b797ab2fd7bd Author: Bram Moolenaar <Bram@vim.org> Date: Fri May 6 14:29:09 2022 +0100 patch 8.2.4886: Vim9: redir in skipped block seen as assignment Problem: Vim9: redir in skipped block seen as assignment. Solution: Check for valid assignment.
author Bram Moolenaar <Bram@vim.org>
date Fri, 06 May 2022 15:30:02 +0200
parents afa1695e59a0
children 3aa40b1ad25e
files src/ex_docmd.c src/testdir/test_vim9_assign.vim src/version.c
diffstat 3 files changed, 13 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3683,6 +3683,7 @@ find_ex_command(
 	    // "&opt = expr"
 	    // "var = expr"  where "var" is a variable name or we are skipping
 	    // (variable declaration might have been skipped).
+	    // Not "redir => var" (when skipping).
 	    oplen = assignment_len(skipwhite(p), &heredoc);
 	    if (oplen > 0)
 	    {
@@ -3690,7 +3691,8 @@ find_ex_command(
 			|| *eap->cmd == '&'
 			|| *eap->cmd == '$'
 			|| *eap->cmd == '@'
-			|| eap->skip
+			|| (eap->skip && IS_WHITE_OR_NUL(
+						      *(skipwhite(p) + oplen)))
 			|| lookup(eap->cmd, p - eap->cmd, TRUE, cctx) == OK)
 		{
 		    eap->cmdidx = CMD_var;
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -739,6 +739,14 @@ def Test_init_in_for_loop()
   v9.CheckDefAndScriptSuccess(lines)
 enddef
 
+def Test_redir_is_not_assign()
+  if false
+    redir => res
+    echo var_job
+    redir END
+  endif
+enddef
+
 def Test_extend_list()
   # using uninitialized list assigns empty list
   var lines =<< trim END
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4886,
+/**/
     4885,
 /**/
     4884,