From 799e0f3274edd9d0fadcc58640afa32b3bdc6da1 Mon Sep 17 00:00:00 2001 From: Araq Date: Sun, 9 Aug 2015 23:53:22 +0200 Subject: [PATCH] fixes #3066 --- compiler/vmgen.nim | 3 +++ tests/vm/tforwardproc.nim | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/vm/tforwardproc.nim diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 6a59b33840..73fcc5a27a 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -1184,6 +1184,9 @@ proc checkCanEval(c: PCtx; n: PNode) = if s.kind in {skVar, skTemp, skLet, skParam, skResult} and not s.isOwnedBy(c.prc.sym) and s.owner != c.module: cannotEval(n) + elif s.kind in {skProc, skConverter, skMethod, + skIterator, skClosureIterator} and sfForward in s.flags: + cannotEval(n) proc isTemp(c: PCtx; dest: TDest): bool = result = dest >= 0 and c.prc.slots[dest].kind >= slotTempUnknown diff --git a/tests/vm/tforwardproc.nim b/tests/vm/tforwardproc.nim new file mode 100644 index 0000000000..727ac66415 --- /dev/null +++ b/tests/vm/tforwardproc.nim @@ -0,0 +1,17 @@ +discard """ + errormsg: "cannot evaluate at compile time: initArray" + line: 11 +""" + +# bug #3066 + +proc initArray(): array[10, int] + +const + someTable = initArray() + +proc initArray(): array[10, int] = + for f in 0..<10: + result[f] = 3 + +when isMainModule: echo repr(someTable)