Fixes #11045. Assigning a proc to const and invoking. (#11076)

This commit is contained in:
Aditya Siram
2019-05-04 15:57:16 -05:00
committed by Andreas Rumpf
parent 45759b5e90
commit cc2be5e4c6
2 changed files with 26 additions and 4 deletions

View File

@@ -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

View File

@@ -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()