forked from aniani/vim
patch 8.2.2983: Vim9: an inline function requires specifying the return type
Problem: Vim9: an inline function requires specifying the return type. Solution: Make the return type optional.
This commit is contained in:
@@ -3530,9 +3530,13 @@ eval7(
|
|||||||
{
|
{
|
||||||
ufunc_T *ufunc = rettv->vval.v_partial->pt_func;
|
ufunc_T *ufunc = rettv->vval.v_partial->pt_func;
|
||||||
|
|
||||||
// compile it here to get the return type
|
// Compile it here to get the return type. The return
|
||||||
|
// type is optional, when it's missing use t_unknown.
|
||||||
|
// This is recognized in compile_return().
|
||||||
|
if (ufunc->uf_ret_type->tt_type == VAR_VOID)
|
||||||
|
ufunc->uf_ret_type = &t_unknown;
|
||||||
if (compile_def_function(ufunc,
|
if (compile_def_function(ufunc,
|
||||||
TRUE, PROFILING(ufunc), NULL) == FAIL)
|
FALSE, PROFILING(ufunc), NULL) == FAIL)
|
||||||
{
|
{
|
||||||
clear_tv(rettv);
|
clear_tv(rettv);
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
|
@@ -948,6 +948,26 @@ def Test_lambda_return_type()
|
|||||||
echo FilterWithCond('foo', (v) => v .. '^b')
|
echo FilterWithCond('foo', (v) => v .. '^b')
|
||||||
END
|
END
|
||||||
CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected func(string): bool but got func(any): string', 1)
|
CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected func(string): bool but got func(any): string', 1)
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
var Lambda1 = (x) => {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
assert_equal('asdf', Lambda1('asdf'))
|
||||||
|
var Lambda2 = (x): string => {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
assert_equal('foo', Lambda2('foo'))
|
||||||
|
END
|
||||||
|
CheckDefAndScriptSuccess(lines)
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
var Lambda = (x): string => {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
echo Lambda(['foo'])
|
||||||
|
END
|
||||||
|
CheckDefExecAndScriptFailure(lines, 'E1012:')
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_lambda_uses_assigned_var()
|
def Test_lambda_uses_assigned_var()
|
||||||
|
@@ -1377,7 +1377,7 @@ get_lambda_tv(
|
|||||||
goto errret;
|
goto errret;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fp->uf_ret_type = &t_any;
|
fp->uf_ret_type = &t_unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
fp->uf_lines = newlines;
|
fp->uf_lines = newlines;
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2983,
|
||||||
/**/
|
/**/
|
||||||
2982,
|
2982,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -3565,8 +3565,12 @@ compile_lambda(char_u **arg, cctx_T *cctx)
|
|||||||
++ufunc->uf_refcount;
|
++ufunc->uf_refcount;
|
||||||
clear_tv(&rettv);
|
clear_tv(&rettv);
|
||||||
|
|
||||||
// Compile the function into instructions.
|
// Compile it here to get the return type. The return type is optional,
|
||||||
compile_def_function(ufunc, TRUE, PROFILING(ufunc), cctx);
|
// when it's missing use t_unknown. This is recognized in
|
||||||
|
// compile_return().
|
||||||
|
if (ufunc->uf_ret_type->tt_type == VAR_VOID)
|
||||||
|
ufunc->uf_ret_type = &t_unknown;
|
||||||
|
compile_def_function(ufunc, FALSE, PROFILING(ufunc), cctx);
|
||||||
|
|
||||||
// evalarg.eval_tofree_cmdline may have a copy of the last line and "*arg"
|
// evalarg.eval_tofree_cmdline may have a copy of the last line and "*arg"
|
||||||
// points into it. Point to the original line to avoid a dangling pointer.
|
// points into it. Point to the original line to avoid a dangling pointer.
|
||||||
@@ -5398,10 +5402,15 @@ compile_return(char_u *arg, int check_return_type, int legacy, cctx_T *cctx)
|
|||||||
|
|
||||||
if (cctx->ctx_skip != SKIP_YES)
|
if (cctx->ctx_skip != SKIP_YES)
|
||||||
{
|
{
|
||||||
|
// "check_return_type" with uf_ret_type set to &t_unknown is used
|
||||||
|
// for an inline function without a specified return type. Set the
|
||||||
|
// return type here.
|
||||||
stack_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
|
stack_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
|
||||||
if (check_return_type && (cctx->ctx_ufunc->uf_ret_type == NULL
|
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_unknown
|
||||||
|| cctx->ctx_ufunc->uf_ret_type == &t_any))
|
|| cctx->ctx_ufunc->uf_ret_type == &t_any))
|
||||||
|
|| (!check_return_type
|
||||||
|
&& cctx->ctx_ufunc->uf_ret_type == &t_unknown))
|
||||||
{
|
{
|
||||||
cctx->ctx_ufunc->uf_ret_type = stack_type;
|
cctx->ctx_ufunc->uf_ret_type = stack_type;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user