mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-21 08:21:32 +00:00
@@ -609,15 +609,16 @@ proc aliases*(obj, field: PNode): bool =
|
||||
|
||||
proc useInstrTargets*(ins: Instr; loc: PNode): bool =
|
||||
assert ins.kind == use
|
||||
sameTrees(ins.n, loc) or
|
||||
ins.n.aliases(loc) or loc.aliases(ins.n) # We can come here if loc is 'x.f' and ins.n is 'x' or the other way round.
|
||||
result = sameTrees(ins.n, loc) or
|
||||
ins.n.aliases(loc) or loc.aliases(ins.n)
|
||||
# We can come here if loc is 'x.f' and ins.n is 'x' or the other way round.
|
||||
# use x.f; question: does it affect the full 'x'? No.
|
||||
# use x; question does it affect 'x.f'? Yes.
|
||||
|
||||
proc defInstrTargets*(ins: Instr; loc: PNode): bool =
|
||||
assert ins.kind == def
|
||||
sameTrees(ins.n, loc) or
|
||||
ins.n.aliases(loc) # We can come here if loc is 'x.f' and ins.n is 'x' or the other way round.
|
||||
result = sameTrees(ins.n, loc) or ins.n.aliases(loc)
|
||||
# We can come here if loc is 'x.f' and ins.n is 'x' or the other way round.
|
||||
# def x.f; question: does it affect the full 'x'? No.
|
||||
# def x; question: does it affect the 'x.f'? Yes.
|
||||
|
||||
@@ -678,6 +679,10 @@ proc genDef(c: var Con; n: PNode) =
|
||||
c.code.add Instr(n: n, kind: def)
|
||||
elif isAnalysableFieldAccess(n, c.owner):
|
||||
c.code.add Instr(n: n, kind: def)
|
||||
else:
|
||||
# bug #13314: An assignment to t5.w = -5 is a usage of 't5'
|
||||
# we still need to gather the use information:
|
||||
gen(c, n)
|
||||
|
||||
proc genCall(c: var Con; n: PNode) =
|
||||
gen(c, n[0])
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
discard """
|
||||
cmd: "nim c --gc:arc $file"
|
||||
output: '''5'''
|
||||
output: '''5
|
||||
(w: 5)
|
||||
(w: -5)
|
||||
'''
|
||||
"""
|
||||
|
||||
# move bug
|
||||
@@ -62,3 +65,24 @@ proc main =
|
||||
|
||||
main()
|
||||
echo destroyCounter
|
||||
|
||||
# bug #13314
|
||||
|
||||
type
|
||||
O = object
|
||||
v: int
|
||||
R = ref object
|
||||
w: int
|
||||
|
||||
proc `$`(r: R): string = $r[]
|
||||
|
||||
proc tbug13314 =
|
||||
var t5 = R(w: 5)
|
||||
var execute = proc () =
|
||||
echo t5
|
||||
|
||||
execute()
|
||||
t5.w = -5
|
||||
execute()
|
||||
|
||||
tbug13314()
|
||||
|
||||
Reference in New Issue
Block a user