diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-07-31 22:51:10 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-07-31 22:51:10 +0200 |
commit | f5d52c90e0f2f51622a911b646024b2ad1225ed4 (patch) | |
tree | 8d58b16c1b184809e49d002d5279e59ee6bcebd7 | |
parent | 9e0ee590197d74f94b7127bf0e033e4f83cf3762 (diff) | |
download | vim-git-f5d52c90e0f2f51622a911b646024b2ad1225ed4.tar.gz |
patch 8.2.3263: Vim9: "..=" does not accept same types as the ".." operatorv8.2.3263
Problem: Vim9: "..=" does not accept same types as the ".." operator.
Solution: Convert value to string like ".." does. (issue #8664)
-rw-r--r-- | src/testdir/test_vim9_assign.vim | 26 | ||||
-rw-r--r-- | src/testdir/test_vim9_disassemble.vim | 2 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 17 |
4 files changed, 40 insertions, 7 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index b2f8feca5..97983ef3c 100644 --- 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 index 1d100e0e0..b151cb435 100644 --- 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 index fcfd211cb..76c3e97e5 100644 --- 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 index c6a2965ea..cafbd6b2f 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -7086,18 +7086,23 @@ 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 ( + 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 == '.') { |