Skip to content

Commit 31d64b5

Browse files
authored
fixes #25046; Infinite loop with anonymous iterator (#25221)
fixes #25046 ```nim proc makeiter(v: string): iterator(): string = return iterator(): string = yield v # loops for c in makeiter("test")(): echo "loops ", c ``` becomes ```nim var temp = makeiter("test") for c in temp(): echo "loops ", c ``` for closures that might have side effects
1 parent 2be0721 commit 31d64b5

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

compiler/lambdalifting.nim

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,20 @@ proc liftForLoop*(g: ModuleGraph; body: PNode; idgen: IdGenerator; owner: PSym):
975975
for i in 0..<op.len-1:
976976
result.add op[i]
977977

978+
elif op.kind != nkSym: # might have side effects
979+
# bug #25046
980+
# create a temp for the closure
981+
# var :closureTemp
982+
# :closureTemp = ...
983+
let tempSym = newSym(skLet, getIdent(g.cache, ":closureTemp"), idgen, owner, body.info)
984+
tempSym.typ = call[0].typ
985+
let temp = newSymNode(tempSym)
986+
var v = newNodeI(nkVarSection, body.info)
987+
addVar(v, temp)
988+
result.add(v)
989+
result.add newAsgnStmt(temp, call[0], body.info)
990+
call[0] = temp
991+
978992
var loopBody = newNodeI(nkStmtList, body.info, 3)
979993
var whileLoop = newNodeI(nkWhileStmt, body.info, 2)
980994
whileLoop[0] = newIntTypeNode(1, getSysType(g, body.info, tyBool))

tests/closure/tnested.nim

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,23 @@ block:
213213
discard call2()
214214

215215
pork()
216+
217+
# bug #25046
218+
proc makeiter(v: string): iterator(): string =
219+
return iterator(): string =
220+
yield v
221+
222+
var flag = ""
223+
224+
var iter = makeiter("test1")
225+
for c in iter():
226+
flag = c
227+
228+
assert flag == "test1"
229+
230+
# loops
231+
for c in makeiter("test2")():
232+
flag = c
233+
234+
assert flag == "test2"
235+

0 commit comments

Comments
 (0)