From dab0ed1c86746e50a6c94ab45c01486fbdce0994 Mon Sep 17 00:00:00 2001 From: Araq Date: Mon, 13 Jan 2020 13:04:28 +0100 Subject: [PATCH 1/2] fixes #13119 --- compiler/injectdestructors.nim | 2 ++ compiler/sempass2.nim | 10 ++++++++-- tests/destructor/tarc.nim | 12 ++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 84473aabc9190..f5e525e0083f2 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -352,6 +352,8 @@ proc passCopyToSink(n: PNode; c: var Con): PNode = ("passing '$1' to a sink parameter introduces an implicit copy; " & "use 'move($1)' to prevent it") % $n) else: + if c.graph.config.selectedGC in {gcArc, gcOrc}: + assert(not containsGarbageCollectedRef(n.typ)) result.add newTree(nkAsgn, tmp, p(n, c, normal)) result.add tmp diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 1b9c388b3ba51..042cd9a6e2840 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -907,9 +907,15 @@ proc track(tracked: PEffects, n: PNode) = nkMacroDef, nkTemplateDef, nkLambda, nkDo, nkFuncDef: discard of nkCast, nkHiddenStdConv, nkHiddenSubConv, nkConv: - if n.len == 2: track(tracked, n[1]) + if n.len == 2: + track(tracked, n[1]) + if tracked.owner.kind != skMacro: + createTypeBoundOps(tracked, n.typ, n.info) of nkObjUpConv, nkObjDownConv, nkChckRange, nkChckRangeF, nkChckRange64: - if n.len == 1: track(tracked, n[0]) + if n.len == 1: + track(tracked, n[0]) + if tracked.owner.kind != skMacro: + createTypeBoundOps(tracked, n.typ, n.info) of nkBracket: for i in 0.. Date: Mon, 13 Jan 2020 22:34:54 +0100 Subject: [PATCH 2/2] fixes a regression --- compiler/liftdestructors.nim | 2 +- tests/js/tcopying.nim | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index daf91954b05be..b9b1210703613 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -656,7 +656,7 @@ proc fillBody(c: var TLiftCtx; t: PType; body, x, y: PNode) = of tyTuple: fillBodyTup(c, t, body, x, y) of tyVarargs, tyOpenArray: - if c.kind == attachedDestructor: + if c.kind == attachedDestructor and (tfHasAsgn in t.flags or useNoGc(c, t)): forallElements(c, t, body, x, y) else: discard "cannot copy openArray" diff --git a/tests/js/tcopying.nim b/tests/js/tcopying.nim index c58a080e92194..1f668be52b9c0 100644 --- a/tests/js/tcopying.nim +++ b/tests/js/tcopying.nim @@ -14,7 +14,7 @@ type MyArray = array[1, int] proc changeArray(a: var MyArray) = a = [123] -var a : MyArray +var a: MyArray changeArray(a) echo a[0] @@ -34,7 +34,7 @@ block: ary2: array[3, int] let ary1 = [1, 2, 3] - var obj = TestObj(ary2:ary1) + var obj = TestObj(ary2: ary1) obj.ary2[1] = 9