diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 773b87e2ce..0df5d2020f 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -1307,7 +1307,7 @@ proc implicitPragmas*(c: PContext, sym: PSym, info: TLineInfo, if sym != nil and sym.kind != skModule: for it in c.optionStack: let o = it.otherPragmas - if not o.isNil: + if not o.isNil and sfFromGeneric notin sym.flags: # see issue #12985 pushInfoContext(c.config, info) var i = 0 while i < o.len: diff --git a/compiler/seminst.nim b/compiler/seminst.nim index 502b287dbf..8d50a1c37e 100644 --- a/compiler/seminst.nim +++ b/compiler/seminst.nim @@ -386,17 +386,11 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable, entry.compilesId = c.compilesContextId addToGenericProcCache(c, fn, entry) c.generics.add(makeInstPair(fn, entry)) - # bug #12985 bug #22913 - # TODO: use the context of the declaration of generic functions instead - # TODO: consider fixing options as well - let otherPragmas = c.optionStack[^1].otherPragmas - c.optionStack[^1].otherPragmas = nil if n[pragmasPos].kind != nkEmpty: pragma(c, result, n[pragmasPos], allRoutinePragmas) if isNil(n[bodyPos]): n[bodyPos] = copyTree(getBody(c.graph, fn)) instantiateBody(c, n, fn.typ.n, result, fn) - c.optionStack[^1].otherPragmas = otherPragmas sideEffectsCheck(c, result) if result.magic notin {mSlice, mTypeOf}: # 'toOpenArray' is special and it is allowed to return 'openArray': diff --git a/tests/pragmas/tpush.nim b/tests/pragmas/tpush.nim index 6a95f1ca00..6d7eade91f 100644 --- a/tests/pragmas/tpush.nim +++ b/tests/pragmas/tpush.nim @@ -38,42 +38,3 @@ proc main(): void = {.push staticBoundChecks: on.} main() - - -proc timnFoo[T](obj: T) {.noSideEffect.} = discard # BUG - -{.push exportc.} -proc foo1() = - var s1 = "bar" - timnFoo(s1) - var s2 = @[1] - timnFoo(s2) -{.pop.} - - -block: # bug #22913 - block: - type r = object - - template std[T](x: T) = - let ttt {.used.} = x - result = $ttt - - proc bar[T](x: T): string = - std(x) - - {.push exportc: "$1".} - proc foo(): r = - let s = bar(123) - {.pop.} - - discard foo() - - block: - type r = object - {.push exportc: "$1".} - proc foo2(): r = - let s = $result - {.pop.} - - discard foo2()