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:
@@ -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))
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)))
|
||||||
{
|
{
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user