From: Bram Moolenaar Date: Tue, 5 Jan 2021 21:08:20 +0000 (+0100) Subject: patch 8.2.2305: Vim9: "++var" and "--var" are silently accepted X-Git-Tag: v8.2.2305 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b23279d7a2d28de5df942924b77cf23672fc684f;p=vim patch 8.2.2305: Vim9: "++var" and "--var" are silently accepted Problem: Vim9: "++var" and "--var" are silently accepted. Solution: Give an error message. --- diff --git a/src/eval.c b/src/eval.c index 571e96f70..02cfd7d7d 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 8fa908c5c..ec453645a 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 d835f04a9..ae5ca2816 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 77f032db0..0e711ed4c 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2305, /**/ 2304, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 67307f8a9..9810f410a 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;