Patch 8.2.0552
Problem:    Vim9: some errors not covered by tests.
Solution:   Add more tests.  Check Funcref argument types.
Files:      src/vim9compile.c, src/testdir/test_vim9_func.vim


*** ../vim-8.2.0551/src/vim9compile.c   2020-04-11 23:17:13.907173700 +0200
--- src/vim9compile.c   2020-04-12 14:36:09.607355407 +0200
***************
*** 1746,1751 ****
--- 1746,1753 ----
      static int
  equal_type(type_T *type1, type_T *type2)
  {
+     int i;
+ 
      if (type1->tt_type != type2->tt_type)
        return FALSE;
      switch (type1->tt_type)
***************
*** 1767,1775 ****
            return equal_type(type1->tt_member, type2->tt_member);
        case VAR_FUNC:
        case VAR_PARTIAL:
!           // TODO; check argument types.
!           return equal_type(type1->tt_member, type2->tt_member)
!               && type1->tt_argcount == type2->tt_argcount;
      }
      return TRUE;
  }
--- 1769,1784 ----
            return equal_type(type1->tt_member, type2->tt_member);
        case VAR_FUNC:
        case VAR_PARTIAL:
!           if (!equal_type(type1->tt_member, type2->tt_member)
!                   || type1->tt_argcount != type2->tt_argcount)
!               return FALSE;
!           if (type1->tt_argcount < 0
!                          || type1->tt_args == NULL || type2->tt_args == NULL)
!               return TRUE;
!           for (i = 0; i < type1->tt_argcount; ++i)
!               if (!equal_type(type1->tt_args[i], type2->tt_args[i]))
!                   return FALSE;
!           return TRUE;
      }
      return TRUE;
  }
***************
*** 1800,1807 ****
                *dest = get_dict_type(common, type_gap);
            return;
        }
!       // TODO: VAR_FUNC and VAR_PARTIAL
!       *dest = type1;
      }
  
      *dest = &t_any;
--- 1809,1839 ----
                *dest = get_dict_type(common, type_gap);
            return;
        }
!       if (type1->tt_type == VAR_FUNC)
!       {
!           type_T *common;
! 
!           common_type(type1->tt_member, type2->tt_member, &common, type_gap);
!           if (type1->tt_argcount == type2->tt_argcount
!                                                   && type1->tt_argcount >= 0)
!           {
!               int argcount = type1->tt_argcount;
!               int i;
! 
!               *dest = alloc_func_type(common, argcount, type_gap);
!               if (type1->tt_args != NULL && type2->tt_args != NULL)
!               {
!                   (*dest)->tt_args = ALLOC_CLEAR_MULT(type_T *, argcount);
!                   if ((*dest)->tt_args != NULL)
!                       for (i = 0; i < argcount; ++i)
!                           common_type(type1->tt_args[i], type2->tt_args[i],
!                                              &(*dest)->tt_args[i], type_gap);
!               }
!           }
!           else
!               *dest = alloc_func_type(common, -1, type_gap);
!           return;
!       }
      }
  
      *dest = &t_any;
*** ../vim-8.2.0551/src/testdir/test_vim9_func.vim      2020-04-11 
23:17:13.907173700 +0200
--- src/testdir/test_vim9_func.vim      2020-04-12 14:28:17.960748446 +0200
***************
*** 96,101 ****
--- 96,102 ----
    assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
  
    call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 
'E1001:')
+   call CheckScriptFailure(['def Func(arg: number = "text")', 'enddef'], 
'E1013: argument 1: type mismatch, expected number but got string')
  enddef
  
  func Test_call_default_args_from_func()
***************
*** 196,201 ****
--- 197,222 ----
    call assert_fails('call NotDefined("one")', 'E117:')
  enddef
  
+ def CombineFuncrefTypes()
+   " same arguments, different return type
+   let Ref1: func(bool): string
+   let Ref2: func(bool): number
+   let Ref3: func(bool): any
+   Ref3 = g:cond ? Ref1 : Ref2
+ 
+   " different number of arguments
+   let Refa1: func(bool): number
+   let Refa2: func(bool, number): number
+   let Refa3: func: number
+   Refa3 = g:cond ? Refa1 : Refa2
+ 
+   " different argument types
+   let Refb1: func(bool, string): number
+   let Refb2: func(string, number): number
+   let Refb3: func(any, any): number
+   Refb3 = g:cond ? Refb1 : Refb2
+ enddef
+ 
  func DefinedLater(arg)
    return a:arg
  endfunc
*** ../vim-8.2.0551/src/version.c       2020-04-12 13:50:22.832171856 +0200
--- src/version.c       2020-04-12 14:08:02.981119988 +0200
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     552,
  /**/

-- 
FATAL ERROR! SYSTEM HALTED! - Press any key to continue doing nothing.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202004121240.03CCeHNA010065%40masaka.moolenaar.net.

Raspunde prin e-mail lui