# HG changeset patch # User Bram Moolenaar # Date 1596624304 -7200 # Node ID 7d3ba70a03f1b3932bad042d046579fb67b0e2e4 # Parent 08894a73765b043b41fda8bdc39cd4c87c7ad9bc patch 8.2.1372: Vim9: no error for missing white space around operator Commit: https://github.com/vim/vim/commit/fdac71c5075062f97f77044e9619fa5c907e0327 Author: Bram Moolenaar Date: Wed Aug 5 12:44:41 2020 +0200 patch 8.2.1372: 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 ? and :. diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -2072,7 +2072,7 @@ eval0( * expr2 ? expr1 : expr1 * * "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. * * Note: "rettv.v_lock" is not set. * @@ -2111,7 +2111,15 @@ eval1(char_u **arg, typval_T *rettv, eva if (getnext) *arg = eval_next_line(evalarg_used); else + { + if (evaluate && in_vim9script() && !VIM_ISWHITE(p[-1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = p; + } result = FALSE; if (evaluate) @@ -2128,6 +2136,12 @@ eval1(char_u **arg, typval_T *rettv, eva /* * Get the second variable. Recursive! */ + if (evaluate && in_vim9script() && !IS_WHITE_OR_NUL((*arg)[1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); evalarg_used->eval_flags = result ? orig_flags : orig_flags & ~EVAL_EVALUATE; @@ -2148,11 +2162,25 @@ eval1(char_u **arg, typval_T *rettv, eva if (getnext) *arg = eval_next_line(evalarg_used); else + { + if (evaluate && in_vim9script() && !VIM_ISWHITE(p[-1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = p; + } /* * Get the third variable. Recursive! */ + if (evaluate && in_vim9script() && !IS_WHITE_OR_NUL((*arg)[1])) + { + error_white_both(p, 1); + clear_tv(rettv); + return FAIL; + } *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); evalarg_used->eval_flags = !result ? orig_flags : orig_flags & ~EVAL_EVALUATE; @@ -2179,7 +2207,7 @@ eval1(char_u **arg, typval_T *rettv, eva * expr2 || expr2 || expr2 logical OR * * "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. */ @@ -2310,7 +2338,7 @@ eval2(char_u **arg, typval_T *rettv, eva * expr3 && expr3 && expr3 logical AND * * "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. */ diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -60,7 +60,7 @@ def Test_expr1() enddef def Test_expr1_vimscript() - # only checks line continuation + # check line continuation let lines =<< trim END vim9script let var = 1 @@ -87,6 +87,33 @@ def Test_expr1_vimscript() assert_equal('no', var) END CheckScriptSuccess(lines) + + # check white space + lines =<< trim END + vim9script + let var = v:true?1:2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true? 1 : 2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true ?1 : 2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true ? 1: 2 + END + CheckScriptFailure(lines, 'E1004:') + lines =<< trim END + vim9script + let var = v:true ? 1 :2 + END + CheckScriptFailure(lines, 'E1004:') enddef func Test_expr1_fails() diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1372, +/**/ 1371, /**/ 1370,