Skip to content

Commit

Permalink
fixes #13314
Browse files Browse the repository at this point in the history
  • Loading branch information
Araq committed Feb 8, 2020
1 parent e441542 commit ff1d837
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 5 deletions.
13 changes: 9 additions & 4 deletions compiler/dfa.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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])
Expand Down
26 changes: 25 additions & 1 deletion tests/arc/tmovebug.nim
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
discard """
cmd: "nim c --gc:arc $file"
output: '''5'''
output: '''5
(w: 5)
(w: -5)
'''
"""

# move bug
Expand Down Expand Up @@ -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()

0 comments on commit ff1d837

Please sign in to comment.