summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-02-04 22:07:16 +0100
committerBram Moolenaar <Bram@vim.org>2021-02-04 22:07:16 +0100
commitab65fc77c5389f7d3f788bbdc3d931561feab131 (patch)
tree7ab784099432a7f4719ee667ffbf00a199a87979 /src
parent92bb83e41ca42d0d00d21753810d92485c808a50 (diff)
downloadvim-git-ab65fc77c5389f7d3f788bbdc3d931561feab131.tar.gz
patch 8.2.2466: max() and min() can give many error messagesv8.2.2466
Problem: Max() and min() can give many error messages. Solution: Bail out at the first error. (closes #1039, closes #7778)
Diffstat (limited to 'src')
-rw-r--r--src/evalfunc.c9
-rw-r--r--src/testdir/test_functions.vim8
-rw-r--r--src/version.c2
3 files changed, 18 insertions, 1 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 0b4b5021a..f15139f36 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6769,12 +6769,16 @@ max_min(typval_T *argvars, typval_T *rettv, int domax)
if (li != NULL)
{
n = tv_get_number_chk(&li->li_tv, &error);
+ if (error)
+ return; // type error; errmsg already given
for (;;)
{
li = li->li_next;
if (li == NULL)
break;
i = tv_get_number_chk(&li->li_tv, &error);
+ if (error)
+ return; // type error; errmsg already given
if (domax ? i > n : i < n)
n = i;
}
@@ -6799,6 +6803,8 @@ max_min(typval_T *argvars, typval_T *rettv, int domax)
{
--todo;
i = tv_get_number_chk(&HI2DI(hi)->di_tv, &error);
+ if (error)
+ return; // type error; errmsg already given
if (first)
{
n = i;
@@ -6812,7 +6818,8 @@ max_min(typval_T *argvars, typval_T *rettv, int domax)
}
else
semsg(_(e_listdictarg), domax ? "max()" : "min()");
- rettv->vval.v_number = error ? 0 : n;
+
+ rettv->vval.v_number = n;
}
/*
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index b82f72fd0..64afe5481 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -124,6 +124,10 @@ func Test_max()
call assert_fails('call max(1)', 'E712:')
call assert_fails('call max(v:none)', 'E712:')
+
+ " check we only get one error
+ call assert_fails('call max([#{}, [1]])', ['E728:', 'E728:'])
+ call assert_fails('call max(#{a: {}, b: [1]})', ['E728:', 'E728:'])
endfunc
func Test_min()
@@ -137,6 +141,10 @@ func Test_min()
call assert_fails('call min(1)', 'E712:')
call assert_fails('call min(v:none)', 'E712:')
+
+ " check we only get one error
+ call assert_fails('call min([[1], #{}])', ['E745:', 'E745:'])
+ call assert_fails('call min(#{a: [1], b: #{}})', ['E745:', 'E745:'])
endfunc
func Test_strwidth()
diff --git a/src/version.c b/src/version.c
index 7f672301e..0ea7fb449 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 */
/**/
+ 2466,
+/**/
2465,
/**/
2464,