changeset 25149:18b31f0a4bb5 v8.2.3111

patch 8.2.3111: Vim9: confusing error with extra whitespace before colon Commit: https://github.com/vim/vim/commit/404557e6a60389d09bbf91dd0cf3bae11bd623b9 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jul 5 21:41:48 2021 +0200 patch 8.2.3111: Vim9: confusing error with extra whitespace before colon Problem: Vim9: confusing error with extra whitespace before colon. Solution: Check for colon after white space. (closes https://github.com/vim/vim/issues/8513)
author Bram Moolenaar <Bram@vim.org>
date Mon, 05 Jul 2021 21:45:04 +0200
parents 004577226b10
children 615c8a81abd3
files src/eval.c src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c
diffstat 4 files changed, 22 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -1660,6 +1660,7 @@ eval_for_line(
     evalarg_T	*evalarg)
 {
     forinfo_T	*fi;
+    char_u	*var_list_end;
     char_u	*expr;
     typval_T	tv;
     list_T	*l;
@@ -1671,15 +1672,19 @@ eval_for_line(
     if (fi == NULL)
 	return NULL;
 
-    expr = skip_var_list(arg, TRUE, &fi->fi_varcount, &fi->fi_semicolon, FALSE);
-    if (expr == NULL)
+    var_list_end = skip_var_list(arg, TRUE, &fi->fi_varcount,
+						     &fi->fi_semicolon, FALSE);
+    if (var_list_end == NULL)
 	return fi;
 
-    expr = skipwhite_and_linebreak(expr, evalarg);
+    expr = skipwhite_and_linebreak(var_list_end, evalarg);
     if (expr[0] != 'i' || expr[1] != 'n'
 				  || !(expr[2] == NUL || VIM_ISWHITE(expr[2])))
     {
-	emsg(_(e_missing_in));
+	if (in_vim9script() && *expr == ':' && expr != var_list_end)
+	    semsg(_(e_no_white_space_allowed_before_colon_str), expr);
+	else
+	    emsg(_(e_missing_in));
 	return fi;
     }
 
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -2566,6 +2566,13 @@ def Test_for_loop_fails()
       endfor
   END
   CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
+
+  lines =<< trim END
+      for n : number in [1, 2]
+        echo n
+      endfor
+  END
+  CheckDefAndScriptFailure(lines, 'E1059:', 1)
 enddef
 
 def Test_for_loop_script_var()
--- 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 */
 /**/
+    3111,
+/**/
     3110,
 /**/
     3109,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -7775,7 +7775,10 @@ compile_for(char_u *arg_start, cctx_T *c
 	return NULL;
     if (STRNCMP(p, "in", 2) != 0 || !IS_WHITE_OR_NUL(p[2]))
     {
-	emsg(_(e_missing_in));
+	if (*p == ':' && wp != p)
+	    semsg(_(e_no_white_space_allowed_before_colon_str), p);
+	else
+	    emsg(_(e_missing_in));
 	return NULL;
     }
     wp = p + 2;