mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
* fix #15005 [ARC] Global variable declared in a block is destroyed too early
This commit is contained in:
@@ -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
18
tests/global/t15005.nim
Normal 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()
|
||||
Reference in New Issue
Block a user