Avoid evaluating macros twice in type sections (#10550)

Fixes #10548
This commit is contained in:
LemonBoy
2019-02-06 11:35:44 +01:00
committed by Andreas Rumpf
parent 26255c72fd
commit 6c8dee4180
2 changed files with 20 additions and 0 deletions

View File

@@ -1129,6 +1129,11 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) =
#debug s.typ
s.ast = a
popOwner(c)
# If the right hand side expression was a macro call we replace it with
# its evaluated result here so that we don't execute it once again in the
# final pass
if a[2].kind in nkCallKinds:
a[2] = newNodeIT(nkType, a[2].info, t)
if sfExportc in s.flags and s.typ.kind == tyAlias:
localError(c.config, name.info, "{.exportc.} not allowed for type aliases")
let aa = a.sons[2]

View File

@@ -23,3 +23,18 @@ checkType(voidProc(), "void")
checkType(intProc(10, 20.0), "int")
checkType(voidProc, "procTy")
checkProcType(voidProc)
# bug #10548
block:
var c {.compileTime.} = 0
macro meshImpl(arg: typed): untyped =
inc c
result = arg
type
Blub = int32
Mesh = meshImpl(Club)
Club = Blub
static: doAssert(c == 1)