summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2022-11-16 14:36:14 +0800
committerGitHub <noreply@github.com>2022-11-16 07:36:14 +0100
commit3d692d08f74e41588fa157b006e882f142bd77d4 (patch)
treeef3a51297b1ae323d37a85ffcd95d594874f4c50
parent4a3be7e29eb25b04a5542e7b92605c5ee24620bb (diff)
downloadNim-3d692d08f74e41588fa157b006e882f142bd77d4.tar.gz
fixes a long-standing ARC bug (#20849)
* fixes an ARC bug

* add a testcase
-rw-r--r--compiler/aliasanalysis.nim8
-rw-r--r--tests/arc/tarcmisc.nim12
2 files changed, 18 insertions, 2 deletions
diff --git a/compiler/aliasanalysis.nim b/compiler/aliasanalysis.nim
index 22a66e4df..f14b81524 100644
--- a/compiler/aliasanalysis.nim
+++ b/compiler/aliasanalysis.nim
@@ -63,6 +63,8 @@ proc aliases*(obj, field: PNode): AliasKind =
   # x.f -> x: false
   # x.f -> x.f: true
   # x.f -> x.v: false
+  # x -> x[]: true
+  # x[] -> x: false
   # x -> x[0]: true
   # x[0] -> x: false
   # x[0] -> x[0]: true
@@ -76,11 +78,11 @@ proc aliases*(obj, field: PNode): AliasKind =
     var n = n
     while true:
       case n.kind
-      of PathKinds0 - {nkDotExpr, nkBracketExpr}:
+      of PathKinds0 - {nkDotExpr, nkBracketExpr, nkDerefExpr, nkHiddenDeref}:
         n = n[0]
       of PathKinds1:
         n = n[1]
-      of nkDotExpr, nkBracketExpr:
+      of nkDotExpr, nkBracketExpr, nkDerefExpr, nkHiddenDeref:
         result.add n
         n = n[0]
       of nkSym:
@@ -114,6 +116,8 @@ proc aliases*(obj, field: PNode): AliasKind =
       if currFieldPath.sym != currObjPath.sym: return no
     of nkDotExpr:
       if currFieldPath[1].sym != currObjPath[1].sym: return no
+    of nkDerefExpr, nkHiddenDeref:
+      discard
     of nkBracketExpr:
       if currFieldPath[1].kind in nkLiterals and currObjPath[1].kind in nkLiterals:
         if currFieldPath[1].intVal != currObjPath[1].intVal:
diff --git a/tests/arc/tarcmisc.nim b/tests/arc/tarcmisc.nim
index 3160d8a4d..6435f5e94 100644
--- a/tests/arc/tarcmisc.nim
+++ b/tests/arc/tarcmisc.nim
@@ -546,3 +546,15 @@ proc fooz(sec: var InputSectionBase) =
 var sec = create(InputSection)
 sec[] = InputSection(relocations: newSeq[int]())
 fooz sec[]
+
+block:
+  type
+    Data = ref object
+      id: int
+  proc main =
+    var x = Data(id: 99)
+    var y = x
+    x[] = Data(id: 778)[]
+    doAssert y.id == 778
+    doAssert x[].id == 778
+  main()