changeset 28095:8a80c48bd103 v8.2.4572

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 <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Tue, 15 Mar 2022 13:30:03 +0100
parents 945bcf779047
children 079a3f69681e
files src/testdir/test_vim9_func.vim src/version.c src/vim9cmds.c
diffstat 3 files changed, 27 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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,
--- 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))
 	    {