diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-10-22 20:09:43 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-10-22 20:09:43 +0200 |
commit | 081db1a66d17e46ac3b03b7514f11a004a35009a (patch) | |
tree | 4861bbd2c22bb95de40ae1c4a983c9ccf2cb61a7 | |
parent | b07a39de485db5709a6b3e2f96e66ab06dd76279 (diff) | |
download | vim-git-081db1a66d17e46ac3b03b7514f11a004a35009a.tar.gz |
patch 8.2.1890: Vim9: strange error for subtracting from a listv8.2.1890
Problem: Vim9: strange error for subtracting from a list.
Solution: Check getting a number, not a string. (closes #7167)
-rw-r--r-- | src/eval.c | 14 | ||||
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 14 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 27 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c index 9ef312863..bb402dee9 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2679,6 +2679,9 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg) return OK; } +/* + * Make a copy of blob "tv1" and append blob "tv2". + */ void eval_addblob(typval_T *tv1, typval_T *tv2) { @@ -2699,6 +2702,9 @@ eval_addblob(typval_T *tv1, typval_T *tv2) } } +/* + * Make a copy of list "tv1" and append list "tv2". + */ int eval_addlist(typval_T *tv1, typval_T *tv2) { @@ -2777,8 +2783,10 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg) #ifdef FEAT_FLOAT && (op == '.' || rettv->v_type != VAR_FLOAT) #endif - ) + && evaluate) { + int error = FALSE; + // For "list + ...", an illegal use of the first operand as // a number cannot be determined before evaluating the 2nd // operand: if this is also a list, all is ok. @@ -2786,7 +2794,9 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg) // we know that the first operand needs to be a string or number // without evaluating the 2nd operand. So check before to avoid // side effects after an error. - if (evaluate && tv_get_string_chk(rettv) == NULL) + if (op != '.') + tv_get_number_chk(rettv, &error); + if ((op == '.' && tv_get_string_chk(rettv) == NULL) || error) { clear_tv(rettv); return FAIL; diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index 9b5b4ff2e..568c3bf6a 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1128,7 +1128,19 @@ def Test_expr5_vim9script() vim9script echo {} - 22 END - CheckScriptFailure(lines, 'E731:', 2) + CheckScriptFailure(lines, 'E728:', 2) + + lines =<< trim END + vim9script + echo [] - 33 + END + CheckScriptFailure(lines, 'E745:', 2) + + lines =<< trim END + vim9script + echo 0z1234 - 44 + END + CheckScriptFailure(lines, 'E974:', 2) lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c index 97f9cba2f..2340ab8d1 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 */ /**/ + 1890, +/**/ 1889, /**/ 1888, |