From d83520ec8f2e9b61c59930d7353ff621ef2ad3ec Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sat, 9 Feb 2019 19:55:26 +0100 Subject: [PATCH] Do not walk into type sub-nodes for cast/conv expr (#10616) --- compiler/destroyer.nim | 6 ++++++ tests/destructor/tcast.nim | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 tests/destructor/tcast.nim diff --git a/compiler/destroyer.nim b/compiler/destroyer.nim index 22ace36349..6c47c8884e 100644 --- a/compiler/destroyer.nim +++ b/compiler/destroyer.nim @@ -601,6 +601,12 @@ proc p(n: PNode; c: var Con): PNode = of nkNone..nkNilLit, nkTypeSection, nkProcDef, nkConverterDef, nkMethodDef, nkIteratorDef, nkMacroDef, nkTemplateDef, nkLambda, nkDo, nkFuncDef: result = n + of nkCast, nkHiddenStdConv, nkHiddenSubConv, nkConv: + result = copyNode(n) + # Destination type + result.add n[0] + # Analyse the inner expression + result.add p(n[1], c) else: result = copyNode(n) recurse(n, result) diff --git a/tests/destructor/tcast.nim b/tests/destructor/tcast.nim new file mode 100644 index 0000000000..7d5a1954c1 --- /dev/null +++ b/tests/destructor/tcast.nim @@ -0,0 +1,18 @@ +discard """ + cmd: '''nim c --newruntime $file''' +""" + +# Make sure we don't walk cast[T] type section while injecting sinks/destructors +block: + type + XY[T] = object + discard + + proc `=`[T](x: var XY[T]; v: XY[T]) {.error.} + proc `=sink`[T](x: var XY[T]; v: XY[T]) {.error.} + + proc main[T]() = + var m = cast[ptr XY[T]](alloc0(sizeof(XY[T]))) + doAssert(m != nil) + + main[int]()