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 #7843)
diff --git a/src/eval.c b/src/eval.c
index aae6ee8..785d841 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3421,7 +3421,17 @@
      */
     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);
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 7599df2..4c63217 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1108,6 +1108,8 @@
       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 @@
       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()
diff --git a/src/version.c b/src/version.c
index ea34510..0fb8896 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2527,
+/**/
     2526,
 /**/
     2525,
diff --git a/src/vim.h b/src/vim.h
index 73cb269..e27bf8b 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1787,6 +1787,12 @@
 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
diff --git a/src/vim9.h b/src/vim9.h
index c2a3916..1cf4b3c 100644
--- a/src/vim9.h
+++ b/src/vim9.h
@@ -418,11 +418,9 @@
 #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