diff --git a/compiler/destroyer.nim b/compiler/destroyer.nim index 36839bf0ba..729480f81b 100644 --- a/compiler/destroyer.nim +++ b/compiler/destroyer.nim @@ -210,7 +210,7 @@ template recurse(n, dest) = dest.add p(n[i], c) proc moveOrCopy(dest, ri: PNode; c: var Con): PNode = - if ri.kind in nkCallKinds: + if ri.kind in nkCallKinds+{nkObjConstr}: result = genSink(ri.typ, dest) # watch out and no not transform 'ri' twice if it's a call: let ri2 = copyNode(ri) @@ -312,7 +312,7 @@ proc injectDestructorCalls*(owner: PSym; n: PNode): PNode = result.add body when defined(nimDebugDestroys): - if owner.name.s == "createSeq": + if owner.name.s == "main" or true: echo "------------------------------------" echo owner.name.s, " transformed to: " echo result diff --git a/tests/destructor/tmove_objconstr.nim b/tests/destructor/tmove_objconstr.nim new file mode 100644 index 0000000000..3e8a644351 --- /dev/null +++ b/tests/destructor/tmove_objconstr.nim @@ -0,0 +1,32 @@ + +discard """ +output: '''test created +test destroyed 0''' + cmd: '''nim c --newruntime $file''' +""" + +# bug #4214 +type + Data = object + data: string + rc: int + +proc `=destroy`(d: var Data) = + dec d.rc + echo d.data, " destroyed ", d.rc + +proc `=`(dst: var Data, src: Data) = + echo src.data, " copied" + dst.data = src.data & " (copy)" + dec dst.rc + inc dst.rc + +proc initData(s: string): Data = + result = Data(data: s, rc: 1) + echo s, " created" + +proc main = + var x = initData"test" + +when isMainModule: + main()