Patch 8.2.2305

2 views
Skip to first unread message

Bram Moolenaar

unread,
Jan 5, 2021, 4:08:59 PM1/5/21
to vim...@googlegroups.com

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 -- Br...@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 ///
Reply all
Reply to author
Forward
0 new messages