# HG changeset patch # User Bram Moolenaar # Date 1603390503 -7200 # Node ID 5cbcd3768125912f82a282a561085bc4f158e811 # Parent 42790e1a64a92ee120752dd5b2d6d5e51a6e2187 patch 8.2.1890: Vim9: strange error for subtracting from a list Commit: https://github.com/vim/vim/commit/081db1a66d17e46ac3b03b7514f11a004a35009a Author: Bram Moolenaar Date: Thu Oct 22 20:09:43 2020 +0200 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 https://github.com/vim/vim/issues/7167) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -2679,6 +2679,9 @@ eval4(char_u **arg, typval_T *rettv, eva 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 *tv } } +/* + * 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, eva #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, eva // 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 --- 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 --- 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,