diff --git a/src/eval.c b/src/eval.c index 9ef3128638b7d..bb402dee94d04 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 9b5b4ff2e41a4..568c3bf6a4a74 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 97f9cba2fcc12..2340ab8d1fd5f 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1890, /**/ 1889, /**/