1
0
forked from aniani/vim

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.
This commit is contained in:
Bram Moolenaar 2020-03-30 21:05:45 +02:00
parent ca68ae1311
commit d25ec2cfa0
3 changed files with 14 additions and 2 deletions

View File

@ -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

View File

@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
483,
/**/
482,
/**/

View File

@ -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))