# HG changeset patch # User Bram Moolenaar # Date 1627765204 -7200 # Node ID 21b70bab366c79bdf952d616b2d31461826c2872 # Parent d0975ae1f208b972e80158e5dccca3a7b9b62048 patch 8.2.3263: Vim9: "..=" does not accept same types as the ".." operator Commit: https://github.com/vim/vim/commit/f5d52c90e0f2f51622a911b646024b2ad1225ed4 Author: Bram Moolenaar Date: Sat Jul 31 22:51:10 2021 +0200 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 https://github.com/vim/vim/issues/8664) 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 @@ -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' diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim --- a/src/testdir/test_vim9_disassemble.vim +++ b/src/testdir/test_vim9_disassemble.vim @@ -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*' .. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3263, +/**/ 3262, /**/ 3261, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -7086,18 +7086,23 @@ compile_assignment(char_u *arg, exarg_T 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 ( + stacktype = ((type_T **)stack->ga_data)[stack->ga_len - 1]; + if ( #ifdef FEAT_FLOAT - // If variable is float operation with number is OK. - !(expected == &t_float && stacktype == &t_number) && + // If variable is float operation with number is OK. + !(expected == &t_float && stacktype == &t_number) && #endif need_type(stacktype, expected, -1, 0, cctx, FALSE, FALSE) == FAIL) - goto theend; + goto theend; + } if (*op == '.') {