summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorishowta <kinironote@gmail.com>2018-11-21 19:56:38 +0900
committerAndreas Rumpf <rumpf_a@web.de>2018-11-21 11:56:38 +0100
commit6ff596d4f8fec289c827a5be2edd6646e6a20bb4 (patch)
tree43dfa3b3654a315e3580cf1763fad92e50b6eaaf
parentb78699917e9c993bca04c262b909ea8b13aa2724 (diff)
downloadNim-6ff596d4f8fec289c827a5be2edd6646e6a20bb4.tar.gz
Empty check in shallow [backport] (#9676)
-rw-r--r--lib/system.nim1
-rw-r--r--tests/seq/tseq.nim24
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/system.nim b/lib/system.nim
index ace3f5e38..a7b22a283 100644
--- a/lib/system.nim
+++ b/lib/system.nim
@@ -4017,6 +4017,7 @@ proc shallow*[T](s: var seq[T]) {.noSideEffect, inline.} =
   ## marks a sequence `s` as `shallow`:idx:. Subsequent assignments will not
   ## perform deep copies of `s`. This is only useful for optimization
   ## purposes.
+  if s.len == 0: return
   when not defined(JS) and not defined(nimscript):
     var s = cast[PGenericSeq](s)
     s.reserved = s.reserved or seqShallowFlag
diff --git a/tests/seq/tseq.nim b/tests/seq/tseq.nim
index 6528d518e..1cb94b308 100644
--- a/tests/seq/tseq.nim
+++ b/tests/seq/tseq.nim
@@ -170,6 +170,30 @@ block tshallowseq:
   xxx()
 
 
+block tshallowemptyseq:
+  proc test() =
+    var nilSeq: seq[int] = @[]
+    var emptySeq: seq[int] = newSeq[int]()
+    block:
+      var t = @[1,2,3]
+      shallow(nilSeq)
+      t = nilSeq
+      doAssert t == @[]
+    block:
+      var t = @[1,2,3]
+      shallow(emptySeq)
+      t = emptySeq
+      doAssert t == @[]
+    block:
+      var t = @[1,2,3]
+      shallowCopy(t, nilSeq)
+      doAssert t == @[]
+    block:
+      var t = @[1,2,3]
+      shallowCopy(t, emptySeq)
+      doAssert t == @[]
+  test()
+
 
 import strutils
 block ttoseq: