changeset 23970:ba79ceac82ec v8.2.2527

patch 8.2.2527: Vim9: lambda return type is not determined at script level Commit: https://github.com/vim/vim/commit/064095012c0b8e4e43e75834b337115950898fbf Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 17 17:00:27 2021 +0100 patch 8.2.2527: Vim9: lambda return type is not determined at script level Problem: Vim9: lambda return type is not determined at script level. Solution: Compile the lambda to get the return type. (closes https://github.com/vim/vim/issues/7843)
author Bram Moolenaar <Bram@vim.org>
date Wed, 17 Feb 2021 17:15:03 +0100
parents 09ff1883884f
children 275505319b80
files src/eval.c src/testdir/test_vim9_assign.vim src/version.c src/vim.h src/vim9.h
diffstat 5 files changed, 21 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -3421,7 +3421,17 @@ eval7(
      */
     case '(':	ret = NOTDONE;
 		if (in_vim9script())
+		{
 		    ret = get_lambda_tv(arg, rettv, TRUE, evalarg);
+		    if (ret == OK && evaluate)
+		    {
+			ufunc_T *ufunc = rettv->vval.v_partial->pt_func;
+
+			// compile it here to get the return type
+			compile_def_function(ufunc,
+						 TRUE, PROFILING(ufunc), NULL);
+		    }
+		}
 		if (ret == NOTDONE)
 		{
 		    *arg = skipwhite_and_linebreak(*arg + 1, evalarg);
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1108,6 +1108,8 @@ def Test_assign_lambda()
       assert_equal(123, FuncRef_Func())
       var FuncRef_Any: any = () => 123
       assert_equal(123, FuncRef_Any())
+      var FuncRef_Number: func(): number = () => 321
+      assert_equal(321, FuncRef_Number())
   END
   CheckScriptSuccess(lines)
 
@@ -1115,8 +1117,7 @@ def Test_assign_lambda()
       var Ref: func(number)
       Ref = (j) => !j
   END
-  CheckDefFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool')
-  CheckScriptFailure(['vim9script'] + lines, 'E1012: Type mismatch; expected func(number) but got func(any): any')
+  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool')
 enddef
 
 def Test_heredoc()
--- 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 */
 /**/
+    2527,
+/**/
     2526,
 /**/
     2525,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1787,6 +1787,12 @@ typedef struct timeval proftime_T;
 typedef int proftime_T;	    // dummy for function prototypes
 #endif
 
+#ifdef FEAT_PROFILE
+# define PROFILING(ufunc) (do_profiling == PROF_YES && (ufunc)->uf_profiling)
+#else
+# define PROFILING(ufunc) FALSE
+#endif
+
 /*
  * When compiling with 32 bit Perl time_t is 32 bits in the Perl code but 64
  * bits elsewhere.  That causes memory corruption.  Define time_T and use it
--- a/src/vim9.h
+++ b/src/vim9.h
@@ -418,11 +418,9 @@ extern garray_T def_functions;
 #define LNUM_VARIABLE_RANGE_ABOVE -888
 
 #ifdef FEAT_PROFILE
-# define PROFILING(ufunc) (do_profiling == PROF_YES && (ufunc)->uf_profiling)
 # define INSTRUCTIONS(dfunc) \
 	((do_profiling == PROF_YES && (dfunc->df_ufunc)->uf_profiling) \
 	? (dfunc)->df_instr_prof : (dfunc)->df_instr)
 #else
-# define PROFILING(ufunc) FALSE
 # define INSTRUCTIONS(dfunc) ((dfunc)->df_instr)
 #endif