diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-07-22 20:16:11 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-07-22 20:16:11 +0200 |
commit | 0f60e80f9b6d778e460b4dc8333cd8e17c1b620b (patch) | |
tree | 93846335f7358ff8a0d053e09a80447adad9a491 | |
parent | 2f1980f7b74a6a47d72f9c56417bc4ad47c6b66c (diff) |
patch 8.2.1271: Vim9: Error for Funcref function argument typev8.2.1271
Problem: Vim9: Error for Funcref function argument type.
Solution: Find the actual function type if possible. (issue #6507)
-rw-r--r-- | src/testdir/test_vim9_func.vim | 13 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 22 |
3 files changed, 37 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 3fa5d6abea..ed5972185b 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -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') diff --git a/src/version.c b/src/version.c index 9ac0340a30..0bb6b0a75e 100644 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1271, +/**/ 1270, /**/ 1269, diff --git a/src/vim9compile.c b/src/vim9compile.c index 55f08a73ea..999833b522 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -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); |