diff options
-rw-r--r-- | compiler/semtempl.nim | 14 | ||||
-rw-r--r-- | tests/macros/tmemit.nim | 16 |
2 files changed, 29 insertions, 1 deletions
diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index 407da8bdb..b71198119 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -232,6 +232,18 @@ proc semTemplSomeDecl(c: var TemplCtx, n: PNode, symKind: TSymKind) = for j in countup(0, L-3): addLocalDecl(c, a.sons[j], symKind) +proc onlyReplaceParams(c: var TemplCtx, n: PNode): PNode = + result = n + if n.kind == nkIdent: + let s = qualifiedLookUp(c.c, n, {}) + if s != nil: + if s.owner == c.owner and s.kind == skParam: + incl(s.flags, sfUsed) + result = newSymNode(s, n.info) + else: + for i in 0 .. <n.safeLen: + result.sons[i] = onlyReplaceParams(c, n.sons[i]) + proc semPattern(c: PContext, n: PNode): PNode proc semTemplBody(c: var TemplCtx, n: PNode): PNode = result = n @@ -365,6 +377,8 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = result.sons[0] = semTemplBody(c, n.sons[0]) of nkPostfix: result.sons[1] = semTemplBody(c, n.sons[1]) + of nkPragma: + result = onlyReplaceParams(c, n) else: # dotExpr is ambiguous: note that we explicitely allow 'x.TemplateParam', # so we use the generic code for nkDotExpr too diff --git a/tests/macros/tmemit.nim b/tests/macros/tmemit.nim index 6fb2f3b65..e5aed3172 100644 --- a/tests/macros/tmemit.nim +++ b/tests/macros/tmemit.nim @@ -1,7 +1,21 @@ discard """ - output: '''HELLO WORLD''' + output: '''HELLO WORLD +c_func''' """ import macros, strutils emit("echo " & '"' & "hello world".toUpper & '"') + +# bug #1025 + +macro foo(icname): stmt = + let ic = newStrLitNode($icname) + result = quote do: + proc x* = + proc private {.exportc: `ic`.} = discard + echo `ic` + private() + +foo(c_func) +x() |