This commit is contained in:
Araq
2018-10-03 00:00:19 +02:00
parent bf85955802
commit c92fdb24c8
2 changed files with 22 additions and 3 deletions

View File

@@ -2079,7 +2079,7 @@ proc isConstClosure(n: PNode): bool {.inline.} =
n.sons[1].kind == nkNilLit
proc genClosure(p: BProc, n: PNode, d: var TLoc) =
assert n.kind == nkClosure
assert n.kind in {nkPar, nkTupleConstr, nkClosure}
if isConstClosure(n):
inc(p.module.labels)
@@ -2337,7 +2337,9 @@ proc expr(p: BProc, n: PNode, d: var TLoc) =
else:
genArrayConstr(p, n, d)
of nkPar, nkTupleConstr:
if isDeepConstExpr(n) and n.len != 0:
if n.typ != nil and n.typ.kind == tyProc and n.len == 2:
genClosure(p, n, d)
elif isDeepConstExpr(n) and n.len != 0:
exprComplexConst(p, n, d)
else:
genTupleConstr(p, n, d)

View File

@@ -1,6 +1,6 @@
discard """
file: "tclosure.nim"
output: "1 3 6 11 20"
output: '''1 3 6 11 20 foo'''
"""
# Test the closure implementation
@@ -45,3 +45,20 @@ proc getInterf(): ITest =
return (setter: proc (x: int) = shared = x,
getter: proc (): int = return shared)
# bug #5015
type Mutator* = proc(matched: string): string {.noSideEffect, gcsafe, locks: 0.}
proc putMutated*(
MutatorCount: static[int],
mTable: static[array[MutatorCount, Mutator]], input: string) =
for i in 0..<MutatorCount: echo mTable[i](input)
proc mutator0(matched: string): string =
"foo"
const
mTable = [Mutator(mutator0)]
putMutated(1, mTable, "foo")