patch 8.2.0483: Vim9: "let x = x + 1" does not give an error
Problem: Vim9: "let x = x + 1" does not give an error.
Solution: Hide the variable when compiling the expression.
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index f61ff53..770890e 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -738,6 +738,8 @@
call CheckDefFailure("let x = {'a': xxx}", 'E1001:')
call CheckDefFailure("let x = {xxx: 8}", 'E1001:')
call CheckDefFailure("let x = #{a: 1, a: 2}", 'E721:')
+ call CheckDefFailure("let x += 1", 'E1020:')
+ call CheckDefFailure("let x = x + 1", 'E1001:')
call CheckDefExecFailure("let x = g:anint.member", 'E715:')
call CheckDefExecFailure("let x = g:dict_empty.member", 'E716:')
enddef
diff --git a/src/version.c b/src/version.c
index 2e8420c..79d50ee 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 483,
+/**/
482,
/**/
481,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 9d66e5e..1e8cd03 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3685,6 +3685,8 @@
}
else if (oplen > 0)
{
+ int r;
+
// for "+=", "*=", "..=" etc. first load the current value
if (*op != '=')
{
@@ -3717,10 +3719,16 @@
}
}
- // compile the expression
+ // Compile the expression. Temporarily hide the new local variable
+ // here, it is not available to this expression.
+ if (idx >= 0)
+ --cctx->ctx_locals.ga_len;
instr_count = instr->ga_len;
p = skipwhite(p + oplen);
- if (compile_expr1(&p, cctx) == FAIL)
+ r = compile_expr1(&p, cctx);
+ if (idx >= 0)
+ ++cctx->ctx_locals.ga_len;
+ if (r == FAIL)
goto theend;
if (idx >= 0 && (is_decl || !has_type))