mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-01 10:52:14 +00:00
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:
@@ -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
4
tests/arc/m24764.nim
Normal 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
22
tests/arc/t24764.nim
Normal 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()
|
||||
Reference in New Issue
Block a user