diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index a524e71da..4591c3942 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1361,7 +1361,9 @@ proc semQuoteAst(c: PContext, n: PNode): PNode = ids = newSeq[PNode]() # this will store the generated param names - internalAssert doBlk.kind == nkDo + if doBlk.kind != nkDo: + LocalError(n.info, errXExpected, "block") + processQuotations(doBlk.sons[bodyPos], op, quotes, ids) doBlk.sons[namePos] = newAnonSym(skTemplate, n.info).newSymNode diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index f2e4fb02e..7dec557be 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -448,8 +448,11 @@ proc track(tracked: PEffects, n: PNode) = # p's effects are ours too: let a = n.sons[0] let op = a.typ - if op != nil and op.kind == tyProc: - InternalAssert op.n.sons[0].kind == nkEffectList + # XXX: in rare situations, templates and macros will reach here after + # calling getAst(templateOrMacro()). Currently, templates and macros + # are indistinguishable from normal procs (both have tyProc type) and + # we can detect them only by cheking for attached nkEffectList. + if op != nil and op.kind == tyProc and op.n.sons[0].kind == nkEffectList: var effectList = op.n.sons[0] if a.kind == nkSym and a.sym.kind == skMethod: propagateEffects(tracked, n, a.sym)