patch 9.0.2091: Vim9: cannot convert list to string using +=
Problem: Vim9: cannot convert list to string using +=
(after 9.0.2072)
Solution: convert dict index to string later in compile_member()
fixes: #13485
closes: #13486
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 91d302c..3b4c78b 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -2992,15 +2992,69 @@
vim9script
def Foo()
- var l: list<list<string>> = [['x', 'x', 'x'], ['y', 'y', 'y']]
- var z: number = 1
+ var l: list<list<string>> = [['x', 'x', 'x'], ['y', 'y', 'y']]
+ var z: number = 1
- [l[1][2], z] = ['a', 20]
- assert_equal([['x', 'x', 'x'], ['y', 'y', 'a']], l)
+ [l[1][2], z] = ['a', 20]
+ assert_equal([['x', 'x', 'x'], ['y', 'y', 'a']], l)
enddef
Foo()
END
v9.CheckSourceSuccess(lines)
+
+ lines =<< trim END
+ vim9script
+
+ var l: list<list<string>> = [['x', 'x', 'x'], ['y', 'y', 'y']]
+ var z: number = 1
+
+ [l[1][2], z] = ['a', 20]
+ assert_equal([['x', 'x', 'x'], ['y', 'y', 'a']], l)
+ END
+ v9.CheckSourceSuccess(lines)
+enddef
+
+" Test for assigning to a multi-dimensional dict item.
+def Test_dict_item_assign()
+ # This used to fail with the error "E1105: Cannot convert list to string"
+ # (Github issue #13485)
+ var lines =<< trim END
+ vim9script
+ def F()
+ var d: dict<dict<number>> = {a: {b: 0}}
+
+ for group in keys(d)
+ d['a']['b'] += 1
+ endfor
+ assert_equal({a: {b: 1}}, d)
+ enddef
+ F()
+ END
+ v9.CheckSourceSuccess(lines)
+
+ # This used to crash Vim
+ lines =<< trim END
+ vim9script
+ def F()
+ var d: dict<dict<number>> = {a: {b: 0}}
+ d['a']['b'] += 1
+ assert_equal({a: {b: 1}}, d)
+ enddef
+ F()
+ END
+ v9.CheckSourceSuccess(lines)
+
+ # Assignment at script level
+ lines =<< trim END
+ vim9script
+ var d: dict<dict<number>> = {a: {b: 0}}
+
+ for group in keys(d)
+ d['a']['b'] += 1
+ endfor
+ assert_equal({a: {b: 1}}, d)
+ END
+ v9.CheckSourceSuccess(lines)
enddef
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker