0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

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>
This commit is contained in:
Yegappan Lakshmanan
2023-11-05 10:07:03 +01:00
committed by Christian Brabandt
parent 4f174f0de9
commit 6709816f78
4 changed files with 60 additions and 14 deletions

View File

@@ -3001,6 +3001,60 @@ def Test_list_item_assign()
Foo() Foo()
END END
v9.CheckSourceSuccess(lines) 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 enddef
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker

View File

@@ -560,7 +560,6 @@ def Test_disassemble_store_index()
'\d LOAD $0\_s*' .. '\d LOAD $0\_s*' ..
'\d MEMBER dd\_s*' .. '\d MEMBER dd\_s*' ..
'\d\+ USEDICT\_s*' .. '\d\+ USEDICT\_s*' ..
'\d\+ 2STRING stack\[-2\]\_s*' ..
'\d\+ STOREINDEX any\_s*' .. '\d\+ STOREINDEX any\_s*' ..
'\d\+ RETURN void', '\d\+ RETURN void',
res) res)

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2091,
/**/ /**/
2090, 2090,
/**/ /**/

View File

@@ -2221,15 +2221,6 @@ compile_load_lhs(
return FAIL; return FAIL;
} }
if (lhs->lhs_type->tt_type == VAR_DICT && var_start[varlen] == '[')
{
// If the lhs is a Dict variable and an item is accessed by "[",
// then need to convert the key into a string. The top item in the
// type stack is the Dict and the second last item is the key.
if (may_generate_2STRING(-2, FALSE, cctx) == FAIL)
return FAIL;
}
// Now we can properly check the type. The variable is indexed, thus // Now we can properly check the type. The variable is indexed, thus
// we need the member type. For a class or object we don't know the // we need the member type. For a class or object we don't know the
// type yet, it depends on what member is used. // type yet, it depends on what member is used.