diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-03-15 12:28:10 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-03-15 12:28:10 +0000 |
commit | 1a572e9b3b497e0412b4001cd9c6859db0c35412 (patch) | |
tree | 876a147e3ef18869fd728a1d2d6d3e8dbc56b604 | |
parent | 8d5e514d77bd4b1956656ad2be2ce7094bd43a72 (diff) | |
download | vim-git-1a572e9b3b497e0412b4001cd9c6859db0c35412.tar.gz |
patch 8.2.4572: Vim9: return type "any" is changed to first returned typev8.2.4572
Problem: Vim9: return type "any" is sometimes changed to first returned
type. (Virginia Senioria)
Solution: Do not change the return type if declared as "any". (closes #9949)
-rw-r--r-- | src/testdir/test_vim9_func.vim | 24 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9cmds.c | 3 |
3 files changed, 27 insertions, 2 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 8c99ad400..06f135a45 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -535,6 +535,30 @@ def Test_return_list_any() v9.CheckScriptSuccess(lines) enddef +def Test_return_any_two_types() + var lines =<< trim END + vim9script + + def G(Fn: func(string): any) + g:result = Fn("hello") + enddef + + def F(a: number, b: string): any + echo b + if a > 0 + return 1 + else + return [] + endif + enddef + + G(function(F, [1])) + END + v9.CheckScriptSuccess(lines) + assert_equal(1, g:result) + unlet g:result +enddef + func s:Increment() let g:counter += 1 endfunc diff --git a/src/version.c b/src/version.c index 777f13116..d9752fd10 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4572, +/**/ 4571, /**/ 4570, diff --git a/src/vim9cmds.c b/src/vim9cmds.c index b8a511f27..cc2c04158 100644 --- a/src/vim9cmds.c +++ b/src/vim9cmds.c @@ -2258,8 +2258,7 @@ compile_return(char_u *arg, int check_return_type, int legacy, cctx_T *cctx) // return type here. stack_type = get_type_on_stack(cctx, 0); if ((check_return_type && (cctx->ctx_ufunc->uf_ret_type == NULL - || cctx->ctx_ufunc->uf_ret_type == &t_unknown - || cctx->ctx_ufunc->uf_ret_type == &t_any)) + || cctx->ctx_ufunc->uf_ret_type == &t_unknown)) || (!check_return_type && cctx->ctx_ufunc->uf_ret_type == &t_unknown)) { |