summary refs log tree commit diff stats
path: root/tests/arc
diff options
context:
space:
mode:
authorcooldome <ariabushenko@gmail.com>2020-11-30 17:45:37 +0000
committerGitHub <noreply@github.com>2020-11-30 18:45:37 +0100
commitbb4b27a2ca414f06fbb9d14ff76fa02a088ac141 (patch)
tree3a12dbed0109b392a80457b946baaa799683cf67 /tests/arc
parent5a43a20f53d826e5f5e47ca49aa7423fd9cba21b (diff)
downloadNim-bb4b27a2ca414f06fbb9d14ff76fa02a088ac141.tar.gz
fix #16185 (#16195)
* fix #16185

* fix test

* fix comment

* fix comment

* better approach
Diffstat (limited to 'tests/arc')
-rw-r--r--tests/arc/t14383.nim51
1 files changed, 50 insertions, 1 deletions
diff --git a/tests/arc/t14383.nim b/tests/arc/t14383.nim
index 85f90d1c8..0ce7b7d10 100644
--- a/tests/arc/t14383.nim
+++ b/tests/arc/t14383.nim
@@ -125,4 +125,53 @@ proc main =
   let rankdef = avals
   echo avals.len, " ", rankdef.len
 
-main()
\ No newline at end of file
+main()
+
+
+
+
+#------------------------------------------------------------------------------
+# Issue #16185, complex self-assingment elimination
+#------------------------------------------------------------------------------
+
+type
+  CpuStorage*[T] = ref CpuStorageObj[T]
+  CpuStorageObj[T] = object
+    size*: int
+    raw_buffer*: ptr UncheckedArray[T]
+  Tensor[T] = object
+    buf*: CpuStorage[T]
+  TestObject = object
+    x: Tensor[float]
+
+proc `=destroy`[T](s: var CpuStorageObj[T]) =
+  if s.raw_buffer != nil:
+    s.raw_buffer.deallocShared()
+    s.size = 0
+    s.raw_buffer = nil
+
+proc `=`[T](a: var CpuStorageObj[T]; b: CpuStorageObj[T]) {.error.}
+
+proc allocCpuStorage[T](s: var CpuStorage[T], size: int) =
+  new(s)
+  s.raw_buffer = cast[ptr UncheckedArray[T]](allocShared0(sizeof(T) * size))
+  s.size = size
+
+proc newTensor[T](size: int): Tensor[T] =
+  allocCpuStorage(result.buf, size)
+
+proc `[]`[T](t: Tensor[T], idx: int): T = t.buf.raw_buffer[idx]
+proc `[]=`[T](t: Tensor[T], idx: int, val: T) = t.buf.raw_buffer[idx] = val
+
+proc toTensor[T](s: seq[T]): Tensor[T] =
+  result = newTensor[T](s.len)
+  for i, x in s:
+    result[i] = x
+
+proc main2() =
+  var t: TestObject
+  t.x = toTensor(@[1.0, 2, 3, 4])
+  t.x = t.x  
+  doAssert(t.x.buf != nil) # self-assignment above should be eliminated
+
+main2()