Patch 8.2.3249
Problem:    Vim9: error for re-imported function with default argument.
Solution:   Do not check argument type if it is still unknown. (closes #8653)
Files:      src/vim9type.c, src/proto/vim9type.pro, src/vim9script.c,
            src/vim.h, src/eval.c, src/vim9execute.c,
            src/testdir/test_vim9_script.vim


*** ../vim-8.2.3248/src/vim9type.c      2021-07-22 14:58:43.473967313 +0200
--- src/vim9type.c      2021-07-29 22:39:16.524448095 +0200
***************
*** 954,962 ****
  
  /*
   * Check if "type1" and "type2" are exactly the same.
   */
      int
! equal_type(type_T *type1, type_T *type2)
  {
      int i;
  
--- 954,964 ----
  
  /*
   * Check if "type1" and "type2" are exactly the same.
+  * "flags" can have ETYPE_ARG_UNKNOWN, which means that an unknown argument
+  * type in "type1" is accepted.
   */
      int
! equal_type(type_T *type1, type_T *type2, int flags)
  {
      int i;
  
***************
*** 981,997 ****
            break;  // not composite is always OK
        case VAR_LIST:
        case VAR_DICT:
!           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;
      }
--- 983,1001 ----
            break;  // not composite is always OK
        case VAR_LIST:
        case VAR_DICT:
!           return equal_type(type1->tt_member, type2->tt_member, flags);
        case VAR_FUNC:
        case VAR_PARTIAL:
!           if (!equal_type(type1->tt_member, type2->tt_member, flags)
                    || 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 ((flags & ETYPE_ARG_UNKNOWN) == 0
!                       && !equal_type(type1->tt_args[i], type2->tt_args[i],
!                                                                       flags))
                    return FALSE;
            return TRUE;
      }
***************
*** 1005,1011 ****
      void
  common_type(type_T *type1, type_T *type2, type_T **dest, garray_T *type_gap)
  {
!     if (equal_type(type1, type2))
      {
        *dest = type1;
        return;
--- 1009,1015 ----
      void
  common_type(type_T *type1, type_T *type2, type_T **dest, garray_T *type_gap)
  {
!     if (equal_type(type1, type2, 0))
      {
        *dest = type1;
        return;
*** ../vim-8.2.3248/src/proto/vim9type.pro      2021-07-22 14:58:43.473967313 
+0200
--- src/proto/vim9type.pro      2021-07-29 22:37:18.052707704 +0200
***************
*** 20,26 ****
  int check_argument_types(type_T *type, typval_T *argvars, int argcount, 
char_u *name);
  char_u *skip_type(char_u *start, int optional);
  type_T *parse_type(char_u **arg, garray_T *type_gap, int give_error);
! int equal_type(type_T *type1, type_T *type2);
  void common_type(type_T *type1, type_T *type2, type_T **dest, garray_T 
*type_gap);
  type_T *get_member_type_from_stack(type_T **stack_top, int count, int skip, 
garray_T *type_gap);
  char *vartype_name(vartype_T type);
--- 20,26 ----
  int check_argument_types(type_T *type, typval_T *argvars, int argcount, 
char_u *name);
  char_u *skip_type(char_u *start, int optional);
  type_T *parse_type(char_u **arg, garray_T *type_gap, int give_error);
! int equal_type(type_T *type1, type_T *type2, int flags);
  void common_type(type_T *type1, type_T *type2, type_T **dest, garray_T 
*type_gap);
  type_T *get_member_type_from_stack(type_T **stack_top, int count, int skip, 
garray_T *type_gap);
  char *vartype_name(vartype_T type);
*** ../vim-8.2.3248/src/vim9script.c    2021-07-29 22:25:01.894202718 +0200
--- src/vim9script.c    2021-07-29 22:42:50.363945997 +0200
***************
*** 623,631 ****
                    && (imported->imp_flags & IMP_FLAGS_RELOAD)
                    && imported->imp_sid == sid
                    && (idx >= 0
!                       ? (equal_type(imported->imp_type, type)
                            && imported->imp_var_vals_idx == idx)
!                       : (equal_type(imported->imp_type, ufunc->uf_func_type)
                            && STRCMP(imported->imp_funcname,
                                                        ufunc->uf_name) == 0)))
            {
--- 623,632 ----
                    && (imported->imp_flags & IMP_FLAGS_RELOAD)
                    && imported->imp_sid == sid
                    && (idx >= 0
!                       ? (equal_type(imported->imp_type, type, 0)
                            && imported->imp_var_vals_idx == idx)
!                       : (equal_type(imported->imp_type, ufunc->uf_func_type,
!                                                            ETYPE_ARG_UNKNOWN)
                            && STRCMP(imported->imp_funcname,
                                                        ufunc->uf_name) == 0)))
            {
*** ../vim-8.2.3248/src/vim.h   2021-07-29 20:37:45.656199169 +0200
--- src/vim.h   2021-07-29 22:37:46.616648365 +0200
***************
*** 2736,2739 ****
--- 2736,2742 ----
  // Maximum number of characters that can be fuzzy matched
  #define MAX_FUZZY_MATCHES     256
  
+ // flags for equal_type()
+ #define ETYPE_ARG_UNKNOWN 1
+ 
  #endif // VIM__H
*** ../vim-8.2.3248/src/eval.c  2021-07-27 22:00:39.741712405 +0200
--- src/eval.c  2021-07-29 22:35:32.660926036 +0200
***************
*** 3359,3365 ****
        {
            type_T *actual = typval2type(rettv, get_copyID(), &type_list, TRUE);
  
!           if (!equal_type(want_type, actual))
            {
                if (want_type == &t_bool && actual != &t_bool
                                        && (actual->tt_flags & TTFLAG_BOOL_OK))
--- 3359,3365 ----
        {
            type_T *actual = typval2type(rettv, get_copyID(), &type_list, TRUE);
  
!           if (!equal_type(want_type, actual, 0))
            {
                if (want_type == &t_bool && actual != &t_bool
                                        && (actual->tt_flags & TTFLAG_BOOL_OK))
*** ../vim-8.2.3248/src/vim9execute.c   2021-07-24 19:32:07.800733149 +0200
--- src/vim9execute.c   2021-07-29 22:35:57.860873906 +0200
***************
*** 1271,1277 ****
        return NULL;
      }
      sv = ((svar_T *)si->sn_var_vals.ga_data) + sref->sref_idx;
!     if (!equal_type(sv->sv_type, sref->sref_type))
      {
        emsg(_(e_script_variable_type_changed));
        return NULL;
--- 1271,1277 ----
        return NULL;
      }
      sv = ((svar_T *)si->sn_var_vals.ga_data) + sref->sref_idx;
!     if (!equal_type(sv->sv_type, sref->sref_type, 0))
      {
        emsg(_(e_script_variable_type_changed));
        return NULL;
*** ../vim-8.2.3248/src/testdir/test_vim9_script.vim    2021-07-29 
22:25:01.894202718 +0200
--- src/testdir/test_vim9_script.vim    2021-07-29 22:42:35.383980641 +0200
***************
*** 1626,1631 ****
--- 1626,1634 ----
    var lines =<< trim END
      vim9script
      export var exported = 'thexport'
+ 
+     export def TheFunc(x = 0)
+     enddef
    END
    writefile(lines, 'XExportReload')
    lines =<< trim END
***************
*** 1638,1643 ****
--- 1641,1649 ----
        return 'again'
      enddef
  
+     import TheFunc from './XExportReload'
+     TheFunc()
+ 
      if exists('s:loaded') | finish | endif
      var s:loaded = true
  
*** ../vim-8.2.3248/src/version.c       2021-07-29 22:25:01.898202709 +0200
--- src/version.c       2021-07-29 22:34:32.421050401 +0200
***************
*** 757,758 ****
--- 757,760 ----
  {   /* Add new patch number below this line */
+ /**/
+     3249,
  /**/

-- 
This is an airconditioned room, do not open Windows.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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/202107292049.16TKnLPn2243094%40masaka.moolenaar.net.

Raspunde prin e-mail lui