diff --git a/compiler/dfa.nim b/compiler/dfa.nim index 7315e74bc..2805e42fb 100644 --- a/compiler/dfa.nim +++ b/compiler/dfa.nim @@ -607,14 +607,9 @@ proc aliases(obj, field: PNode): bool = if sameTrees(obj, n): return true case n.kind of nkDotExpr, nkCheckedFieldExpr, nkHiddenSubConv, nkHiddenStdConv, - nkObjDownConv, nkObjUpConv, nkHiddenDeref, nkDerefExpr: + nkObjDownConv, nkObjUpConv, nkHiddenAddr, nkAddr, nkBracketExpr, + nkHiddenDeref, nkDerefExpr: n = n[0] - of nkBracketExpr: - let x = n[0] - if x.typ != nil and x.typ.skipTypes(abstractInst).kind == tyTuple: - n = x - else: - break else: break return false @@ -652,7 +647,7 @@ proc isAnalysableFieldAccess*(orig: PNode; owner: PSym): bool = while true: case n.kind of nkDotExpr, nkCheckedFieldExpr, nkHiddenSubConv, nkHiddenStdConv, - nkObjDownConv, nkObjUpConv: + nkObjDownConv, nkObjUpConv, nkHiddenAddr, nkAddr, nkBracketExpr: n = n[0] of nkHiddenDeref, nkDerefExpr: # We "own" sinkparam[].loc but not ourVar[].location as it is a nasty @@ -660,12 +655,6 @@ proc isAnalysableFieldAccess*(orig: PNode; owner: PSym): bool = n = n[0] return n.kind == nkSym and n.sym.owner == owner and (isSinkParam(n.sym) or n.sym.typ.skipTypes(abstractInst-{tyOwned}).kind in {tyOwned}) - of nkBracketExpr: - let x = n[0] - if x.typ != nil and x.typ.skipTypes(abstractInst).kind == tyTuple: - n = x - else: - break else: break # XXX Allow closure deref operations here if we know diff --git a/tests/destructor/t12037.nim b/tests/destructor/t12037.nim new file mode 100644 index 000000000..8d50262d6 --- /dev/null +++ b/tests/destructor/t12037.nim @@ -0,0 +1,18 @@ +discard """ + cmd: '''nim c --newruntime $file''' + output: ''' +showing original type, length, and contents seq[int] 1 @[42] +copy length and contents 1 @[42] +''' +""" + +proc test() = + var sq1 = @[42] + echo "showing original type, length, and contents ", sq1.typeof, " ", sq1.len, " ", sq1 + doAssert cast[int](sq1[0].unsafeAddr) != 0 + var sq2 = sq1 # copy of original + echo "copy length and contents ", sq2.len, " ", sq2 + doAssert cast[int](sq2[0].unsafeAddr) != 0 + doAssert cast[int](sq1[0].unsafeAddr) != 0 + +test()