# HG changeset patch # User Christian Brabandt # Date 1702217794 -3600 # Node ID a9ccbadecda143b04ba6393182509c86026de3fe # Parent c30e06a0a18080e0ba03a0c894a14c38b757a9a4 patch 9.0.2155: Vim9: type not kept when assigning vars Commit: https://github.com/vim/vim/commit/d33518522a84b5625e663c1b608e1c68f9f58003 Author: Yegappan Lakshmanan Date: Fri Dec 8 21:41:23 2023 +0100 patch 9.0.2155: Vim9: type not kept when assigning vars 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 Signed-off-by: Christian Brabandt diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- 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 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'", '[1, 2, 3]'], + ["'dict'", '{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>', 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 --- 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 --- 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;