diff options
author | Araq <rumpf_a@web.de> | 2014-11-06 00:21:39 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-11-06 00:21:39 +0100 |
commit | ee9c70e0348b0586d69faa06d2ed1655bb216a6a (patch) | |
tree | 7f014a9780c79e300436395b5c74477138813745 | |
parent | b13c51cc2aa1f47bc95c4c45d02c04bc3cff783e (diff) | |
download | Nim-ee9c70e0348b0586d69faa06d2ed1655bb216a6a.tar.gz |
user defined pragmas work for generics instantiated in different modules
-rw-r--r-- | compiler/pragmas.nim | 14 | ||||
-rw-r--r-- | compiler/semstmts.nim | 2 |
2 files changed, 12 insertions, 4 deletions
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 52eb46bf4..b548837fe 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -71,7 +71,7 @@ const proc pragma*(c: PContext, sym: PSym, n: PNode, validPragmas: TSpecialWords) # implementation -proc invalidPragma(n: PNode) = +proc invalidPragma(n: PNode) = localError(n.info, errInvalidPragmaX, renderTree(n, {renderNoComments})) proc pragmaAsm*(c: PContext, n: PNode): char = @@ -601,6 +601,9 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int, if c.instCounter > 100: globalError(it.info, errRecursiveDependencyX, userPragma.name.s) pragma(c, sym, userPragma.ast, validPragmas) + # ensure the pragma is also remember for generic instantiations in other + # modules: + n.sons[i] = userPragma.ast dec c.instCounter else: var k = whichKeyword(key.ident) @@ -883,8 +886,13 @@ proc hasPragma*(n: PNode, pragma: TSpecialWord): bool = return false -proc pragma(c: PContext, sym: PSym, n: PNode, validPragmas: TSpecialWords) = +proc pragmaRec(c: PContext, sym: PSym, n: PNode, validPragmas: TSpecialWords) = if n == nil: return for i in countup(0, sonsLen(n) - 1): - if singlePragma(c, sym, n, i, validPragmas): break + if n.sons[i].kind == nkPragma: pragmaRec(c, sym, n.sons[i], validPragmas) + elif singlePragma(c, sym, n, i, validPragmas): break + +proc pragma(c: PContext, sym: PSym, n: PNode, validPragmas: TSpecialWords) = + if n == nil: return + pragmaRec(c, sym, n, validPragmas) implicitPragmas(c, sym, n, validPragmas) diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 255507548..c6906d98e 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1145,7 +1145,7 @@ proc semProcAux(c: PContext, n: PNode, kind: TSymKind, pragma(c, s, n.sons[pragmasPos], validPragmas) else: implicitPragmas(c, s, n, validPragmas) - else: + else: if n.sons[pragmasPos].kind != nkEmpty: localError(n.sons[pragmasPos].info, errPragmaOnlyInHeaderOfProc) if sfForward notin proto.flags: |