summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semtempl.nim14
-rw-r--r--tests/macros/tmemit.nim16
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()