summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-10-22 20:09:43 +0200
committerBram Moolenaar <Bram@vim.org>2020-10-22 20:09:43 +0200
commit081db1a66d17e46ac3b03b7514f11a004a35009a (patch)
tree4861bbd2c22bb95de40ae1c4a983c9ccf2cb61a7
parentb07a39de485db5709a6b3e2f96e66ab06dd76279 (diff)
downloadvim-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.c14
-rw-r--r--src/testdir/test_vim9_expr.vim14
-rw-r--r--src/version.c2
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,