# HG changeset patch # User Bram Moolenaar # Date 1666008909 -7200 # Node ID 54ba95d2d2eb4bd161fc704e0a69d17d1c226213 # Parent cf89c4a14066c6da8900c88609619d8c7da86fab patch 9.0.0778: indexing of unknown const type fails during compilation Commit: https://github.com/vim/vim/commit/4913d420e8e8619cff837372bce87683d6fcaa03 Author: Bram Moolenaar 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) 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 @@ -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 + 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: diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/vim9expr.c b/src/vim9expr.c --- 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);