diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-08-09 22:22:27 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-08-09 22:22:27 +0200 |
commit | b56c4419d42e024e79b1772c8468c0da7c11275f (patch) | |
tree | b854a7d1d38c1b92ce171cc5d7fce267117f42fb | |
parent | bd9e7961256ea6a98bd5a7bfe14e32c4c47186e6 (diff) | |
download | vim-git-b56c4419d42e024e79b1772c8468c0da7c11275f.tar.gz |
patch 8.2.3322: Vim9: checking type of dict does not check member typev8.2.3322
Problem: Vim9: checking type of dict does not check member type.
Solution: When getting the type of a typval use dv_type and lv_type.
(closes #8732)
-rw-r--r-- | src/testdir/test_vim9_builtin.vim | 12 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9type.c | 8 |
3 files changed, 20 insertions, 2 deletions
diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 6ca6c7b0c..5e45edbae 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -922,6 +922,12 @@ def Test_extend_dict_item_type() END CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0) CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1) + + lines =<< trim END + var d: dict<bool> + extend(d, {b: 0}) + END + CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<bool> but got dict<number>', 2) enddef func g:ExtendList(l) @@ -947,6 +953,12 @@ def Test_extend_list_item_type() END CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0) CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1) + + lines =<< trim END + var l: list<bool> + extend(l, [0]) + END + CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected list<bool> but got list<number>', 2) enddef def Test_extend_return_type() diff --git a/src/version.c b/src/version.c index ffe37a460..5b34ac70b 100644 --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3322, +/**/ 3321, /**/ 3320, diff --git a/src/vim9type.c b/src/vim9type.c index d3562e788..ca090cbe5 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -274,10 +274,12 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int do_member) list_T *l = tv->vval.v_list; listitem_T *li; - if (l == NULL || l->lv_first == NULL) + if (l == NULL || (l->lv_first == NULL && l->lv_type == NULL)) return &t_list_empty; if (!do_member) return &t_list_any; + if (l->lv_type != NULL) + return l->lv_type; if (l->lv_first == &range_list_item) return &t_list_number; if (l->lv_copyID == copyID) @@ -299,10 +301,12 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int do_member) typval_T *value; dict_T *d = tv->vval.v_dict; - if (d == NULL || d->dv_hashtab.ht_used == 0) + if (d == NULL || (d->dv_hashtab.ht_used == 0 && d->dv_type == NULL)) return &t_dict_empty; if (!do_member) return &t_dict_any; + if (d->dv_type != NULL) + return d->dv_type; if (d->dv_copyID == copyID) // avoid recursion return &t_dict_any; |