Mercurial > vim
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; |