diff options
author | Clyybber <darkmine956@gmail.com> | 2019-08-30 06:41:26 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-08-30 06:41:26 +0200 |
commit | 029dcc6259b8f0e6ee0216a936636509f7f530ff (patch) | |
tree | 00e010da582cdc0678909424c1e7cbd49ffea160 | |
parent | 2a3b0563141f2cfdee4cbeef85167c25610ff71f (diff) | |
download | Nim-029dcc6259b8f0e6ee0216a936636509f7f530ff.tar.gz |
fix #12037 (#12089)
-rw-r--r-- | compiler/dfa.nim | 17 | ||||
-rw-r--r-- | tests/destructor/t12037.nim | 18 |
2 files changed, 21 insertions, 14 deletions
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() |