To: vim_dev@googlegroups.com Subject: Patch 9.0.0778 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0778 Problem: Indexing of unknown const type fails during compilation. Solution: Check for "any" properly. (closes #11389) Files: src/vim9expr.c, src/testdir/test_vim9_expr.vim *** ../vim-9.0.0777/src/vim9expr.c 2022-09-23 12:44:19.795794418 +0100 --- src/vim9expr.c 2022-10-17 13:02:44.105398769 +0100 *************** *** 93,99 **** vartype = typep->type_curr->tt_type; idxtype = (((type2_T *)stack->ga_data) + stack->ga_len - 1)->type_curr; // If the index is a string, the variable must be a Dict. ! if ((typep->type_curr == &t_any || typep->type_curr == &t_unknown) && idxtype == &t_string) vartype = VAR_DICT; if (vartype == VAR_STRING || vartype == VAR_LIST || vartype == VAR_BLOB) --- 93,100 ---- vartype = typep->type_curr->tt_type; idxtype = (((type2_T *)stack->ga_data) + stack->ga_len - 1)->type_curr; // If the index is a string, the variable must be a Dict. ! if ((typep->type_curr->tt_type == VAR_ANY ! || typep->type_curr->tt_type == VAR_UNKNOWN) && idxtype == &t_string) vartype = VAR_DICT; if (vartype == VAR_STRING || vartype == VAR_LIST || vartype == VAR_BLOB) *************** *** 172,179 **** return FAIL; } } ! else if (vartype == VAR_LIST || typep->type_curr == &t_any ! || typep->type_curr == &t_unknown) { if (is_slice) { --- 173,180 ---- return FAIL; } } ! else if (vartype == VAR_LIST || typep->type_curr->tt_type == VAR_ANY ! || typep->type_curr->tt_type == VAR_UNKNOWN) { if (is_slice) { *************** *** 669,675 **** // {sub} argument of substitute() can be compiled if it starts // with \= if (isn->isn_type == ISN_PUSHS && isn->isn_arg.string[0] == '\\' ! && isn->isn_arg.string[1] == '=') compile_string(isn, cctx, 2); } --- 670,676 ---- // {sub} argument of substitute() can be compiled if it starts // with \= if (isn->isn_type == ISN_PUSHS && isn->isn_arg.string[0] == '\\' ! && isn->isn_arg.string[1] == '=') compile_string(isn, cctx, 2); } *************** *** 1646,1655 **** if (type == &t_bool) return OK; ! if (type == &t_any ! || type == &t_unknown ! || type == &t_number ! || type == &t_number_bool) // Number 0 and 1 are OK to use as a bool. "any" could also be a bool. // This requires a runtime type check. return generate_COND2BOOL(cctx); --- 1647,1657 ---- if (type == &t_bool) return OK; ! if (type->tt_type == VAR_ANY ! || type->tt_type == VAR_UNKNOWN ! || type->tt_type == VAR_NUMBER ! || type == &t_number_bool ! || type == &t_const_number_bool) // Number 0 and 1 are OK to use as a bool. "any" could also be a bool. // This requires a runtime type check. return generate_COND2BOOL(cctx); *** ../vim-9.0.0777/src/testdir/test_vim9_expr.vim 2022-10-15 20:06:30.284328833 +0100 --- src/testdir/test_vim9_expr.vim 2022-10-17 12:59:30.289737682 +0100 *************** *** 3132,3137 **** --- 3132,3161 ---- unlet g:testlist enddef + def Test_expr9_const_any_index_slice() + var lines =<< trim END + vim9script + + export def V(): dict + return {a: [1, 43], b: 0} + enddef + END + writefile(lines, 'XexportDict.vim', 'D') + + lines =<< trim END + vim9script + + import './XexportDict.vim' as x + + def Test() + const v = x.V() + assert_equal(43, v.a[1]) + enddef + Test() + END + v9.CheckScriptSuccess(lines) + enddef + def Test_expr_member_vim9script() var lines =<< trim END var d = {one: *** ../vim-9.0.0777/src/version.c 2022-10-16 21:43:03.386665520 +0100 --- src/version.c 2022-10-17 12:56:14.306112275 +0100 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 778, /**/ -- There are only two hard things in programming: Cache invalidation, naming things and off-by-one errors. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///