parent
2a3b056314
commit
029dcc6259
2 changed files with 21 additions and 14 deletions
|
|
@ -607,14 +607,9 @@ proc aliases(obj, field: PNode): bool =
|
||||||
if sameTrees(obj, n): return true
|
if sameTrees(obj, n): return true
|
||||||
case n.kind
|
case n.kind
|
||||||
of nkDotExpr, nkCheckedFieldExpr, nkHiddenSubConv, nkHiddenStdConv,
|
of nkDotExpr, nkCheckedFieldExpr, nkHiddenSubConv, nkHiddenStdConv,
|
||||||
nkObjDownConv, nkObjUpConv, nkHiddenDeref, nkDerefExpr:
|
nkObjDownConv, nkObjUpConv, nkHiddenAddr, nkAddr, nkBracketExpr,
|
||||||
|
nkHiddenDeref, nkDerefExpr:
|
||||||
n = n[0]
|
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:
|
else:
|
||||||
break
|
break
|
||||||
return false
|
return false
|
||||||
|
|
@ -652,7 +647,7 @@ proc isAnalysableFieldAccess*(orig: PNode; owner: PSym): bool =
|
||||||
while true:
|
while true:
|
||||||
case n.kind
|
case n.kind
|
||||||
of nkDotExpr, nkCheckedFieldExpr, nkHiddenSubConv, nkHiddenStdConv,
|
of nkDotExpr, nkCheckedFieldExpr, nkHiddenSubConv, nkHiddenStdConv,
|
||||||
nkObjDownConv, nkObjUpConv:
|
nkObjDownConv, nkObjUpConv, nkHiddenAddr, nkAddr, nkBracketExpr:
|
||||||
n = n[0]
|
n = n[0]
|
||||||
of nkHiddenDeref, nkDerefExpr:
|
of nkHiddenDeref, nkDerefExpr:
|
||||||
# We "own" sinkparam[].loc but not ourVar[].location as it is a nasty
|
# 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]
|
n = n[0]
|
||||||
return n.kind == nkSym and n.sym.owner == owner and (isSinkParam(n.sym) or
|
return n.kind == nkSym and n.sym.owner == owner and (isSinkParam(n.sym) or
|
||||||
n.sym.typ.skipTypes(abstractInst-{tyOwned}).kind in {tyOwned})
|
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:
|
else:
|
||||||
break
|
break
|
||||||
# XXX Allow closure deref operations here if we know
|
# XXX Allow closure deref operations here if we know
|
||||||
|
|
|
||||||
18
tests/destructor/t12037.nim
Normal file
18
tests/destructor/t12037.nim
Normal file
|
|
@ -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()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue