diff options
-rw-r--r-- | compiler/semexprs.nim | 12 | ||||
-rw-r--r-- | tests/vm/tconstprocassignments.nim | 18 |
2 files changed, 26 insertions, 4 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index ead9dab27..0d81cab37 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -709,13 +709,17 @@ proc evalAtCompileTime(c: PContext, n: PNode): PNode = n.typ.flags.incl tfUnresolved # optimization pass: not necessary for correctness of the semantic pass - if {sfNoSideEffect, sfCompileTime} * callee.flags != {} and + if callee.kind == skConst or + {sfNoSideEffect, sfCompileTime} * callee.flags != {} and {sfForward, sfImportc} * callee.flags == {} and n.typ != nil: - if sfCompileTime notin callee.flags and - optImplicitStatic notin c.config.options: return + + if callee.kind != skConst and + sfCompileTime notin callee.flags and + optImplicitStatic notin c.config.options: return if callee.magic notin ctfeWhitelist: return - if callee.kind notin {skProc, skFunc, skConverter} or callee.isGenericRoutine: + + if callee.kind notin {skProc, skFunc, skConverter, skConst} or callee.isGenericRoutine: return if n.typ != nil and typeAllowed(n.typ, skConst) != nil: return diff --git a/tests/vm/tconstprocassignments.nim b/tests/vm/tconstprocassignments.nim new file mode 100644 index 000000000..0e2d2ed16 --- /dev/null +++ b/tests/vm/tconstprocassignments.nim @@ -0,0 +1,18 @@ +discard """ + output: ''' +100 +100 +''' +""" + +proc f():int {.compileTime.} = 100 + +const F = f +echo F() + +const G = proc ():int = + let x = f + let y = x + y() + +echo G() |