1
0
forked from aniani/vim

patch 8.2.1271: Vim9: Error for Funcref function argument type

Problem:    Vim9: Error for Funcref function argument type.
Solution:   Find the actual function type if possible. (issue #6507)
This commit is contained in:
Bram Moolenaar 2020-07-22 20:16:11 +02:00
parent 2f1980f7b7
commit 0f60e80f9b
3 changed files with 37 additions and 0 deletions

View File

@ -270,6 +270,19 @@ def Test_call_funcref()
assert_equal(123, Funcref())
END
CheckScriptSuccess(lines)
lines =<< trim END
vim9script
def RetNumber(): number
return 123
enddef
def Bar(F: func: number): number
return F()
enddef
let Funcref = function('RetNumber')
assert_equal(123, Bar(Funcref))
END
CheckScriptSuccess(lines)
enddef
let SomeFunc = function('len')

View File

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

View File

@ -599,6 +599,28 @@ check_argtype(type_T *expected, typval_T *actual_tv)
member.tt_member = &t_any;
actual.tt_member = &member;
}
else if (actual_tv->v_type == VAR_FUNC || actual_tv->v_type == VAR_PARTIAL)
{
char_u *name = NULL;
ufunc_T *ufunc = NULL;
if (actual_tv->v_type == VAR_PARTIAL)
{
if (actual_tv->vval.v_partial->pt_func != NULL)
ufunc = actual_tv->vval.v_partial->pt_func;
else
name = actual_tv->vval.v_partial->pt_name;
}
else
name = actual_tv->vval.v_string;
if (name != NULL)
// TODO: how about a builtin function?
ufunc = find_func(name, FALSE, NULL);
if (ufunc != NULL && ufunc->uf_func_type != NULL)
actual = *ufunc->uf_func_type;
else
actual.tt_member = &t_any;
}
else
actual.tt_member = &t_any;
return check_type(expected, &actual, TRUE);