To: vim_dev@googlegroups.com Subject: Patch 8.2.2305 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2305 Problem: Vim9: "++var" and "--var" are silently accepted. Solution: Give an error message. Files: src/vim9compile.c, src/eval.c, src/proto/eval.pro, src/testdir/test_vim9_expr.vim *** ../vim-8.2.2304/src/vim9compile.c 2021-01-05 19:23:25.084642157 +0100 --- src/vim9compile.c 2021-01-05 21:59:49.355270443 +0100 *************** *** 3887,3894 **** * Skip '!', '-' and '+' characters. They are handled later. */ start_leader = *arg; ! while (**arg == '!' || **arg == '-' || **arg == '+') ! *arg = skipwhite(*arg + 1); end_leader = *arg; rettv->v_type = VAR_UNKNOWN; --- 3887,3894 ---- * Skip '!', '-' and '+' characters. They are handled later. */ start_leader = *arg; ! if (eval_leader(arg, TRUE) == FAIL) ! return FAIL; end_leader = *arg; rettv->v_type = VAR_UNKNOWN; *** ../vim-8.2.2304/src/eval.c 2021-01-03 22:05:15.803884248 +0100 --- src/eval.c 2021-01-05 21:59:54.459255989 +0100 *************** *** 3188,3193 **** --- 3188,3215 ---- 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,3250 **** * Skip '!', '-' and '+' characters. They are handled later. */ start_leader = *arg; ! while (**arg == '!' || **arg == '-' || **arg == '+') ! *arg = skipwhite(*arg + 1); end_leader = *arg; if (**arg == '.' && (!isdigit(*(*arg + 1)) --- 3265,3272 ---- * Skip '!', '-' and '+' characters. They are handled later. */ start_leader = *arg; ! if (eval_leader(arg, in_vim9script()) == FAIL) ! return FAIL; end_leader = *arg; if (**arg == '.' && (!isdigit(*(*arg + 1)) *** ../vim-8.2.2304/src/proto/eval.pro 2020-12-22 12:20:04.541293877 +0100 --- src/proto/eval.pro 2021-01-05 21:59:57.303247918 +0100 *************** *** 39,44 **** --- 39,45 ---- 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); *** ../vim-8.2.2304/src/testdir/test_vim9_expr.vim 2021-01-05 17:50:24.741302345 +0100 --- src/testdir/test_vim9_expr.vim 2021-01-05 22:05:04.694366617 +0100 *************** *** 2516,2526 **** 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) enddef def Test_expr7_parens_vim9script() --- 2516,2523 ---- assert_equal(6, +6) assert_equal(-6, -6) assert_equal(false, !-3) ! assert_equal(true, !+0) enddef def Test_expr7_parens_vim9script() *************** *** 2539,2564 **** 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) enddef def Echo(arg: any): string --- 2536,2591 ---- def Test_expr7_negate_add() 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) ! ! 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,2579 **** var lines =<< trim END assert_equal('yes', 'yes'->Echo()) assert_equal(true, !range(5)->empty()) ! assert_equal([0, 1, 2], --3->range()) END CheckDefAndScriptSuccess(lines) --- 2600,2606 ---- var lines =<< trim END assert_equal('yes', 'yes'->Echo()) assert_equal(true, !range(5)->empty()) ! assert_equal([0, 1, 2], 3->range()) END CheckDefAndScriptSuccess(lines) *** ../vim-8.2.2304/src/version.c 2021-01-05 20:58:20.855037677 +0100 --- src/version.c 2021-01-05 21:37:01.354745571 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2305, /**/ -- From "know your smileys": |-( Contact lenses, but has lost them /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///