changeset 25135:5731bcaaabcb v8.2.3104

patch 8.2.3104: Vim9: unspecified function type causes type error Commit: https://github.com/vim/vim/commit/b7480cd8931fa1696265f75c7d4d9fdf0be69e12 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jul 4 18:28:15 2021 +0200 patch 8.2.3104: Vim9: unspecified function type causes type error Problem: Vim9: unspecified function type causes type error. Solution: Don't check type when min_argcount is negative. (issue https://github.com/vim/vim/issues/8492)
author Bram Moolenaar <Bram@vim.org>
date Sun, 04 Jul 2021 18:30:03 +0200
parents 2edd38379795
children d838f9187c57
files src/globals.h src/testdir/test_vim9_assign.vim src/version.c src/vim9type.c
diffstat 4 files changed, 13 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/globals.h
+++ b/src/globals.h
@@ -421,7 +421,7 @@ EXTERN type_T t_channel INIT6(VAR_CHANNE
 // Special value used for @#.
 EXTERN type_T t_number_or_string INIT6(VAR_STRING, 0, 0, TTFLAG_STATIC, NULL, NULL);
 
-EXTERN type_T t_func_unknown INIT6(VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_unknown, NULL);
+EXTERN type_T t_func_unknown INIT6(VAR_FUNC, -1, -1, TTFLAG_STATIC, &t_unknown, NULL);
 EXTERN type_T t_func_void INIT6(VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_void, NULL);
 EXTERN type_T t_func_any INIT6(VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_any, NULL);
 EXTERN type_T t_func_number INIT6(VAR_FUNC, -1, 0, TTFLAG_STATIC, &t_number, NULL);
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -661,6 +661,15 @@ def Test_assignment_list()
   CheckDefExecAndScriptFailure(lines, 'E1012:', 5)
 enddef
 
+def PartFunc(b: bool): string
+  return 'done'
+enddef
+
+def Test_assignment_partial()
+  var Partial: func(): string = function(PartFunc, [true])
+  assert_equal('done', Partial())
+enddef
+
 def Test_assignment_list_any_index()
    var l: list<number> = [1, 2]
   for  [x, y, _]
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3104,
+/**/
     3103,
 /**/
     3102,
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -526,6 +526,7 @@ check_type(type_T *expected, type_T *act
 		ret = check_type(expected->tt_member, actual->tt_member,
 								 FALSE, where);
 	    if (ret == OK && expected->tt_argcount != -1
+		    && actual->tt_min_argcount != -1
 		    && (actual->tt_argcount == -1
 			|| (actual->tt_argcount < expected->tt_min_argcount
 			    || actual->tt_argcount > expected->tt_argcount)))