changeset 23849:a45a922832d4 v8.2.2466

patch 8.2.2466: max() and min() can give many error messages Commit: https://github.com/vim/vim/commit/ab65fc77c5389f7d3f788bbdc3d931561feab131 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Feb 4 22:07:16 2021 +0100 patch 8.2.2466: max() and min() can give many error messages Problem: Max() and min() can give many error messages. Solution: Bail out at the first error. (closes https://github.com/vim/vim/issues/1039, closes https://github.com/vim/vim/issues/7778)
author Bram Moolenaar <Bram@vim.org>
date Thu, 04 Feb 2021 22:15:04 +0100
parents 32338a4fdfa8
children e3e337ea300b
files src/evalfunc.c src/testdir/test_functions.vim src/version.c
diffstat 3 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6769,12 +6769,16 @@ max_min(typval_T *argvars, typval_T *ret
 		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 *ret
 		{
 		    --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 *ret
     }
     else
 	semsg(_(e_listdictarg), domax ? "max()" : "min()");
-    rettv->vval.v_number = error ? 0 : n;
+
+    rettv->vval.v_number = n;
 }
 
 /*
--- 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()
--- 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,