From 081db1a66d17e46ac3b03b7514f11a004a35009a Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 22 Oct 2020 20:09:43 +0200 Subject: [PATCH] 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) --- src/eval.c | 14 ++++++++++++-- src/testdir/test_vim9_expr.vim | 14 +++++++++++++- 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 @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1890, /**/ 1889, /**/ -- 2.50.1