Skip to content

Commit

Permalink
patch 9.0.2155: Vim9: type not kept when assigning vars
Browse files Browse the repository at this point in the history
Problem:  Vim9: type not kept when assigning vars
Solution: When assigning a List or a Dict value to a variable of type
          'any', keep the type

closes: #13639
closes: #13646

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
  • Loading branch information
yegappan authored and chrisbra committed Dec 8, 2023
1 parent f48558e commit d335185
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
26 changes: 26 additions & 0 deletions src/testdir/test_vim9_assign.vim
Original file line number Diff line number Diff line change
Expand Up @@ -3323,4 +3323,30 @@ def Test_func_rettype_check()
v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<A> but got number', 1)
enddef

" Test for assigning different types of value to a variable of type "any"
def Test_assign_to_any()
for [typestr, val] in [
["'bool'", 'true'],
["'number'", '100'],
["'float'", '1.1'],
["'string'", '"abc"'],
["'blob'", '0z10'],
["'list<number>'", '[1, 2, 3]'],
["'dict<number>'", '{a: 1}'],
]
var lines =<< trim eval END
vim9script
var x: any = {val}
assert_equal({typestr}, typename(x))
x = [{{a: 1}}, {{b: 2}}]
assert_equal('list<dict<number>>', typename(x))
def Foo(xarg: any, s: string)
assert_equal(s, typename(xarg))
enddef
Foo({val}, {typestr})
END
v9.CheckSourceSuccess(lines)
endfor
enddef

" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2155,
/**/
2154,
/**/
Expand Down
4 changes: 4 additions & 0 deletions src/vim9type.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,10 @@ set_tv_type_recurse(type_T *type)
void
set_tv_type(typval_T *tv, type_T *type)
{
if (type->tt_type == VAR_ANY)
// If the variable type is "any", then keep the value type.
// e.g. var x: any = [1, 2] or var y: any = {v: 1}
return;
if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL)
{
dict_T *d = tv->vval.v_dict;
Expand Down

0 comments on commit d335185

Please sign in to comment.