]> granicus.if.org Git - vim/commitdiff
patch 8.2.0659: Vim9: no test for equal func type v8.2.0659
authorBram Moolenaar <Bram@vim.org>
Tue, 28 Apr 2020 20:49:08 +0000 (22:49 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 28 Apr 2020 20:49:08 +0000 (22:49 +0200)
Problem:    Vim9: no test for equal func type.
Solution:   Add a test.  Improve type check.

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c

index ace3d2f2560a0a34f0434e428ca3c10ef4c1e827..ef5c00ccd75ba775800f1d77fe8b659d23fdd579 100644 (file)
@@ -30,6 +30,16 @@ def Test_expr1()
   assert_equal('two', {} ? 'one' : 'two')
   var = 0
   assert_equal('two', var ? 'one' : 'two')
+
+  let Some: func = function('len')
+  let Other: func = function('winnr')
+  let Res: func = g:atrue ? Some : Other
+  assert_equal(function('len'), Res)
+
+  let RetOne: func(string): number = function('len')
+  let RetTwo: func(string): number = function('winnr')
+  let RetThat: func = g:atrue ? RetOne : RetTwo
+  assert_equal(function('len'), RetThat)
 enddef
 
 func Test_expr1_fails()
index 127f9062911b410bdf4186dd1e41360f7cac42cb..d3a1b0b7fee38a60ee8cf7b734985d1368430137 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    659,
 /**/
     658,
 /**/
index aa3cd07d3d1fff295877df313891871e0400517a..7b433a3b158dc12dbce95dc33ede0b9cbc702339 100644 (file)
@@ -724,7 +724,8 @@ generate_TYPECHECK(cctx_T *cctx, type_T *vartype, int offset)
     RETURN_OK_IF_SKIP(cctx);
     if ((isn = generate_instr(cctx, ISN_CHECKTYPE)) == NULL)
        return FAIL;
-    isn->isn_arg.type.ct_type = vartype->tt_type;  // TODO: whole type
+    // TODO: whole type, e.g. for a function also arg and return types
+    isn->isn_arg.type.ct_type = vartype->tt_type;
     isn->isn_arg.type.ct_off = offset;
 
     // type becomes vartype
@@ -2594,6 +2595,7 @@ arg_type_mismatch(type_T *expected, type_T *actual, int argidx)
 
 /*
  * Check if the expected and actual types match.
+ * Does not allow for assigning "any" to a specific type.
  */
     static int
 check_type(type_T *expected, type_T *actual, int give_msg)
@@ -2603,7 +2605,8 @@ check_type(type_T *expected, type_T *actual, int give_msg)
     // When expected is "unknown" we accept any actual type.
     // When expected is "any" we accept any actual type except "void".
     if (expected->tt_type != VAR_UNKNOWN
-           && (expected->tt_type != VAR_ANY || actual->tt_type == VAR_VOID))
+           && !(expected->tt_type == VAR_ANY && actual->tt_type != VAR_VOID))
+
     {
        if (expected->tt_type != actual->tt_type)
        {
@@ -2643,7 +2646,10 @@ need_type(type_T *actual, type_T *expected, int offset, cctx_T *cctx)
 {
     if (check_type(expected, actual, FALSE) == OK)
        return OK;
-    if (actual->tt_type != VAR_ANY && actual->tt_type != VAR_UNKNOWN)
+    if (actual->tt_type != VAR_ANY
+           && actual->tt_type != VAR_UNKNOWN
+           && !(actual->tt_type == VAR_FUNC
+               && (actual->tt_member == &t_any || actual->tt_argcount < 0)))
     {
        type_mismatch(expected, actual);
        return FAIL;