diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2021-01-01 13:55:22 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-01 22:55:22 +0100 |
commit | 0d0e43469f060818ec09d74de5b0bb7ded891898 (patch) | |
tree | 7e570f3554302ad90231ec36d12c39c9fc5771c8 | |
parent | 505d04389ad5c83b50001e3108d89fcdec9c462f (diff) | |
download | Nim-0d0e43469f060818ec09d74de5b0bb7ded891898.tar.gz |
fix #14340 (#16386)
-rw-r--r-- | compiler/ccgexprs.nim | 4 | ||||
-rw-r--r-- | tests/vm/tvmmisc.nim | 17 |
2 files changed, 20 insertions, 1 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 45044e0ff..53b2832f0 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -3094,7 +3094,9 @@ proc genBracedInit(p: BProc, n: PNode; isConst: bool; optionalType: PType): Rope else: result = genConstSeq(p, n, typ, isConst) of tyProc: - if typ.callConv == ccClosure and n.len > 1 and n[1].kind == nkNilLit: + if typ.callConv == ccClosure and n.safeLen > 1 and n[1].kind == nkNilLit: + # n.kind could be: nkClosure, nkTupleConstr and maybe others; `n.safeLen` + # guards against the case of `nkSym`, refs bug #14340. # Conversion: nimcall -> closure. # this hack fixes issue that nkNilLit is expanded to {NIM_NIL,NIM_NIL} # this behaviour is needed since closure_var = nil must be diff --git a/tests/vm/tvmmisc.nim b/tests/vm/tvmmisc.nim index 005f7e255..c1e563806 100644 --- a/tests/vm/tvmmisc.nim +++ b/tests/vm/tvmmisc.nim @@ -306,6 +306,23 @@ block: # bug #8007 const d = @[Cost(kind: Fixed, cost: 999), Cost(kind: Dynamic, handler: foo)] doAssert $d == "@[(kind: Fixed, cost: 999), (kind: Dynamic, handler: ...)]" +block: # bug #14340 + block: + proc opl3EnvelopeCalcSin0() = discard + type EnvelopeSinfunc = proc() + # const EnvelopeCalcSin0 = opl3EnvelopeCalcSin0 # ok + const EnvelopeCalcSin0: EnvelopeSinfunc = opl3EnvelopeCalcSin0 # was bug + const envelopeSin = [EnvelopeCalcSin0] + var a = 0 + envelopeSin[a]() + + block: + type Mutator = proc() {.noSideEffect, gcsafe, locks: 0.} + proc mutator0() = discard + const mTable = [Mutator(mutator0)] + var i=0 + mTable[i]() + block: # VM wrong register free causes errors in unrelated code block: # bug #15597 #[ |