Skip to content

Commit

Permalink
fixes #22913; fixes #12985 differently push-ing pragma exportc genera…
Browse files Browse the repository at this point in the history
…tes invalid C identifiers
  • Loading branch information
ringabout authored Nov 15, 2023
1 parent 57ffeaf commit cf710e0
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/pragmas.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1313,7 +1313,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 and sfFromGeneric notin sym.flags: # see issue #12985
if not o.isNil: # see issue #12985
pushInfoContext(c.config, info)
var i = 0
while i < o.len:
Expand Down
6 changes: 6 additions & 0 deletions compiler/seminst.nim
Original file line number Diff line number Diff line change
Expand Up @@ -400,11 +400,17 @@ 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':
Expand Down
39 changes: 39 additions & 0 deletions tests/pragmas/tpush.nim
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,42 @@ 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()

0 comments on commit cf710e0

Please sign in to comment.