# HG changeset patch # User Bram Moolenaar # Date 1596051004 -7200 # Node ID 4d3e983313dcc6a0135d89dcfaff951c02921ef5 # Parent 3ee29bab85e1972060c9b8b2d57074c07e98b003 patch 8.2.1323: Vim9: invalid operators only rejected in :def function Commit: https://github.com/vim/vim/commit/696ba23149eb5a7226e606e3fe6f15fdd064c5f7 Author: Bram Moolenaar Date: Wed Jul 29 21:20:41 2020 +0200 patch 8.2.1323: Vim9: invalid operators only rejected in :def function Problem: Vim9: invalid operators only rejected in :def function. Solution: Also reject them at script level. (closes https://github.com/vim/vim/issues/6564) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -2420,9 +2420,9 @@ eval4(char_u **arg, typval_T *rettv, eva { char_u *p; int getnext; - int i; exptype_T type = EXPR_UNKNOWN; int len = 2; + int type_is = FALSE; /* * Get the first variable. @@ -2431,44 +2431,7 @@ eval4(char_u **arg, typval_T *rettv, eva return FAIL; p = eval_next_non_blank(*arg, evalarg, &getnext); - switch (p[0]) - { - case '=': if (p[1] == '=') - type = EXPR_EQUAL; - else if (p[1] == '~') - type = EXPR_MATCH; - break; - case '!': if (p[1] == '=') - type = EXPR_NEQUAL; - else if (p[1] == '~') - type = EXPR_NOMATCH; - break; - case '>': if (p[1] != '=') - { - type = EXPR_GREATER; - len = 1; - } - else - type = EXPR_GEQUAL; - break; - case '<': if (p[1] != '=') - { - type = EXPR_SMALLER; - len = 1; - } - else - type = EXPR_SEQUAL; - break; - case 'i': if (p[1] == 's') - { - if (p[2] == 'n' && p[3] == 'o' && p[4] == 't') - len = 5; - i = p[len]; - if (!isalnum(i) && i != '_') - type = len == 2 ? EXPR_IS : EXPR_ISNOT; - } - break; - } + type = get_compare_type(p, &len, &type_is); /* * If there is a comparative operator, use it. @@ -2482,6 +2445,13 @@ eval4(char_u **arg, typval_T *rettv, eva if (getnext) *arg = eval_next_line(evalarg); + if (vim9script && type_is && (p[len] == '?' || p[len] == '#')) + { + semsg(_(e_invexpr2), p); + clear_tv(rettv); + return FAIL; + } + // extra question mark appended: ignore case if (p[len] == '?') { diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro --- a/src/proto/vim9compile.pro +++ b/src/proto/vim9compile.pro @@ -16,6 +16,7 @@ int vim9_comment_start(char_u *p); char_u *peek_next_line_from_context(cctx_T *cctx); char_u *next_line_from_context(cctx_T *cctx, int skip_comment); char_u *to_name_const_end(char_u *arg); +exptype_T get_compare_type(char_u *p, int *len, int *type_is); int assignment_len(char_u *p, int *heredoc); void vim9_declare_error(char_u *name); int check_vim9_unlet(char_u *name); 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 @@ -831,7 +831,7 @@ def Test_expr5() enddef def Test_expr5_vim9script() - # only checks line continuation + # check line continuation let lines =<< trim END vim9script let var = 11 @@ -848,6 +848,30 @@ def Test_expr5_vim9script() assert_equal('onetwo', var) END CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + echo 'abc' is# 'abc' + END + CheckScriptFailure(lines, 'E15:') + + lines =<< trim END + vim9script + echo 'abc' is? 'abc' + END + CheckScriptFailure(lines, 'E15:') + + lines =<< trim END + vim9script + echo 'abc' isnot# 'abc' + END + CheckScriptFailure(lines, 'E15:') + + lines =<< trim END + vim9script + echo 'abc' isnot? 'abc' + END + CheckScriptFailure(lines, 'E15:') enddef def Test_expr5_float() 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 */ /**/ + 1323, +/**/ 1322, /**/ 1321, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -3633,7 +3633,7 @@ get_vim_constant(char_u **arg, typval_T } } - static exptype_T + exptype_T get_compare_type(char_u *p, int *len, int *type_is) { exptype_T type = EXPR_UNKNOWN;