1
0
forked from aniani/vim

patch 8.2.3249: Vim9: error for re-imported function with default argument

Problem:    Vim9: error for re-imported function with default argument.
Solution:   Do not check argument type if it is still unknown. (closes #8653)
This commit is contained in:
Bram Moolenaar
2021-07-29 22:48:54 +02:00
parent 921ba52926
commit 60dc8274e9
8 changed files with 26 additions and 10 deletions

View File

@@ -3359,7 +3359,7 @@ eval7t(
{ {
type_T *actual = typval2type(rettv, get_copyID(), &type_list, TRUE); type_T *actual = typval2type(rettv, get_copyID(), &type_list, TRUE);
if (!equal_type(want_type, actual)) if (!equal_type(want_type, actual, 0))
{ {
if (want_type == &t_bool && actual != &t_bool if (want_type == &t_bool && actual != &t_bool
&& (actual->tt_flags & TTFLAG_BOOL_OK)) && (actual->tt_flags & TTFLAG_BOOL_OK))

View File

@@ -20,7 +20,7 @@ int check_type(type_T *expected, type_T *actual, int give_msg, where_T where);
int check_argument_types(type_T *type, typval_T *argvars, int argcount, char_u *name); int check_argument_types(type_T *type, typval_T *argvars, int argcount, char_u *name);
char_u *skip_type(char_u *start, int optional); char_u *skip_type(char_u *start, int optional);
type_T *parse_type(char_u **arg, garray_T *type_gap, int give_error); type_T *parse_type(char_u **arg, garray_T *type_gap, int give_error);
int equal_type(type_T *type1, type_T *type2); 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); 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); 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); char *vartype_name(vartype_T type);

View File

@@ -1626,6 +1626,9 @@ def Test_vim9script_reload_noclear()
var lines =<< trim END var lines =<< trim END
vim9script vim9script
export var exported = 'thexport' export var exported = 'thexport'
export def TheFunc(x = 0)
enddef
END END
writefile(lines, 'XExportReload') writefile(lines, 'XExportReload')
lines =<< trim END lines =<< trim END
@@ -1638,6 +1641,9 @@ def Test_vim9script_reload_noclear()
return 'again' return 'again'
enddef enddef
import TheFunc from './XExportReload'
TheFunc()
if exists('s:loaded') | finish | endif if exists('s:loaded') | finish | endif
var s:loaded = true var s:loaded = true

View File

@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3249,
/**/ /**/
3248, 3248,
/**/ /**/

View File

@@ -2736,4 +2736,7 @@ long elapsed(DWORD start_tick);
// Maximum number of characters that can be fuzzy matched // Maximum number of characters that can be fuzzy matched
#define MAX_FUZZY_MATCHES 256 #define MAX_FUZZY_MATCHES 256
// flags for equal_type()
#define ETYPE_ARG_UNKNOWN 1
#endif // VIM__H #endif // VIM__H

View File

@@ -1271,7 +1271,7 @@ get_script_svar(scriptref_T *sref, ectx_T *ectx)
return NULL; return NULL;
} }
sv = ((svar_T *)si->sn_var_vals.ga_data) + sref->sref_idx; sv = ((svar_T *)si->sn_var_vals.ga_data) + sref->sref_idx;
if (!equal_type(sv->sv_type, sref->sref_type)) if (!equal_type(sv->sv_type, sref->sref_type, 0))
{ {
emsg(_(e_script_variable_type_changed)); emsg(_(e_script_variable_type_changed));
return NULL; return NULL;

View File

@@ -623,9 +623,10 @@ handle_import(
&& (imported->imp_flags & IMP_FLAGS_RELOAD) && (imported->imp_flags & IMP_FLAGS_RELOAD)
&& imported->imp_sid == sid && imported->imp_sid == sid
&& (idx >= 0 && (idx >= 0
? (equal_type(imported->imp_type, type) ? (equal_type(imported->imp_type, type, 0)
&& imported->imp_var_vals_idx == idx) && imported->imp_var_vals_idx == idx)
: (equal_type(imported->imp_type, ufunc->uf_func_type) : (equal_type(imported->imp_type, ufunc->uf_func_type,
ETYPE_ARG_UNKNOWN)
&& STRCMP(imported->imp_funcname, && STRCMP(imported->imp_funcname,
ufunc->uf_name) == 0))) ufunc->uf_name) == 0)))
{ {

View File

@@ -954,9 +954,11 @@ parse_type(char_u **arg, garray_T *type_gap, int give_error)
/* /*
* Check if "type1" and "type2" are exactly the same. * 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 int
equal_type(type_T *type1, type_T *type2) equal_type(type_T *type1, type_T *type2, int flags)
{ {
int i; int i;
@@ -981,17 +983,19 @@ equal_type(type_T *type1, type_T *type2)
break; // not composite is always OK break; // not composite is always OK
case VAR_LIST: case VAR_LIST:
case VAR_DICT: case VAR_DICT:
return equal_type(type1->tt_member, type2->tt_member); return equal_type(type1->tt_member, type2->tt_member, flags);
case VAR_FUNC: case VAR_FUNC:
case VAR_PARTIAL: case VAR_PARTIAL:
if (!equal_type(type1->tt_member, type2->tt_member) if (!equal_type(type1->tt_member, type2->tt_member, flags)
|| type1->tt_argcount != type2->tt_argcount) || type1->tt_argcount != type2->tt_argcount)
return FALSE; return FALSE;
if (type1->tt_argcount < 0 if (type1->tt_argcount < 0
|| type1->tt_args == NULL || type2->tt_args == NULL) || type1->tt_args == NULL || type2->tt_args == NULL)
return TRUE; return TRUE;
for (i = 0; i < type1->tt_argcount; ++i) for (i = 0; i < type1->tt_argcount; ++i)
if (!equal_type(type1->tt_args[i], type2->tt_args[i])) if ((flags & ETYPE_ARG_UNKNOWN) == 0
&& !equal_type(type1->tt_args[i], type2->tt_args[i],
flags))
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
@@ -1005,7 +1009,7 @@ equal_type(type_T *type1, type_T *type2)
void void
common_type(type_T *type1, type_T *type2, type_T **dest, garray_T *type_gap) common_type(type_T *type1, type_T *type2, type_T **dest, garray_T *type_gap)
{ {
if (equal_type(type1, type2)) if (equal_type(type1, type2, 0))
{ {
*dest = type1; *dest = type1;
return; return;