summary refs log tree commit diff stats
path: root/tests/views/tviews1.nim
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2024-01-26 13:06:08 +0800
committerGitHub <noreply@github.com>2024-01-26 06:06:08 +0100
commitd44b0b186943b3187e6dbc8bc5d304f402d978dc (patch)
tree4d46d5274ddb9a32fbf083dadfaf80be7a820271 /tests/views/tviews1.nim
parent0b363442e5ffc715347b2d258cd5d98fcd653b5f (diff)
downloadNim-d44b0b186943b3187e6dbc8bc5d304f402d978dc.tar.gz
fixes #22597; avoid side effects for call returning openArray types (#23257)
fixes #22597

```nim
proc autoToOpenArray*[T](s: Slice[T]): openArray[T] =
  echo "here twice"
  result = toOpenArray(s.p, s.first, s.last)
```
For functions returning openarray types, `fixupCall` creates a temporary
variable to store the return value: `let tmp = autoToOpenArray()`. But
`genOpenArrayConv` cannot handle openarray assignements with side
effects. It should have stored the right part of the assignment first
instead of calling the right part twice.
Diffstat (limited to 'tests/views/tviews1.nim')
-rw-r--r--tests/views/tviews1.nim19
1 files changed, 19 insertions, 0 deletions
diff --git a/tests/views/tviews1.nim b/tests/views/tviews1.nim
index 6662e3e5a..1cc9fcdec 100644
--- a/tests/views/tviews1.nim
+++ b/tests/views/tviews1.nim
@@ -105,3 +105,22 @@ block: # bug #22117
     result = aref
 
   doAssert main() == 10
+
+type
+  Slice*[T] = object
+    first, last: int
+    p: ptr UncheckedArray[T]
+
+var i = 0
+
+converter autoToOpenArray*[T](s: Slice[T]): openArray[T] =
+  inc i
+  result = toOpenArray(s.p, s.first, s.last)
+
+proc acceptOpenArray(s: openArray[byte]) = discard
+
+proc bug22597 = # bug #22597
+  acceptOpenArray(Slice[byte]())
+  doAssert i == 1
+
+bug22597()