summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2023-06-23 04:17:23 +0800
committerGitHub <noreply@github.com>2023-06-22 22:17:23 +0200
commit88114948c41f38d7366dc8d80abc09f00c2492fa (patch)
tree848d685b344c63cff130c19a8d8f013a523e95c3
parentd137a3b52af1a83cd9617e47b63d7b3d6c4d935b (diff)
downloadNim-88114948c41f38d7366dc8d80abc09f00c2492fa.tar.gz
fixes #21110; duplicate proc definitions for inline iters (#21136)
fixes #21110; duplicate proc definitions for iters
-rw-r--r--compiler/transf.nim8
-rw-r--r--tests/iter/titer.nim15
2 files changed, 23 insertions, 0 deletions
diff --git a/compiler/transf.nim b/compiler/transf.nim
index 24363cad0..0a28fd1a0 100644
--- a/compiler/transf.nim
+++ b/compiler/transf.nim
@@ -324,6 +324,14 @@ proc introduceNewLocalVars(c: PTransf, n: PNode): PNode =
     if a.kind == nkSym:
       n[1] = transformSymAux(c, a)
     return n
+  of nkProcDef: # todo optimize nosideeffects?
+    result = newTransNode(n)
+    let x = freshVar(c, n[namePos].sym)
+    idNodeTablePut(c.transCon.mapping, n[namePos].sym, x)
+    result[namePos] = x # we have to copy proc definitions for iters
+    for i in 1..<n.len:
+      result[i] = introduceNewLocalVars(c, n[i])
+    result[namePos].sym.ast = result
   else:
     result = newTransNode(n)
     for i in 0..<n.len:
diff --git a/tests/iter/titer.nim b/tests/iter/titer.nim
index 3a2450ae3..f32bec2fb 100644
--- a/tests/iter/titer.nim
+++ b/tests/iter/titer.nim
@@ -112,3 +112,18 @@ let res = collect:
       fn2(v2)
 
 doAssert res == @[42, 43, 43, 44]
+
+block: # bug #21110
+  iterator p(): int =
+    when nimvm:
+      yield 0
+    else:
+      yield 0
+
+  template foo =
+    for k in p():
+      let m = ""
+      proc e() = discard m & ""
+      e()
+  static: foo()
+  foo()