summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-07-31 22:51:10 +0200
committerBram Moolenaar <Bram@vim.org>2021-07-31 22:51:10 +0200
commitf5d52c90e0f2f51622a911b646024b2ad1225ed4 (patch)
tree8d58b16c1b184809e49d002d5279e59ee6bcebd7
parent9e0ee590197d74f94b7127bf0e033e4f83cf3762 (diff)
downloadvim-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.vim26
-rw-r--r--src/testdir/test_vim9_disassemble.vim2
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c17
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 == '.')
{