0
0
mirror of https://github.com/vim/vim.git synced 2025-09-28 04:24:06 -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:
Bram Moolenaar
2020-12-31 13:31:23 +01:00
parent a04d447d3a
commit 6b55377303
4 changed files with 12 additions and 2 deletions

View File

@@ -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)

View File

@@ -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,
/**/ /**/

View File

@@ -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;
} }

View File

@@ -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