changeset 25571:951f3e04e238 v8.2.3322

patch 8.2.3322: Vim9: checking type of dict does not check member type Commit: https://github.com/vim/vim/commit/b56c4419d42e024e79b1772c8468c0da7c11275f Author: Bram Moolenaar <Bram@vim.org> Date: Mon Aug 9 22:22:27 2021 +0200 patch 8.2.3322: Vim9: checking type of dict does not check member type 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)
author Bram Moolenaar <Bram@vim.org>
date Mon, 09 Aug 2021 22:30:04 +0200
parents c8c6f5e56772
children 1acfb0a552d7
files src/testdir/test_vim9_builtin.vim src/version.c src/vim9type.c
diffstat 3 files changed, 20 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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()
--- 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,
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -274,10 +274,12 @@ typval2type_int(typval_T *tv, int copyID
 	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
 	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;