diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-04-24 18:47:05 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-24 12:47:05 +0200 |
commit | cd3cf3a20e7bf6a115cd836ccc0c55ab07bcf3e9 (patch) | |
tree | b01d787154ef22d1e7f328f808533a43025a449e /compiler | |
parent | 7e3bac92357b6fc3f959bdf81b2ad58c2111f8ab (diff) | |
download | Nim-cd3cf3a20e7bf6a115cd836ccc0c55ab07bcf3e9.tar.gz |
fixes #23524; global variables cannot be analysed when injecting `move` (#23529)
fixes #23524 ```nim proc isAnalysableFieldAccess*(orig: PNode; owner: PSym): bool = ... result = n.kind == nkSym and n.sym.owner == owner and {sfGlobal, sfThread, sfCursor} * n.sym.flags == {} and (n.sym.kind != skParam or isSinkParam(n.sym)) ``` In `isAnalysableFieldAccess`, globals, cursors are already rejected
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/injectdestructors.nim | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 6b7676653..85d7a65d2 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -1186,9 +1186,9 @@ proc moveOrCopy(dest, ri: PNode; c: var Con; s: var Scope, flags: set[MoveOrCopy # Rule 3: `=sink`(x, z); wasMoved(z) 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) and - not ({sfGlobal, sfPure} <= ri.sym.flags): + elif ri.sym.kind != skParam and + isAnalysableFieldAccess(ri, c.owner) and + isLastRead(ri, c, s) and canBeMoved(c, dest.typ): # Rule 3: `=sink`(x, z); wasMoved(z) let snk = c.genSink(s, dest, ri, flags) result = newTree(nkStmtList, snk, c.genWasMoved(ri)) |