0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.1890: Vim9: strange error for subtracting from a list

Problem:    Vim9: strange error for subtracting from a list.
Solution:   Check getting a number, not a string. (closes #7167)
This commit is contained in:
Bram Moolenaar 2020-10-22 20:09:43 +02:00
parent b07a39de48
commit 081db1a66d
3 changed files with 27 additions and 3 deletions

View File

@ -2679,6 +2679,9 @@ eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
return OK; return OK;
} }
/*
* Make a copy of blob "tv1" and append blob "tv2".
*/
void void
eval_addblob(typval_T *tv1, typval_T *tv2) 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 int
eval_addlist(typval_T *tv1, typval_T *tv2) 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 #ifdef FEAT_FLOAT
&& (op == '.' || rettv->v_type != VAR_FLOAT) && (op == '.' || rettv->v_type != VAR_FLOAT)
#endif #endif
) && evaluate)
{ {
int error = FALSE;
// For "list + ...", an illegal use of the first operand as // For "list + ...", an illegal use of the first operand as
// a number cannot be determined before evaluating the 2nd // a number cannot be determined before evaluating the 2nd
// operand: if this is also a list, all is ok. // 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 // we know that the first operand needs to be a string or number
// without evaluating the 2nd operand. So check before to avoid // without evaluating the 2nd operand. So check before to avoid
// side effects after an error. // 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); clear_tv(rettv);
return FAIL; return FAIL;

View File

@ -1128,7 +1128,19 @@ def Test_expr5_vim9script()
vim9script vim9script
echo {} - 22 echo {} - 22
END 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 lines =<< trim END
vim9script vim9script

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1890,
/**/ /**/
1889, 1889,
/**/ /**/