diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-01-05 22:08:20 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-01-05 22:08:20 +0100 |
commit | b23279d7a2d28de5df942924b77cf23672fc684f (patch) | |
tree | 7356f5032ad583401ae24edb5c5a5f51663e3706 | |
parent | 0acbf5ae6632b36c2d2f93406478270ef21f528b (diff) |
patch 8.2.2305: Vim9: "++var" and "--var" are silently acceptedv8.2.2305
Problem: Vim9: "++var" and "--var" are silently accepted.
Solution: Give an error message.
-rw-r--r-- | src/eval.c | 26 | ||||
-rw-r--r-- | src/proto/eval.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 65 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 4 |
5 files changed, 75 insertions, 23 deletions
diff --git a/src/eval.c b/src/eval.c index 571e96f70b..02cfd7d7dd 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3188,6 +3188,28 @@ eval6( return OK; } + int +eval_leader(char_u **arg, int vim9) +{ + char_u *s = *arg; + char_u *p = *arg; + + while (*p == '!' || *p == '-' || *p == '+') + { + char_u *n = skipwhite(p + 1); + + // ++, --, -+ and +- are not accepted in Vim9 script + if (vim9 && (*p == '-' || *p == '+') && (*n == '-' || *n == '+')) + { + semsg(_(e_invexpr2), s); + return FAIL; + } + p = n; + } + *arg = p; + return OK; +} + /* * Handle sixth level expression: * number number constant @@ -3243,8 +3265,8 @@ eval7( * Skip '!', '-' and '+' characters. They are handled later. */ start_leader = *arg; - while (**arg == '!' || **arg == '-' || **arg == '+') - *arg = skipwhite(*arg + 1); + if (eval_leader(arg, in_vim9script()) == FAIL) + return FAIL; end_leader = *arg; if (**arg == '.' && (!isdigit(*(*arg + 1)) diff --git a/src/proto/eval.pro b/src/proto/eval.pro index 8fa908c5c7..ec453645a1 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -39,6 +39,7 @@ int eval0(char_u *arg, typval_T *rettv, exarg_T *eap, evalarg_T *evalarg); int eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg); void eval_addblob(typval_T *tv1, typval_T *tv2); int eval_addlist(typval_T *tv1, typval_T *tv2); +int eval_leader(char_u **arg, int vim9); int check_can_index(typval_T *rettv, int evaluate, int verbose); int eval_index_inner(typval_T *rettv, int is_range, typval_T *var1, typval_T *var2, char_u *key, int keylen, int verbose); char_u *partial_name(partial_T *pt); diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index d835f04a96..ae5ca2816c 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -2516,11 +2516,8 @@ def Test_expr7_parens() assert_equal(6, +6) assert_equal(-6, -6) - assert_equal(6, --6) - assert_equal(6, -+-6) - assert_equal(-6, ---6) assert_equal(false, !-3) - assert_equal(true, !+-+0) + assert_equal(true, !+0) enddef def Test_expr7_parens_vim9script() @@ -2539,26 +2536,56 @@ enddef def Test_expr7_negate_add() assert_equal(-99, -99) assert_equal(-99, - 99) - assert_equal(99, --99) - assert_equal(99, -- 99) - assert_equal(99, - - 99) assert_equal(99, +99) - assert_equal(-99, -+99) - assert_equal(-99, -+ 99) - assert_equal(-99, - +99) - assert_equal(-99, - + 99) - assert_equal(-99, +-99) - assert_equal(-99, + -99) - assert_equal(-99, + - 99) var nr = 88 assert_equal(-88, -nr) assert_equal(-88, - nr) - assert_equal(-88, - +nr) - assert_equal(88, -- nr) assert_equal(88, + nr) - assert_equal(88, --+ nr) - assert_equal(88, - - nr) + + var lines =<< trim END + var n = 12 + echo ++n + END + CheckDefAndScriptFailure(lines, 'E15:') + lines =<< trim END + var n = 12 + echo --n + END + CheckDefAndScriptFailure(lines, 'E15:') + lines =<< trim END + var n = 12 + echo +-n + END + CheckDefAndScriptFailure(lines, 'E15:') + lines =<< trim END + var n = 12 + echo -+n + END + CheckDefAndScriptFailure(lines, 'E15:') + lines =<< trim END + var n = 12 + echo - -n + END + CheckDefAndScriptFailure(lines, 'E15:') + lines =<< trim END + var n = 12 + echo + +n + END + CheckDefAndScriptFailure(lines, 'E15:') + + lines =<< trim END + var n = 12 + :1 + ++n + END + CheckDefAndScriptFailure(lines, 'E1050:') + lines =<< trim END + var n = 12 + :1 + --n + END + CheckDefAndScriptFailure(lines, 'E1050:') enddef def Echo(arg: any): string @@ -2573,7 +2600,7 @@ def Test_expr7_call() var lines =<< trim END assert_equal('yes', 'yes'->Echo()) assert_equal(true, !range(5)->empty()) - assert_equal([0, 1, 2], --3->range()) + assert_equal([0, 1, 2], 3->range()) END CheckDefAndScriptSuccess(lines) diff --git a/src/version.c b/src/version.c index 77f032db02..0e711ed4c8 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2305, +/**/ 2304, /**/ 2303, diff --git a/src/vim9compile.c b/src/vim9compile.c index 67307f8a93..9810f410ad 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -3887,8 +3887,8 @@ compile_expr7( * Skip '!', '-' and '+' characters. They are handled later. */ start_leader = *arg; - while (**arg == '!' || **arg == '-' || **arg == '+') - *arg = skipwhite(*arg + 1); + if (eval_leader(arg, TRUE) == FAIL) + return FAIL; end_leader = *arg; rettv->v_type = VAR_UNKNOWN; |