diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-04-05 14:56:39 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-05 08:56:39 +0200 |
commit | f175c81079bdab39a70d6a29311e0dfba34f612c (patch) | |
tree | c9111e88ec7cea47cd5f428b8e3194e63462b167 | |
parent | fc48c7e6155d4e3f4991f90ab3fb37484c6fbdc2 (diff) | |
download | Nim-f175c81079bdab39a70d6a29311e0dfba34f612c.tar.gz |
fixes #23440; fixes destruction for temporary object subclass (#23452)
fixes #23440
-rw-r--r-- | compiler/injectdestructors.nim | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 598fb560b..115ef29c0 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -773,6 +773,18 @@ proc pRaiseStmt(n: PNode, c: var Con; s: var Scope): PNode = result.add copyNode(n[0]) s.needsTry = true +template isCustomDestructor(c: Con, t: PType): bool = + hasDestructor(c, t) and + getAttachedOp(c.graph, t, attachedDestructor) != nil and + sfOverridden in getAttachedOp(c.graph, t, attachedDestructor).flags + +proc hasCustomDestructor(c: Con, t: PType): bool = + result = isCustomDestructor(c, t) + var obj = t + while obj.baseClass != nil: + obj = skipTypes(obj.baseClass, abstractPtrs) + result = result or isCustomDestructor(c, obj) + proc p(n: PNode; c: var Con; s: var Scope; mode: ProcessMode; tmpFlags = {sfSingleUsedTemp}; inReturn = false): PNode = if n.kind in {nkStmtList, nkStmtListExpr, nkBlockStmt, nkBlockExpr, nkIfStmt, nkIfExpr, nkCaseStmt, nkWhen, nkWhileStmt, nkParForStmt, nkTryStmt, nkPragmaBlock}: @@ -863,9 +875,7 @@ proc p(n: PNode; c: var Con; s: var Scope; mode: ProcessMode; tmpFlags = {sfSing result[i][1] = p(n[i][1], c, s, m) else: result[i] = p(n[i], c, s, m) - if mode == normal and (isRefConstr or (hasDestructor(c, t) and - getAttachedOp(c.graph, t, attachedDestructor) != nil and - sfOverridden in getAttachedOp(c.graph, t, attachedDestructor).flags)): + if mode == normal and (isRefConstr or hasCustomDestructor(c, t)): result = ensureDestruction(result, n, c, s) of nkCallKinds: if n[0].kind == nkSym and n[0].sym.magic == mEnsureMove: |