diff options
author | cooldome <ariabushenko@gmail.com> | 2020-11-30 17:45:37 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-30 18:45:37 +0100 |
commit | bb4b27a2ca414f06fbb9d14ff76fa02a088ac141 (patch) | |
tree | 3a12dbed0109b392a80457b946baaa799683cf67 /tests/arc | |
parent | 5a43a20f53d826e5f5e47ca49aa7423fd9cba21b (diff) | |
download | Nim-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.nim | 51 |
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() |