comparison 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
comparison
equal deleted inserted replaced
24439:21feee770b96 24440:d2f9bdd938fa
1349 } 1349 }
1350 else if (op != NULL && *op != '=') 1350 else if (op != NULL && *op != '=')
1351 { 1351 {
1352 typval_T tv; 1352 typval_T tv;
1353 1353
1354 if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) 1354 if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
1355 && (flags & ASSIGN_FOR_LOOP) == 0)
1355 { 1356 {
1356 emsg(_(e_cannot_mod)); 1357 emsg(_(e_cannot_mod));
1357 *endp = cc; 1358 *endp = cc;
1358 return; 1359 return;
1359 } 1360 }
1388 else if (lp->ll_range) 1389 else if (lp->ll_range)
1389 { 1390 {
1390 listitem_T *ll_li = lp->ll_li; 1391 listitem_T *ll_li = lp->ll_li;
1391 int ll_n1 = lp->ll_n1; 1392 int ll_n1 = lp->ll_n1;
1392 1393
1393 if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) 1394 if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
1395 && (flags & ASSIGN_FOR_LOOP) == 0)
1394 { 1396 {
1395 emsg(_("E996: Cannot lock a range")); 1397 emsg(_("E996: Cannot lock a range"));
1396 return; 1398 return;
1397 } 1399 }
1398 1400
1447 else 1449 else
1448 { 1450 {
1449 /* 1451 /*
1450 * Assign to a List or Dictionary item. 1452 * Assign to a List or Dictionary item.
1451 */ 1453 */
1452 if (flags & (ASSIGN_CONST | ASSIGN_FINAL)) 1454 if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
1455 && (flags & ASSIGN_FOR_LOOP) == 0)
1453 { 1456 {
1454 emsg(_("E996: Cannot lock a list or dict")); 1457 emsg(_("E996: Cannot lock a list or dict"));
1455 return; 1458 return;
1456 } 1459 }
1457 1460
1773 int 1776 int
1774 next_for_item(void *fi_void, char_u *arg) 1777 next_for_item(void *fi_void, char_u *arg)
1775 { 1778 {
1776 forinfo_T *fi = (forinfo_T *)fi_void; 1779 forinfo_T *fi = (forinfo_T *)fi_void;
1777 int result; 1780 int result;
1778 int flag = in_vim9script() ? ASSIGN_DECL : 0; 1781 int flag = ASSIGN_FOR_LOOP | (in_vim9script()
1782 ? (ASSIGN_FINAL | ASSIGN_DECL | ASSIGN_NO_MEMBER_TYPE)
1783 : 0);
1779 listitem_T *item; 1784 listitem_T *item;
1780 1785
1781 if (fi->fi_blob != NULL) 1786 if (fi->fi_blob != NULL)
1782 { 1787 {
1783 typval_T tv; 1788 typval_T tv;