# HG changeset patch # User Bram Moolenaar # Date 1647347403 -3600 # Node ID 8a80c48bd1032298d93bb1e78191fcb51cfb8fde # Parent 945bcf77904779e2ddc757352fe0a0401acc6b35 patch 8.2.4572: Vim9: return type "any" is changed to first returned type Commit: https://github.com/vim/vim/commit/1a572e9b3b497e0412b4001cd9c6859db0c35412 Author: Bram Moolenaar Date: Tue Mar 15 12:28:10 2022 +0000 patch 8.2.4572: Vim9: return type "any" is changed to first returned type 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) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- 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 --- 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 --- a/src/vim9cmds.c +++ b/src/vim9cmds.c @@ -2258,8 +2258,7 @@ compile_return(char_u *arg, int check_re // 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)) {