Mercurial > vim
changeset 30888:54ba95d2d2eb v9.0.0778
patch 9.0.0778: indexing of unknown const type fails during compilation
Commit: https://github.com/vim/vim/commit/4913d420e8e8619cff837372bce87683d6fcaa03
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Oct 17 13:13:32 2022 +0100
patch 9.0.0778: indexing of unknown const type fails during compilation
Problem: Indexing of unknown const type fails during compilation.
Solution: Check for "any" properly. (closes https://github.com/vim/vim/issues/11389)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 17 Oct 2022 14:15:09 +0200 |
parents | cf89c4a14066 |
children | 712d3ac8e9d2 |
files | src/testdir/test_vim9_expr.vim src/version.c src/vim9expr.c |
diffstat | 3 files changed, 36 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -3132,6 +3132,30 @@ def Test_expr9_any_index_slice() unlet g:testlist enddef +def Test_expr9_const_any_index_slice() + var lines =<< trim END + vim9script + + export def V(): dict<any> + 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:
--- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 778, +/**/ 777, /**/ 776,
--- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -93,7 +93,8 @@ compile_member(int is_slice, int *keepin 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) + 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,8 +173,8 @@ compile_member(int is_slice, int *keepin return FAIL; } } - else if (vartype == VAR_LIST || typep->type_curr == &t_any - || typep->type_curr == &t_unknown) + else if (vartype == VAR_LIST || typep->type_curr->tt_type == VAR_ANY + || typep->type_curr->tt_type == VAR_UNKNOWN) { if (is_slice) { @@ -669,7 +670,7 @@ compile_arguments( // {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] == '=') + && isn->isn_arg.string[1] == '=') compile_string(isn, cctx, 2); } @@ -1646,10 +1647,11 @@ bool_on_stack(cctx_T *cctx) if (type == &t_bool) return OK; - if (type == &t_any - || type == &t_unknown - || type == &t_number - || type == &t_number_bool) + 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);