From bc2fa6fe32733e06fc5d3064aa94e65fa6d8fac5 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sun, 22 Sep 2024 19:51:51 +0800 Subject: [PATCH] fixes #24147; Copy hook causes an incompatible-pointer-types (#24149) fixes #24147 (cherry picked from commit 5c843d3d60982bb0669107ee67863737f52574ba) --- compiler/liftdestructors.nim | 9 ++++++++- tests/arc/tarc_orc.nim | 13 +++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 4db254d916..84e8319ca8 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -226,7 +226,14 @@ proc fillBodyObjTImpl(c: var TLiftCtx; t: PType, body, x, y: PNode) = let obj = newNodeIT(nkHiddenSubConv, c.info, t[0]) obj.add newNodeI(nkEmpty, c.info) obj.add x - fillBody(c, skipTypes(t[0], abstractPtrs), body, obj, y) + var src = y + + if c.kind in {attachedAsgn, attachedDeepCopy, attachedSink}: + src = newNodeIT(nkHiddenSubConv, c.info, t[0]) + src.add newNodeI(nkEmpty, c.info) + src.add y + + fillBody(c, skipTypes(t[0], abstractPtrs), body, obj, src) fillBodyObj(c, t.n, body, x, y, enforceDefaultOp = false) proc fillBodyObjT(c: var TLiftCtx; t: PType, body, x, y: PNode) = diff --git a/tests/arc/tarc_orc.nim b/tests/arc/tarc_orc.nim index 674ba0dbbe..64a701cfaf 100644 --- a/tests/arc/tarc_orc.nim +++ b/tests/arc/tarc_orc.nim @@ -160,3 +160,16 @@ block: testCase() main() + +block: # bug #24147 + type + O = object of RootObj + val: string + OO = object of O + + proc `=copy`(dest: var O, src: O) = + dest.val = src.val + + let oo = OO(val: "hello world") + var ooCopy : OO + `=copy`(ooCopy, oo)