diff --git a/compiler/aliasanalysis.nim b/compiler/aliasanalysis.nim index e24c6d8e26..8118e83e64 100644 --- a/compiler/aliasanalysis.nim +++ b/compiler/aliasanalysis.nim @@ -8,7 +8,7 @@ const nkBracketExpr, nkDerefExpr, nkHiddenDeref, nkAddr, nkHiddenAddr, nkObjDownConv, nkObjUpConv} - PathKinds1* = {nkHiddenStdConv, nkHiddenSubConv} + PathKinds1* = {nkHiddenStdConv, nkHiddenSubConv, nkCast} proc skipConvDfa*(n: PNode): PNode = result = n @@ -125,4 +125,3 @@ proc aliases*(obj, field: PNode): AliasKind = else: result = maybe else: assert false # unreachable - diff --git a/compiler/dfa.nim b/compiler/dfa.nim index c946c30b74..bb3f520db6 100644 --- a/compiler/dfa.nim +++ b/compiler/dfa.nim @@ -454,7 +454,7 @@ proc gen(c: var Con; n: PNode) = of nkPragmaBlock: gen(c, n.lastSon) of nkDiscardStmt, nkObjDownConv, nkObjUpConv, nkStringToCString, nkCStringToString: gen(c, n[0]) - of nkConv, nkExprColonExpr, nkExprEqExpr, nkCast, PathKinds1: + of nkConv, nkExprColonExpr, nkExprEqExpr, PathKinds1: gen(c, n[1]) of nkVarSection, nkLetSection: genVarSection(c, n) of nkDefer: raiseAssert "dfa construction pass requires the elimination of 'defer'" diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 5361f57724..d7bfa76eb0 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1931,7 +1931,7 @@ proc borrowCheck(c: PContext, n, le, ri: PNode) = PathKinds0 = {nkDotExpr, nkCheckedFieldExpr, nkBracketExpr, nkAddr, nkHiddenAddr, nkObjDownConv, nkObjUpConv} - PathKinds1 = {nkHiddenStdConv, nkHiddenSubConv} + PathKinds1 = {nkHiddenStdConv, nkHiddenSubConv, nkCast} proc getRoot(n: PNode; followDeref: bool): PNode = result = n diff --git a/tests/destructor/t26123.nim b/tests/destructor/t26123.nim new file mode 100644 index 0000000000..ede762bff4 --- /dev/null +++ b/tests/destructor/t26123.nim @@ -0,0 +1,28 @@ +discard """ + matrix: "--mm:orc" + output: "destroy b" +""" + +# bug #26123 + +type + A = ptr AObj + + AObj = object + b: B + + B = distinct ptr BObj + + BObj = object + a: A + +proc `=destroy`(r: var B) = + echo "destroy b" + +proc main() = + var a = create(AObj) + var b = B(create(BObj)) + a.b = b + cast[ptr BObj](b).a = a + +main()