@@ -218,23 +218,38 @@ proc fillBodyObj(c: var TLiftCtx; n, body, x, y: PNode; enforceDefaultOp: bool,
218218 fillBodyObj (c, n[0 ], body, x, y, enforceDefaultOp = false )
219219 c.filterDiscriminator = oldfilterDiscriminator
220220 of nkRecList:
221- for t in items (n): fillBodyObj (c, t, body, x, y, enforceDefaultOp, enforceWasMoved)
221+ # destroys in reverse order #24719
222+ if c.kind == attachedDestructor:
223+ for i in countdown (n.len- 1 , 0 ):
224+ fillBodyObj (c, n[i], body, x, y, enforceDefaultOp, enforceWasMoved)
225+ else :
226+ for t in items (n): fillBodyObj (c, t, body, x, y, enforceDefaultOp, enforceWasMoved)
222227 else :
223228 illFormedAstLocal (n, c.g.config)
224229
225230proc fillBodyObjTImpl (c: var TLiftCtx ; t: PType , body, x, y: PNode ) =
226- if t.baseClass != nil :
227- let dest = newNodeIT (nkHiddenSubConv, c.info, t.baseClass)
228- dest.add newNodeI (nkEmpty, c.info)
229- dest.add x
230- var src = y
231- if c.kind in {attachedAsgn, attachedDeepCopy, attachedSink}:
232- src = newNodeIT (nkHiddenSubConv, c.info, t.baseClass)
233- src.add newNodeI (nkEmpty, c.info)
234- src.add y
235-
236- fillBody (c, skipTypes (t.baseClass, abstractPtrs), body, dest, src)
237- fillBodyObj (c, t.n, body, x, y, enforceDefaultOp = false )
231+ template fillBase =
232+ if t.baseClass != nil :
233+ let dest = newNodeIT (nkHiddenSubConv, c.info, t.baseClass)
234+ dest.add newNodeI (nkEmpty, c.info)
235+ dest.add x
236+ var src = y
237+ if c.kind in {attachedAsgn, attachedDeepCopy, attachedSink}:
238+ src = newNodeIT (nkHiddenSubConv, c.info, t.baseClass)
239+ src.add newNodeI (nkEmpty, c.info)
240+ src.add y
241+
242+ fillBody (c, skipTypes (t.baseClass, abstractPtrs), body, dest, src)
243+ template fillFields =
244+ fillBodyObj (c, t.n, body, x, y, enforceDefaultOp = false )
245+
246+ if c.kind == attachedDestructor:
247+ # destroys in reverse order #24719
248+ fillFields ()
249+ fillBase ()
250+ else :
251+ fillBase ()
252+ fillFields ()
238253
239254proc fillBodyObjT (c: var TLiftCtx ; t: PType , body, x, y: PNode ) =
240255 var hasCase = isCaseObj (t.n)
0 commit comments