summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-12-08 21:41:23 +0100
committerChristian Brabandt <cb@256bit.org>2023-12-08 21:47:22 +0100
commitd33518522a84b5625e663c1b608e1c68f9f58003 (patch)
tree55e95d51f2f0484c0d5db68f4bcb951a8a89868c
parentf48558e10a08a1a483e25ef847bbceeac6b44561 (diff)
patch 9.0.2155: Vim9: type not kept when assigning varsv9.0.2155
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>
-rw-r--r--src/testdir/test_vim9_assign.vim26
-rw-r--r--src/version.c2
-rw-r--r--src/vim9type.c4
3 files changed, 32 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 926773e292..a6a242dae7 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index f623c7f6fc..6b8a8b1c55 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2155,
+/**/
2154,
/**/
2153,
diff --git a/src/vim9type.c b/src/vim9type.c
index 22720fb6e8..c28137fcc7 100644
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -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;