diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-01-14 09:56:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-14 09:56:08 +0100 |
commit | d56848878cecda9a6fc88edfb8f7ae5da70f47c1 (patch) | |
tree | dcfc9fd347edfcefca7143fbf693ecb857c6e2d8 /compiler | |
parent | 49d1822c8f1cfd418e978a5c9c58343369d9f956 (diff) | |
download | Nim-d56848878cecda9a6fc88edfb8f7ae5da70f47c1.tar.gz |
fixes #13119 (#13128)
* fixes #13119 * fixes a regression
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/injectdestructors.nim | 2 | ||||
-rw-r--r-- | compiler/liftdestructors.nim | 2 | ||||
-rw-r--r-- | compiler/sempass2.nim | 10 |
3 files changed, 11 insertions, 3 deletions
diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 84473aabc..f5e525e00 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/liftdestructors.nim b/compiler/liftdestructors.nim index daf91954b..b9b121070 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/compiler/sempass2.nim b/compiler/sempass2.nim index 1b9c388b3..042cd9a6e 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..<n.safeLen: track(tracked, n[i]) if tracked.owner.kind != skMacro: |