summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-03-15 12:28:10 +0000
committerBram Moolenaar <Bram@vim.org>2022-03-15 12:28:10 +0000
commit1a572e9b3b497e0412b4001cd9c6859db0c35412 (patch)
tree876a147e3ef18869fd728a1d2d6d3e8dbc56b604
parent8d5e514d77bd4b1956656ad2be2ce7094bd43a72 (diff)
downloadvim-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.vim24
-rw-r--r--src/version.c2
-rw-r--r--src/vim9cmds.c3
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))
{