Skip to content

Commit fd9ffb8

Browse files
authored
[mypyc] Fix for loop over range mutating start variable (#8672)
Don't modify the range start variable in a loop like this: ``` def f() -> None: n = 0 for x in range(n, 5): pass print(n) # Should be 0, not 5 ```
1 parent 2bbe22a commit fd9ffb8

2 files changed

Lines changed: 6 additions & 1 deletion

File tree

mypyc/irbuild/for_helpers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,9 @@ def init(self, start_reg: Value, end_reg: Value, step: int) -> None:
441441
self.end_reg = end_reg
442442
self.step = step
443443
self.end_target = builder.maybe_spill(end_reg)
444-
self.index_reg = builder.maybe_spill_assignable(start_reg)
444+
index_reg = builder.alloc_temp(start_reg.type)
445+
builder.assign(index_reg, start_reg, -1)
446+
self.index_reg = builder.maybe_spill_assignable(index_reg)
445447
# Initialize loop index to 0. Assert that the index target is assignable.
446448
self.index_target = builder.get_assignment_target(
447449
self.index) # type: Union[Register, AssignmentTarget]

mypyc/test-data/run.test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def count(n: int) -> None:
5151
def count_between(n: int, k: int) -> None:
5252
for i in range(n, k):
5353
print(i)
54+
print('n=', n)
5455
def count_down(n: int, k: int) -> None:
5556
for i in range(n, k, -1):
5657
print(i)
@@ -115,9 +116,11 @@ str_iter("abc")
115116
12
116117
13
117118
14
119+
n= 11
118120
100000000000000000000
119121
100000000000000000001
120122
100000000000000000002
123+
n= 100000000000000000000
121124
20
122125
19
123126
18

0 commit comments

Comments
 (0)