fixes #5015
This commit is contained in:
parent
bf85955802
commit
c92fdb24c8
2 changed files with 22 additions and 3 deletions
|
|
@ -2079,7 +2079,7 @@ proc isConstClosure(n: PNode): bool {.inline.} =
|
||||||
n.sons[1].kind == nkNilLit
|
n.sons[1].kind == nkNilLit
|
||||||
|
|
||||||
proc genClosure(p: BProc, n: PNode, d: var TLoc) =
|
proc genClosure(p: BProc, n: PNode, d: var TLoc) =
|
||||||
assert n.kind == nkClosure
|
assert n.kind in {nkPar, nkTupleConstr, nkClosure}
|
||||||
|
|
||||||
if isConstClosure(n):
|
if isConstClosure(n):
|
||||||
inc(p.module.labels)
|
inc(p.module.labels)
|
||||||
|
|
@ -2337,7 +2337,9 @@ proc expr(p: BProc, n: PNode, d: var TLoc) =
|
||||||
else:
|
else:
|
||||||
genArrayConstr(p, n, d)
|
genArrayConstr(p, n, d)
|
||||||
of nkPar, nkTupleConstr:
|
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)
|
exprComplexConst(p, n, d)
|
||||||
else:
|
else:
|
||||||
genTupleConstr(p, n, d)
|
genTupleConstr(p, n, d)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
discard """
|
discard """
|
||||||
file: "tclosure.nim"
|
file: "tclosure.nim"
|
||||||
output: "1 3 6 11 20"
|
output: '''1 3 6 11 20 foo'''
|
||||||
"""
|
"""
|
||||||
# Test the closure implementation
|
# Test the closure implementation
|
||||||
|
|
||||||
|
|
@ -45,3 +45,20 @@ proc getInterf(): ITest =
|
||||||
return (setter: proc (x: int) = shared = x,
|
return (setter: proc (x: int) = shared = x,
|
||||||
getter: proc (): int = return shared)
|
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")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue