]> granicus.if.org Git - vim/commitdiff
patch 8.2.3104: Vim9: unspecified function type causes type error v8.2.3104
authorBram Moolenaar <Bram@vim.org>
Sun, 4 Jul 2021 16:28:15 +0000 (18:28 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 4 Jul 2021 16:28:15 +0000 (18:28 +0200)
Problem:    Vim9: unspecified function type causes type error.
Solution:   Don't check type when min_argcount is negative. (issue #8492)

src/globals.h
src/testdir/test_vim9_assign.vim
src/version.c
src/vim9type.c

index dd24cbbae32b8d2c6bead4fa06ea6ff5da66c6ab..b6076df5bb820e154d95056ad3f2683e1a495559 100644 (file)
@@ -421,7 +421,7 @@ EXTERN type_T t_channel INIT6(VAR_CHANNEL, 0, 0, TTFLAG_STATIC, NULL, NULL);
 // 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);
index 92ffa0055c2b55c7e6967fce9847b5c25c0b2b96..5f5b5d740aa3a00f9c5ac434b182f80d0499f069 100644 (file)
@@ -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, _]
index a9c29582a25986e4b8736e067037081683d30f63..1f2b18f0f4466a309b134df33dc66058a44756e6 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3104,
 /**/
     3103,
 /**/
index c92e063bb131df3f40015dcac3d64402a469bf1a..b34940447d9c5926e61d4baa11533a78b1357c1e 100644 (file)
@@ -526,6 +526,7 @@ check_type(type_T *expected, type_T *actual, int give_msg, where_T where)
                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)))