summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/pure/sugar.nim2
-rw-r--r--tests/stdlib/tsugar.nim16
2 files changed, 17 insertions, 1 deletions
diff --git a/lib/pure/sugar.nim b/lib/pure/sugar.nim
index 5cece12b6..cc681a0a6 100644
--- a/lib/pure/sugar.nim
+++ b/lib/pure/sugar.nim
@@ -242,7 +242,7 @@ macro capture*(locals: varargs[typed], body: untyped): untyped {.since: (1, 1).}
       error("The variable name cannot be `result`!", arg)
     params.add(newIdentDefs(ident(arg.strVal), freshIdentNodes getTypeInst arg))
   result = newNimNode(nnkCall)
-  result.add(newProc(newEmptyNode(), params, body, nnkProcDef))
+  result.add(newProc(newEmptyNode(), params, body, nnkLambda))
   for arg in locals: result.add(arg)
 
 since (1, 1):
diff --git a/tests/stdlib/tsugar.nim b/tests/stdlib/tsugar.nim
index 968a4ccae..72abadae7 100644
--- a/tests/stdlib/tsugar.nim
+++ b/tests/stdlib/tsugar.nim
@@ -79,6 +79,22 @@ template main() =
             closure2 = () => (i, j)
     doAssert closure2() == (5, 3)
 
+    block: # bug #16967
+      var s = newSeq[proc (): int](5)
+      {.push exportc.}
+      proc bar() =
+        for i in 0 ..< s.len:
+          let foo = i + 1
+          capture foo:
+            s[i] = proc(): int = foo
+      {.pop.}
+
+      bar()
+
+      for i, p in s.pairs:
+        let foo = i + 1
+        doAssert p() == foo
+
   block: # dup
     block dup_with_field:
       type