* fix #16967 [backport:1.2] * move test to tsugar
This commit is contained in:
parent
41d32c3ea3
commit
49ee2f7f3b
2 changed files with 17 additions and 1 deletions
|
|
@ -242,7 +242,7 @@ macro capture*(locals: varargs[typed], body: untyped): untyped {.since: (1, 1).}
|
||||||
error("The variable name cannot be `result`!", arg)
|
error("The variable name cannot be `result`!", arg)
|
||||||
params.add(newIdentDefs(ident(arg.strVal), freshIdentNodes getTypeInst arg))
|
params.add(newIdentDefs(ident(arg.strVal), freshIdentNodes getTypeInst arg))
|
||||||
result = newNimNode(nnkCall)
|
result = newNimNode(nnkCall)
|
||||||
result.add(newProc(newEmptyNode(), params, body, nnkProcDef))
|
result.add(newProc(newEmptyNode(), params, body, nnkLambda))
|
||||||
for arg in locals: result.add(arg)
|
for arg in locals: result.add(arg)
|
||||||
|
|
||||||
since (1, 1):
|
since (1, 1):
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,22 @@ template main() =
|
||||||
closure2 = () => (i, j)
|
closure2 = () => (i, j)
|
||||||
doAssert closure2() == (5, 3)
|
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
|
||||||
block dup_with_field:
|
block dup_with_field:
|
||||||
type
|
type
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue