Skip to content

Commit b56c441

Browse files
committed
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)
1 parent bd9e796 commit b56c441

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

src/testdir/test_vim9_builtin.vim

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,12 @@ def Test_extend_dict_item_type()
922922
END
923923
CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0)
924924
CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1)
925+
926+
lines =<< trim END
927+
var d: dict<bool>
928+
extend(d, {b: 0})
929+
END
930+
CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<bool> but got dict<number>', 2)
925931
enddef
926932

927933
func g:ExtendList(l)
@@ -947,6 +953,12 @@ def Test_extend_list_item_type()
947953
END
948954
CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0)
949955
CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1)
956+
957+
lines =<< trim END
958+
var l: list<bool>
959+
extend(l, [0])
960+
END
961+
CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected list<bool> but got list<number>', 2)
950962
enddef
951963

952964
def Test_extend_return_type()

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,8 @@ static char *(features[]) =
755755

756756
static int included_patches[] =
757757
{ /* Add new patch number below this line */
758+
/**/
759+
3322,
758760
/**/
759761
3321,
760762
/**/

src/vim9type.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,10 +274,12 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int do_member)
274274
list_T *l = tv->vval.v_list;
275275
listitem_T *li;
276276

277-
if (l == NULL || l->lv_first == NULL)
277+
if (l == NULL || (l->lv_first == NULL && l->lv_type == NULL))
278278
return &t_list_empty;
279279
if (!do_member)
280280
return &t_list_any;
281+
if (l->lv_type != NULL)
282+
return l->lv_type;
281283
if (l->lv_first == &range_list_item)
282284
return &t_list_number;
283285
if (l->lv_copyID == copyID)
@@ -299,10 +301,12 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int do_member)
299301
typval_T *value;
300302
dict_T *d = tv->vval.v_dict;
301303

302-
if (d == NULL || d->dv_hashtab.ht_used == 0)
304+
if (d == NULL || (d->dv_hashtab.ht_used == 0 && d->dv_type == NULL))
303305
return &t_dict_empty;
304306
if (!do_member)
305307
return &t_dict_any;
308+
if (d->dv_type != NULL)
309+
return d->dv_type;
306310
if (d->dv_copyID == copyID)
307311
// avoid recursion
308312
return &t_dict_any;

0 commit comments

Comments
 (0)