changeset 26765:e5fdd48c442b v8.2.3911

patch 8.2.3911: Vim9: type check for filter() does not accept unknown Commit: https://github.com/vim/vim/commit/ef8f04b1d1daf2e0be8fa38dedcae84ebfc5ffb4 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Dec 27 12:29:19 2021 +0000 patch 8.2.3911: Vim9: type check for filter() does not accept unknown Problem: Vim9: type check for filter() does not accept unknown. Solution: Also accept unknown for the return type. (closes https://github.com/vim/vim/issues/9413)
author Bram Moolenaar <Bram@vim.org>
date Mon, 27 Dec 2021 13:30:03 +0100
parents dc416a3203d1
children a91c9f5d52d9
files src/evalfunc.c src/testdir/test_vim9_builtin.vim src/version.c
diffstat 3 files changed, 9 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -494,6 +494,7 @@ arg_filter_func(type_T *type, argcontext
     if (type->tt_type == VAR_FUNC
 	    && !(type->tt_member->tt_type == VAR_BOOL
 		|| type->tt_member->tt_type == VAR_NUMBER
+		|| type->tt_member->tt_type == VAR_UNKNOWN
 		|| type->tt_member->tt_type == VAR_ANY))
     {
 	arg_type_mismatch(&t_func_bool, type, context->arg_idx + 1);
--- a/src/testdir/test_vim9_builtin.vim
+++ b/src/testdir/test_vim9_builtin.vim
@@ -1253,6 +1253,12 @@ def Test_filter()
   assert_equal([], filter([1, 2, 3], '0'))
   assert_equal([1, 2, 3], filter([1, 2, 3], '1'))
   assert_equal({b: 20}, filter({a: 10, b: 20}, 'v:val == 20'))
+
+  def GetFiltered(): list<number>
+    var Odd: func = (_, v) => v % 2
+    return range(3)->filter(Odd)
+  enddef
+  assert_equal([1], GetFiltered())
 enddef
 
 def Test_filter_wrong_dict_key_type()
--- 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 */
 /**/
+    3911,
+/**/
     3910,
 /**/
     3909,