mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
fixes #5015
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user