diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 64dc3ad45c2ca..3671f62b8eb49 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -846,7 +846,6 @@ proc isEmptyContainer(g: ModuleGraph, t: PType): bool = (t.kind == tyArray and lengthOrd(g.config, t[0]) == 0) or (t.kind == tySequence and t[0].kind == tyError) - proc createTypeBoundOps(g: ModuleGraph; c: PContext; orig: PType; info: TLineInfo) = ## In the semantic pass this is called in strategic places ## to ensure we lift assignment, destructors and moves properly. diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 042cd9a6e2840..82287c67584bd 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -906,16 +906,26 @@ proc track(tracked: PEffects, n: PNode) = of nkTypeSection, nkProcDef, nkConverterDef, nkMethodDef, nkIteratorDef, nkMacroDef, nkTemplateDef, nkLambda, nkDo, nkFuncDef: discard - of nkCast, nkHiddenStdConv, nkHiddenSubConv, nkConv: + of nkCast: if n.len == 2: track(tracked, n[1]) if tracked.owner.kind != skMacro: createTypeBoundOps(tracked, n.typ, n.info) + of nkHiddenStdConv, nkHiddenSubConv, nkConv: + if n.len == 2: + track(tracked, n[1]) + if tracked.owner.kind != skMacro: + createTypeBoundOps(tracked, n.typ, n.info) + # This is a hacky solution in order to fix bug #13110. Hopefully + # a better solution will come up eventually. + if n[1].typ.kind != tyString: + createTypeBoundOps(tracked, n[1].typ, n[1].info) of nkObjUpConv, nkObjDownConv, nkChckRange, nkChckRangeF, nkChckRange64: if n.len == 1: track(tracked, n[0]) if tracked.owner.kind != skMacro: createTypeBoundOps(tracked, n.typ, n.info) + createTypeBoundOps(tracked, n[0].typ, n[0].info) of nkBracket: for i in 0..<n.safeLen: track(tracked, n[i]) if tracked.owner.kind != skMacro: diff --git a/tests/generics/trtree.nim b/tests/generics/trtree.nim index f14335154fd97..4bd7d11f45a08 100644 --- a/tests/generics/trtree.nim +++ b/tests/generics/trtree.nim @@ -4,8 +4,11 @@ discard """ target: "c" joinable: false disabled: 32bit + cmd: "nim c --gc:arc $file" """ +# bug #13110: This test failed with --gc:arc. + # this test wasn't written for 32 bit # don't join because the code is too messy. @@ -527,7 +530,7 @@ proc findLeaf[M, D: Dim; RT, LT](t: RTree[M, D, RT, LT]; leaf: L[D, RT, LT]): Le proc condenseTree[M, D: Dim; RT, LT](t: RTree[M, D, RT, LT]; leaf: Leaf[M, D, RT, LT]) = var n: H[M, D, RT, LT] = leaf var q = newSeq[H[M, D, RT, LT]]() - var b: type(leaf.a[0].b) + var b: typeof(leaf.a[0].b) while n != t.root: let p = Node[M, D, RT, LT](n.parent) var i = 0