diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 518613c1bd..1cf647978d 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -2449,7 +2449,10 @@ proc handleProcGlobals(m: BModule) = # fixes recursive calls #24997 swap stmts, m.preInitProc.s(cpsStmts) - genStmts(m.preInitProc, procGlobals[i]) + var transformedN = procGlobals[i] + if sfInjectDestructors in m.module.flags: + transformedN = injectDestructorCalls(m.g.graph, m.idgen, m.module, transformedN) + genStmts(m.preInitProc, transformedN) swap stmts, m.preInitProc.s(cpsStmts) handleProcGlobals(m) diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 223783a3f9..7fca0ab2e7 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -968,10 +968,10 @@ proc p(n: PNode; c: var Con; s: var Scope; mode: ProcessMode; tmpFlags = {sfSing {sfPure, sfGlobal} <= v.sym.flags and isInProc - let value = moveOrCopy(v, ri, c, s, if v.kind == nkSym: {IsDecl} else: {}) if isGlobalPragma: - c.graph.procGlobals.add value + c.graph.procGlobals.add n else: + let value = moveOrCopy(v, ri, c, s, if v.kind == nkSym: {IsDecl} else: {}) result.add value elif ri.kind == nkEmpty and c.inLoop > 0: let skipInit = v.kind == nkDotExpr and # Closure var diff --git a/tests/global/tglobal3.nim b/tests/global/tglobal3.nim index 80c1cd640d..b7f3f55391 100644 --- a/tests/global/tglobal3.nim +++ b/tests/global/tglobal3.nim @@ -55,3 +55,10 @@ block: # bug #24997 doAssert not isNil(u(typeof(B.j))) R() discard u(B) + +proc f2(str: string): string = str +proc m2() = + let v {.global, used.}: string = f2(f2("123")) + assert v == "123" + +m2()