fixes #24764; cross-module sink analysis broken (#24862)

fixes  #24764

It now consumes the `conv(x)` arg for the explicit sinking. So the
explicit sinking is kept as it is.

Follows up https://github.com/nim-lang/Nim/pull/20585

Related issues: https://github.com/nim-lang/Nim/issues/20572

Probably the same needs to be applied to explicit `copy` to prevent a
copy turning into a sink

(cherry picked from commit 42df731a2d)
This commit is contained in:
ringabout
2025-04-12 12:47:57 +08:00
committed by narimiran
parent 3c8be5b63f
commit 96f5b693ba
3 changed files with 30 additions and 1 deletions

View File

@@ -1197,7 +1197,10 @@ proc moveOrCopy(dest, ri: PNode; c: var Con; s: var Scope, flags: set[MoveOrCopy
result.add p(ri, c, s, consumed)
c.finishCopy(result, dest, flags, isFromSink = false)
of nkHiddenSubConv, nkHiddenStdConv, nkConv, nkObjDownConv, nkObjUpConv, nkCast:
result = c.genSink(s, dest, p(ri, c, s, sinkArg), flags)
if IsExplicitSink in flags:
result = c.genSink(s, dest, p(ri, c, s, consumed), flags)
else:
result = c.genSink(s, dest, p(ri, c, s, sinkArg), flags)
of nkStmtListExpr, nkBlockExpr, nkIfExpr, nkCaseStmt, nkTryStmt, nkPragmaBlock:
template process(child, s): untyped = moveOrCopy(dest, child, c, s, flags)
# We know the result will be a stmt so we use that fact to optimize

4
tests/arc/m24764.nim Normal file
View File

@@ -0,0 +1,4 @@
type QObject* {.inheritable.} = object
proc `=destroy`(self: var QObject) = discard
proc `=sink`(dest: var QObject, source: QObject) = discard
proc `=copy`(dest: var QObject, source: QObject) {.error.}

22
tests/arc/t24764.nim Normal file
View File

@@ -0,0 +1,22 @@
discard """
matrix: "--mm:arc"
"""
import m24764
type QWidget* = object of QObject
proc `=copy`(dest: var QWidget, source: QWidget) {.error.}
proc `=sink`(dest: var QWidget, source: QWidget) =
`=sink`(QObject(dest), QObject(source))
proc show(v: QWidget) = discard
proc main() =
let btn = QWidget()
let tmp = proc() =
btn.show()
btn.show()
main()