summaryrefslogtreecommitdiffstats
path: root/src/vim9compile.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-03-30 21:05:45 +0200
committerBram Moolenaar <Bram@vim.org>2020-03-30 21:05:45 +0200
commitd25ec2cfa0c25c3b00b7f8963b8aea799df1f20a (patch)
treee3cfefe979dd73574dec6f8edc5388b6afba0a5e /src/vim9compile.c
parentca68ae13114619df3e4c195b41ad0575516f5ff6 (diff)
patch 8.2.0483: Vim9: "let x = x + 1" does not give an errorv8.2.0483
Problem: Vim9: "let x = x + 1" does not give an error. Solution: Hide the variable when compiling the expression.
Diffstat (limited to 'src/vim9compile.c')
-rw-r--r--src/vim9compile.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 9d66e5ed15..1e8cd03d02 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3685,6 +3685,8 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
}
else if (oplen > 0)
{
+ int r;
+
// for "+=", "*=", "..=" etc. first load the current value
if (*op != '=')
{
@@ -3717,10 +3719,16 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
}
}
- // 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))