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)