diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-09-22 19:51:51 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-22 13:51:51 +0200 |
commit | 5c843d3d60982bb0669107ee67863737f52574ba (patch) | |
tree | b185885362f864d000578ff72c6de252fc51c071 | |
parent | a1777200c1a52b5a71d641309349618df2550b33 (diff) | |
download | Nim-5c843d3d60982bb0669107ee67863737f52574ba.tar.gz |
fixes #24147; Copy hook causes an incompatible-pointer-types (#24149)
fixes #24147
-rw-r--r-- | compiler/liftdestructors.nim | 14 | ||||
-rw-r--r-- | tests/arc/tarc_orc.nim | 13 |
2 files changed, 23 insertions, 4 deletions
diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 2cf8afb62..9ff5c0a9d 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -224,10 +224,16 @@ proc fillBodyObj(c: var TLiftCtx; n, body, x, y: PNode; enforceDefaultOp: bool, proc fillBodyObjTImpl(c: var TLiftCtx; t: PType, body, x, y: PNode) = if t.baseClass != nil: - let obj = newNodeIT(nkHiddenSubConv, c.info, t.baseClass) - obj.add newNodeI(nkEmpty, c.info) - obj.add x - fillBody(c, skipTypes(t.baseClass, abstractPtrs), body, obj, y) + let dest = newNodeIT(nkHiddenSubConv, c.info, t.baseClass) + dest.add newNodeI(nkEmpty, c.info) + dest.add x + var src = y + if c.kind in {attachedAsgn, attachedDeepCopy, attachedSink}: + src = newNodeIT(nkHiddenSubConv, c.info, t.baseClass) + src.add newNodeI(nkEmpty, c.info) + src.add y + + fillBody(c, skipTypes(t.baseClass, abstractPtrs), body, dest, 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 0e6208b4a..f2c7de2fc 100644 --- a/tests/arc/tarc_orc.nim +++ b/tests/arc/tarc_orc.nim @@ -171,3 +171,16 @@ block: # bug #23858 return Object() discard fn() doAssert x == 1 + +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) |