diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-10-17 13:13:32 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-10-17 13:13:32 +0100 |
commit | 4913d420e8e8619cff837372bce87683d6fcaa03 (patch) | |
tree | 4485db34731a29ea8bbaded0f984f9633c6bf6a8 | |
parent | 3f0092c141824356b55b11cd3985baaf4df65334 (diff) | |
download | vim-git-4913d420e8e8619cff837372bce87683d6fcaa03.tar.gz |
patch 9.0.0778: indexing of unknown const type fails during compilationv9.0.0778
Problem: Indexing of unknown const type fails during compilation.
Solution: Check for "any" properly. (closes #11389)
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 24 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9expr.c | 18 |
3 files changed, 36 insertions, 8 deletions
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index b764e929c..bc4a79027 100644 --- 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: diff --git a/src/version.c b/src/version.c index b0ba507f5..e6b7ee1e7 100644 --- 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 index 8be8f6b91..854c09d01 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -93,7 +93,8 @@ compile_member(int is_slice, int *keeping_dict, cctx_T *cctx) 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 *keeping_dict, cctx_T *cctx) 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); |