fix #15005; [ARC] Global variable declared in a block is destroyed too… (#22388)

* fix #15005 [ARC] Global variable declared in a block is destroyed too early
This commit is contained in:
Bung
2023-08-06 15:46:43 +08:00
committed by GitHub
parent 137d608d7d
commit 95c751a9e4
2 changed files with 20 additions and 1 deletions

View File

@@ -1153,7 +1153,8 @@ proc moveOrCopy(dest, ri: PNode; c: var Con; s: var Scope, flags: set[MoveOrCopy
let snk = c.genSink(s, dest, ri, flags)
result = newTree(nkStmtList, snk, c.genWasMoved(ri))
elif ri.sym.kind != skParam and ri.sym.owner == c.owner and
isLastRead(ri, c, s) and canBeMoved(c, dest.typ) and not isCursor(ri):
isLastRead(ri, c, s) and canBeMoved(c, dest.typ) and not isCursor(ri) and
{sfGlobal, sfPure} <= ri.sym.flags == false:
# Rule 3: `=sink`(x, z); wasMoved(z)
let snk = c.genSink(s, dest, ri, flags)
result = newTree(nkStmtList, snk, c.genWasMoved(ri))

18
tests/global/t15005.nim Normal file
View File

@@ -0,0 +1,18 @@
type
T = ref object
data: string
template foo(): T =
var a15005 {.global.}: T
once:
a15005 = T(data: "hi")
a15005
proc test() =
var b15005 = foo()
doAssert b15005.data == "hi"
test()
test()