summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-02-17 17:00:27 +0100
committerBram Moolenaar <Bram@vim.org>2021-02-17 17:00:27 +0100
commit064095012c0b8e4e43e75834b337115950898fbf (patch)
tree2976dc56721bb9ee2a25a8fef898948310e76a6f
parent527ed38cfacc5abf32ef3e63f98966d011cd95de (diff)
downloadvim-git-064095012c0b8e4e43e75834b337115950898fbf.tar.gz
patch 8.2.2527: Vim9: lambda return type is not determined at script levelv8.2.2527
Problem: Vim9: lambda return type is not determined at script level. Solution: Compile the lambda to get the return type. (closes #7843)
-rw-r--r--src/eval.c10
-rw-r--r--src/testdir/test_vim9_assign.vim5
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h6
-rw-r--r--src/vim9.h2
5 files changed, 21 insertions, 4 deletions
diff --git a/src/eval.c b/src/eval.c
index aae6ee8ff..785d8417a 100644
--- 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);
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 7599df2c5..4c63217f2 100644
--- 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()
diff --git a/src/version.c b/src/version.c
index ea345104d..0fb889621 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 */
/**/
+ 2527,
+/**/
2526,
/**/
2525,
diff --git a/src/vim.h b/src/vim.h
index 73cb2692e..e27bf8bb7 100644
--- 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
diff --git a/src/vim9.h b/src/vim9.h
index c2a3916fd..1cf4b3c65 100644
--- 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