patch 9.1.0952: Vim9: missing type checking for any type assignment
Problem: Vim9: missing type checking for any type assignment
(Ernie Rael)
Solution: when assigning to a list item, if the type of the LHS item is
any, then use the list item type (Yegappan Lakshmanan)
fixes: #15208
closes: #16274
Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 1848c01..616e224 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -3707,4 +3707,46 @@
v9.CheckScriptFailure(lines, 'E705: Variable name conflicts with existing function: MyFunc', 5)
enddef
+" Test for doing a type check at runtime for a list member type
+def Test_nested_type_check()
+ var lines =<< trim END
+ var d = {a: [10], b: [20]}
+ var l = d->items()
+ l[0][1][0] = 'abc'
+ END
+ v9.CheckSourceDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string')
+
+ lines =<< trim END
+ vim9script
+ var d = {a: [10], b: [20]}
+ var l = d->items()
+ l[0][1][0] = 30
+ assert_equal([['a', [30]], ['b', [20]]], l)
+ END
+ v9.CheckScriptSuccess(lines)
+
+ lines =<< trim END
+ vim9script
+ def Foo()
+ var d = {a: [10], b: [20]}
+ var l = d->items()
+ l[0][1][0] = 30
+ assert_equal([['a', [30]], ['b', [20]]], l)
+ enddef
+ Foo()
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # Test for modifying a List item added using add() with a different type.
+ lines =<< trim END
+ vim9script
+
+ var l: list<list<any>> = [['a']]
+ var v = [[10]]
+ l[0]->add(v)
+ l[0][1][0] = [{x: 20}]
+ END
+ v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<dict<number>>', 6)
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker