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 #8102)
diff --git a/src/eval.c b/src/eval.c
index 2e2ca23..99768ee 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1351,7 +1351,8 @@
{
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 @@
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 @@
/*
* 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 @@
{
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)