summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2020-02-09 00:22:34 +0100
committerGitHub <noreply@github.com>2020-02-09 00:22:34 +0100
commit240174dd81781e279d84090f1937ebf4b971e29c (patch)
treeff168e604fbdc0b855d6013dc64bbb04c2c69929
parent038f47e7b93308bef0118e1ef73edf36e39f9b91 (diff)
downloadNim-240174dd81781e279d84090f1937ebf4b971e29c.tar.gz
fixes #13314 (#13372)
-rw-r--r--compiler/dfa.nim13
-rw-r--r--tests/arc/tmovebug.nim26
2 files changed, 34 insertions, 5 deletions
diff --git a/compiler/dfa.nim b/compiler/dfa.nim
index 2f3a54b60..b46db9aed 100644
--- a/compiler/dfa.nim
+++ b/compiler/dfa.nim
@@ -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])
diff --git a/tests/arc/tmovebug.nim b/tests/arc/tmovebug.nim
index 98f181b81..883543877 100644
--- a/tests/arc/tmovebug.nim
+++ b/tests/arc/tmovebug.nim
@@ -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()