Mercurial > vim
changeset 21546:4d3e983313dc v8.2.1323
patch 8.2.1323: Vim9: invalid operators only rejected in :def function
Commit: https://github.com/vim/vim/commit/696ba23149eb5a7226e606e3fe6f15fdd064c5f7
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 29 Jul 2020 21:30:04 +0200 |
parents | 3ee29bab85e1 |
children | a24d2c2cbffd |
files | src/eval.c src/proto/vim9compile.pro src/testdir/test_vim9_expr.vim src/version.c src/vim9compile.c |
diffstat | 5 files changed, 38 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- 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] == '?') {
--- 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);
--- 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()