From d25ec2cfa0c25c3b00b7f8963b8aea799df1f20a Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 30 Mar 2020 21:05:45 +0200 Subject: [PATCH] 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. --- src/testdir/test_vim9_expr.vim | 2 ++ src/version.c | 2 ++ src/vim9compile.c | 12 ++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index f61ff536ad28b..770890ec35fb2 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -738,6 +738,8 @@ def Test_expr7_dict() 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 2e8420c5eaffe..79d50ee42dc74 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 483, /**/ 482, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 9d66e5ed15bf2..1e8cd03d02455 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))