Problem: Vim9: an inline function requires specifying the return type.
Solution: Make the return type optional.
{
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,
- TRUE, PROFILING(ufunc), NULL) == FAIL)
+ FALSE, PROFILING(ufunc), NULL) == FAIL)
{
clear_tv(rettv);
ret = FAIL;
echo FilterWithCond('foo', (v) => v .. '^b')
END
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
def Test_lambda_uses_assigned_var()
goto errret;
}
else
- fp->uf_ret_type = &t_any;
+ fp->uf_ret_type = &t_unknown;
}
fp->uf_lines = newlines;
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 2983,
/**/
2982,
/**/
++ufunc->uf_refcount;
clear_tv(&rettv);
- // Compile the function into instructions.
- compile_def_function(ufunc, TRUE, PROFILING(ufunc), cctx);
+ // 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;
+ compile_def_function(ufunc, FALSE, PROFILING(ufunc), cctx);
// 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.
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];
- 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_any))
+ || (!check_return_type
+ && cctx->ctx_ufunc->uf_ret_type == &t_unknown))
{
cctx->ctx_ufunc->uf_ret_type = stack_type;
}