# HG changeset patch # User Bram Moolenaar # Date 1610303404 -3600 # Node ID 647ff61c0bcde190c91264741b63c6205184aab3 # Parent 8d06e0d19894922df0f5efea3241e9ac6db0ffd9 patch 8.2.2323: Vim9: error when inferring type from empty dict/list Commit: https://github.com/vim/vim/commit/31a11b942a56bf75a653eec0976f365f9b389a5a Author: Bram Moolenaar Date: Sun Jan 10 19:23:27 2021 +0100 patch 8.2.2323: Vim9: error when inferring type from empty dict/list Problem: Vim9: error when inferring type from empty dict/list. Solution: When the member is t_unknown use t_any. (closes https://github.com/vim/vim/issues/7009) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -2929,6 +2929,16 @@ def Test_expr7_list_subscript() lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]'] CheckDefExecFailure(lines, 'E1012:') CheckScriptFailure(['vim9script'] + lines, 'E1030:', 3) + + lines =<< trim END + vim9script + var ld = [] + def Func() + eval ld[0].key + enddef + defcompile + END + CheckScriptSuccess(lines) enddef def Test_expr7_dict_subscript() @@ -2937,6 +2947,15 @@ def Test_expr7_dict_subscript() var l = [{lnum: 2}, {lnum: 1}] var res = l[0].lnum > l[1].lnum assert_true(res) + + var dd = {} + def Func1() + eval dd.key1.key2 + enddef + def Func2() + eval dd['key1'].key2 + enddef + defcompile END CheckScriptSuccess(lines) enddef diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 2323, +/**/ 2322, /**/ 2321, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1899,7 +1899,10 @@ generate_STRINGMEMBER(cctx_T *cctx, char } // change dict type to dict member type if (type->tt_type == VAR_DICT) - ((type_T **)stack->ga_data)[stack->ga_len - 1] = type->tt_member; + { + ((type_T **)stack->ga_data)[stack->ga_len - 1] = + type->tt_member == &t_unknown ? &t_any : type->tt_member; + } return OK; } @@ -3793,7 +3796,12 @@ compile_subscript( return FAIL; } if ((*typep)->tt_type == VAR_DICT) + { *typep = (*typep)->tt_member; + if (*typep == &t_unknown) + // empty dict was used + *typep = &t_any; + } else { if (need_type(*typep, &t_dict_any, -2, cctx, @@ -3831,7 +3839,12 @@ compile_subscript( else { if ((*typep)->tt_type == VAR_LIST) + { *typep = (*typep)->tt_member; + if (*typep == &t_unknown) + // empty list was used + *typep = &t_any; + } if (generate_instr_drop(cctx, vtype == VAR_LIST ? ISN_LISTINDEX : ISN_ANYINDEX, 1) == FAIL)