mirror of
https://github.com/vim/vim.git
synced 2025-09-29 04:34:16 -04:00
patch 8.2.2252: Vim9: crash when using lambda without return type in dict
Problem: Vim9: crash when using lambda without return type in dict. Solution: Without a return type use t_unknown. (closes #7587)
This commit is contained in:
@@ -2077,6 +2077,10 @@ def Test_expr7_dict()
|
|||||||
assert_equal(g:test_hash_dict, {one: 1, two: 2})
|
assert_equal(g:test_hash_dict, {one: 1, two: 2})
|
||||||
|
|
||||||
assert_equal({['a a']: 1, ['b/c']: 2}, {'a a': 1, "b/c": 2})
|
assert_equal({['a a']: 1, ['b/c']: 2}, {'a a': 1, "b/c": 2})
|
||||||
|
|
||||||
|
var d = {a: () => 3, b: () => 7}
|
||||||
|
assert_equal(3, d.a())
|
||||||
|
assert_equal(7, d.b())
|
||||||
END
|
END
|
||||||
CheckDefAndScriptSuccess(lines)
|
CheckDefAndScriptSuccess(lines)
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
2252,
|
||||||
/**/
|
/**/
|
||||||
2251,
|
2251,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -4837,7 +4837,8 @@ compile_return(char_u *arg, int check_return_type, cctx_T *cctx)
|
|||||||
if (cctx->ctx_skip != SKIP_YES)
|
if (cctx->ctx_skip != SKIP_YES)
|
||||||
{
|
{
|
||||||
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 = stack_type;
|
cctx->ctx_ufunc->uf_ret_type = stack_type;
|
||||||
}
|
}
|
||||||
|
@@ -480,7 +480,10 @@ check_type(type_T *expected, type_T *actual, int give_msg, int argidx)
|
|||||||
}
|
}
|
||||||
else if (expected->tt_type == VAR_FUNC)
|
else if (expected->tt_type == VAR_FUNC)
|
||||||
{
|
{
|
||||||
if (expected->tt_member != &t_unknown)
|
// If the return type is unknown it can be anything, including
|
||||||
|
// nothing, thus there is no point in checking.
|
||||||
|
if (expected->tt_member != &t_unknown
|
||||||
|
&& actual->tt_member != &t_unknown)
|
||||||
ret = check_type(expected->tt_member, actual->tt_member,
|
ret = check_type(expected->tt_member, actual->tt_member,
|
||||||
FALSE, 0);
|
FALSE, 0);
|
||||||
if (ret == OK && expected->tt_argcount != -1
|
if (ret == OK && expected->tt_argcount != -1
|
||||||
|
Reference in New Issue
Block a user