changeset 21636:dcfcb6163f3d v8.2.1368

patch 8.2.1368: Vim9: no error for missing white space around operator Commit: https://github.com/vim/vim/commit/ff1cd39cfe62d5089d5e703f4eb290694751ace3 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Aug 5 11:51:30 2020 +0200 patch 8.2.1368: Vim9: no error for missing white space around operator Problem: Vim9: no error for missing white space around operator. Solution: Check for white space around <, !=, etc.
author Bram Moolenaar <Bram@vim.org>
date Wed, 05 Aug 2020 12:00:04 +0200
parents 20af1fd0ef58
children 00cd029a1a87
files src/eval.c src/testdir/test_vim9_expr.vim src/version.c
diffstat 3 files changed, 53 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -2422,7 +2422,7 @@ eval3(char_u **arg, typval_T *rettv, eva
  *	var1 isnot var2
  *
  * "arg" must point to the first non-white of the expression.
- * "arg" is advanced to the next non-white after the recognized expression.
+ * "arg" is advanced to just after the recognized expression.
  *
  * Return OK or FAIL.
  */
@@ -2452,9 +2452,17 @@ eval4(char_u **arg, typval_T *rettv, eva
 	typval_T    var2;
 	int	    ic;
 	int	    vim9script = in_vim9script();
+	int	    evaluate = evalarg == NULL
+				   ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
 
 	if (getnext)
 	    *arg = eval_next_line(evalarg);
+	else if (evaluate && vim9script && !VIM_ISWHITE(**arg))
+	{
+	    error_white_both(p, len);
+	    clear_tv(rettv);
+	    return FAIL;
+	}
 
 	if (vim9script && type_is && (p[len] == '?' || p[len] == '#'))
 	{
@@ -2482,13 +2490,19 @@ eval4(char_u **arg, typval_T *rettv, eva
 	/*
 	 * Get the second variable.
 	 */
+	if (evaluate && vim9script && !IS_WHITE_OR_NUL(p[len]))
+	{
+	    error_white_both(p, 1);
+	    clear_tv(rettv);
+	    return FAIL;
+	}
 	*arg = skipwhite_and_linebreak(p + len, evalarg);
 	if (eval5(arg, &var2, evalarg) == FAIL)
 	{
 	    clear_tv(rettv);
 	    return FAIL;
 	}
-	if (evalarg != NULL && (evalarg->eval_flags & EVAL_EVALUATE))
+	if (evaluate)
 	{
 	    int ret;
 
@@ -2552,7 +2566,7 @@ eval_addlist(typval_T *tv1, typval_T *tv
  *	..	string concatenation
  *
  * "arg" must point to the first non-white of the expression.
- * "arg" is advanced to the next non-white after the recognized expression.
+ * "arg" is advanced to just after the recognized expression.
  *
  * Return OK or FAIL.
  */
@@ -2754,7 +2768,7 @@ eval5(char_u **arg, typval_T *rettv, eva
  *	%	number modulo
  *
  * "arg" must point to the first non-white of the expression.
- * "arg" is advanced to the next non-white after the recognized expression.
+ * "arg" is advanced to just after the recognized expression.
  *
  * Return OK or FAIL.
  */
@@ -2956,7 +2970,7 @@ eval6(
  *  trailing ->name()	method call
  *
  * "arg" must point to the first non-white of the expression.
- * "arg" is advanced to the next non-white after the recognized expression.
+ * "arg" is advanced to just after the recognized expression.
  *
  * Return OK or FAIL.
  */
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -726,6 +726,38 @@ def Test_expr4_vimscript()
     set noignorecase
   END
   CheckScriptSuccess(lines)
+
+  # check missing white space
+  lines =<< trim END
+    vim9script
+    echo 2>3
+  END
+  CheckScriptFailure(lines, 'E1004:')
+  lines =<< trim END
+    vim9script
+    echo 2 >3
+  END
+  CheckScriptFailure(lines, 'E1004:')
+  lines =<< trim END
+    vim9script
+    echo 2> 3
+  END
+  CheckScriptFailure(lines, 'E1004:')
+  lines =<< trim END
+    vim9script
+    echo 2!=3
+  END
+  CheckScriptFailure(lines, 'E1004:')
+  lines =<< trim END
+    vim9script
+    echo 2 !=3
+  END
+  CheckScriptFailure(lines, 'E1004:')
+  lines =<< trim END
+    vim9script
+    echo 2!= 3
+  END
+  CheckScriptFailure(lines, 'E1004:')
 enddef
 
 func Test_expr4_fails()
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1368,
+/**/
     1367,
 /**/
     1366,