diff options
-rw-r--r-- | lib/pure/sugar.nim | 2 | ||||
-rw-r--r-- | tests/stdlib/tsugar.nim | 16 |
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 |