patch 8.2.3029: Vim9: crash when using operator and list unpack assignment
Problem: Vim9: crash when using operator and list unpack assignment.
(Naohiro Ono)
Solution: Get variable value before operation. (closes #8416)
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 1cbdcfb..1d3c20e 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -283,6 +283,29 @@
[v1, v2; _] = [1, 2, 3, 4, 5]
assert_equal(1, v1)
assert_equal(2, v2)
+
+ var a = 1
+ var b = 3
+ [a, b] += [2, 4]
+ assert_equal(3, a)
+ assert_equal(7, b)
+
+ [a, b] -= [1, 2]
+ assert_equal(2, a)
+ assert_equal(5, b)
+
+ [a, b] *= [3, 2]
+ assert_equal(6, a)
+ assert_equal(10, b)
+
+ [a, b] /= [2, 4]
+ assert_equal(3, a)
+ assert_equal(2, b)
+
+ [a, b] = [17, 15]
+ [a, b] %= [5, 3]
+ assert_equal(2, a)
+ assert_equal(0, b)
END
CheckDefAndScriptSuccess(lines)
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 9d2f697..7938d91 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -452,6 +452,37 @@
res)
enddef
+def s:ListAssignWithOp()
+ var a = 2
+ var b = 3
+ [a, b] += [4, 5]
+enddef
+
+def Test_disassemble_list_assign_with_op()
+ var res = execute('disass s:ListAssignWithOp')
+ assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
+ 'var a = 2\_s*' ..
+ '\d STORE 2 in $0\_s*' ..
+ 'var b = 3\_s*' ..
+ '\d STORE 3 in $1\_s*' ..
+ '\[a, b\] += \[4, 5\]\_s*' ..
+ '\d\+ PUSHNR 4\_s*' ..
+ '\d\+ PUSHNR 5\_s*' ..
+ '\d\+ NEWLIST size 2\_s*' ..
+ '\d\+ CHECKLEN 2\_s*' ..
+ '\d\+ LOAD $0\_s*' ..
+ '\d\+ ITEM 0 with op\_s*' ..
+ '\d\+ OPNR +\_s*' ..
+ '\d\+ STORE $0\_s*' ..
+ '\d\+ LOAD $1\_s*' ..
+ '\d\+ ITEM 1 with op\_s*' ..
+ '\d\+ OPNR +\_s*' ..
+ '\d\+ STORE $1\_s*' ..
+ '\d\+ DROP\_s*' ..
+ '\d\+ RETURN void',
+ res)
+enddef
+
def s:ListAdd()
var l: list<number> = []
add(l, 123)