0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

patch 8.2.3263: Vim9: "..=" does not accept same types as the ".." operator

Problem:    Vim9: "..=" does not accept same types as the ".." operator.
Solution:   Convert value to string like ".." does. (issue #8664)
This commit is contained in:
Bram Moolenaar
2021-07-31 22:51:10 +02:00
parent 9e0ee59019
commit f5d52c90e0
4 changed files with 40 additions and 7 deletions

View File

@@ -239,6 +239,32 @@ def Test_assignment()
END
enddef
let g:someNumber = 43
def Test_assign_concat()
var lines =<< trim END
var s = '-'
s ..= 99
s ..= true
s ..= '-'
s ..= v:null
s ..= g:someNumber
assert_equal('-99true-null43', s)
END
CheckDefAndScriptSuccess(lines)
lines =<< trim END
var s = '-'
s ..= [1, 2]
END
CheckDefAndScriptFailure2(lines, 'E1105: Cannot convert list to string', 'E734: Wrong variable type for .=', 2)
lines =<< trim END
var s = '-'
s ..= {a: 2}
END
CheckDefAndScriptFailure2(lines, 'E1105: Cannot convert dict to string', 'E734: Wrong variable type for .=', 2)
enddef
def Test_assign_register()
var lines =<< trim END
@c = 'areg'

View File

@@ -1254,7 +1254,7 @@ def Test_disassemble_for_loop_eval()
'res ..= str\_s*' ..
'\d\+ LOAD $0\_s*' ..
'\d\+ LOAD $2\_s*' ..
'\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
'\d 2STRING_ANY stack\[-1\]\_s*' ..
'\d\+ CONCAT\_s*' ..
'\d\+ STORE $0\_s*' ..
'endfor\_s*' ..

View File

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

View File

@@ -7086,8 +7086,12 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
type_T *stacktype;
if (*op == '.')
expected = &t_string;
{
if (may_generate_2STRING(-1, FALSE, cctx) == FAIL)
goto theend;
}
else
{
expected = lhs.lhs_member_type;
stacktype = ((type_T **)stack->ga_data)[stack->ga_len - 1];
if (
@@ -7098,6 +7102,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
need_type(stacktype, expected, -1, 0, cctx,
FALSE, FALSE) == FAIL)
goto theend;
}
if (*op == '.')
{