forked from aniani/vim
patch 9.1.0665: Locked variable can be changed in a :for loop
Problem: Locked variable can be changed in a :for loop. Solution: Always do a full permission check on the first loop iteration where ASSIGN_DECL is not set (zeertzjq). related: #12470 fixes: #15450 closes: #15454 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
39eff4cdc0
commit
6b97d7ad19
@@ -4100,7 +4100,7 @@ set_var_const(
|
|||||||
|
|
||||||
// Modifying a final variable with a List value using the "+="
|
// Modifying a final variable with a List value using the "+="
|
||||||
// operator is allowed. For other types, it is not allowed.
|
// operator is allowed. For other types, it is not allowed.
|
||||||
if (((flags & ASSIGN_FOR_LOOP) == 0
|
if ((((flags & ASSIGN_FOR_LOOP) == 0 || (flags & ASSIGN_DECL) == 0)
|
||||||
&& ((flags & ASSIGN_COMPOUND_OP) == 0
|
&& ((flags & ASSIGN_COMPOUND_OP) == 0
|
||||||
|| !type_inplace_modifiable))
|
|| !type_inplace_modifiable))
|
||||||
? var_check_permission(di, name) == FAIL
|
? var_check_permission(di, name) == FAIL
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
source view_util.vim
|
source view_util.vim
|
||||||
source shared.vim
|
source shared.vim
|
||||||
|
import './vim9.vim' as v9
|
||||||
|
|
||||||
function s:foo() abort
|
function s:foo() abort
|
||||||
try
|
try
|
||||||
@@ -126,7 +127,31 @@ func Test_for_invalid()
|
|||||||
call assert_fails("for x in 99", 'E1098:')
|
call assert_fails("for x in 99", 'E1098:')
|
||||||
call assert_fails("for x in function('winnr')", 'E1098:')
|
call assert_fails("for x in function('winnr')", 'E1098:')
|
||||||
call assert_fails("for x in {'a': 9}", 'E1098:')
|
call assert_fails("for x in {'a': 9}", 'E1098:')
|
||||||
call assert_fails("for v:maxcol in range(1)", 'E46:')
|
|
||||||
|
let lines =<< trim END
|
||||||
|
for v:maxcol in range(5)
|
||||||
|
endfor
|
||||||
|
END
|
||||||
|
|
||||||
|
let save_v_maxcol = v:maxcol
|
||||||
|
call v9.CheckLegacyAndVim9Failure(lines, 'E46:')
|
||||||
|
call assert_equal(save_v_maxcol, v:maxcol)
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
for g:constvar in range(5)
|
||||||
|
endfor
|
||||||
|
END
|
||||||
|
|
||||||
|
const g:constvar = 10
|
||||||
|
call v9.CheckLegacyAndVim9Failure(lines, 'E741:')
|
||||||
|
call assert_equal(10, g:constvar)
|
||||||
|
unlet g:constvar
|
||||||
|
|
||||||
|
let g:constvar = 10
|
||||||
|
lockvar 0 g:constvar
|
||||||
|
call v9.CheckLegacyAndVim9Failure(lines, 'E1122:')
|
||||||
|
call assert_equal(10, g:constvar)
|
||||||
|
unlet g:constvar
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
/1/5/2/s/\n
|
/1/5/2/s/\n
|
||||||
|
@@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
665,
|
||||||
/**/
|
/**/
|
||||||
664,
|
664,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user