Mercurial > vim
diff src/eval.c @ 24440:d2f9bdd938fa v8.2.2760
patch 8.2.2760: Vim9: no error for changing a for loop variable
Commit: https://github.com/vim/vim/commit/f6a8d420a8d2924737f713de046947dcb487550c
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Apr 13 21:48:03 2021 +0200
patch 8.2.2760: Vim9: no error for changing a for loop variable
Problem: Vim9: no error for changing a for loop variable.
Solution: Make the loop variable read-only. (issue https://github.com/vim/vim/issues/8102)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 13 Apr 2021 22:00:05 +0200 |
parents | 602e528a8e43 |
children | 3e1886f1e875 |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -1351,7 +1351,8 @@ set_var_lval( { typval_T tv; - if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) + if ((flags & (ASSIGN_CONST | ASSIGN_FINAL)) + && (flags & ASSIGN_FOR_LOOP) == 0) { emsg(_(e_cannot_mod)); *endp = cc; @@ -1390,7 +1391,8 @@ set_var_lval( listitem_T *ll_li = lp->ll_li; int ll_n1 = lp->ll_n1; - if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) + if ((flags & (ASSIGN_CONST | ASSIGN_FINAL)) + && (flags & ASSIGN_FOR_LOOP) == 0) { emsg(_("E996: Cannot lock a range")); return; @@ -1449,7 +1451,8 @@ set_var_lval( /* * Assign to a List or Dictionary item. */ - if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) + if ((flags & (ASSIGN_CONST | ASSIGN_FINAL)) + && (flags & ASSIGN_FOR_LOOP) == 0) { emsg(_("E996: Cannot lock a list or dict")); return; @@ -1775,7 +1778,9 @@ next_for_item(void *fi_void, char_u *arg { forinfo_T *fi = (forinfo_T *)fi_void; int result; - int flag = in_vim9script() ? ASSIGN_DECL : 0; + int flag = ASSIGN_FOR_LOOP | (in_vim9script() + ? (ASSIGN_FINAL | ASSIGN_DECL | ASSIGN_NO_MEMBER_TYPE) + : 0); listitem_T *item; if (fi->fi_blob != NULL)