Skip to content

Commit

Permalink
Fix #19297 - fixing broken list after adding empty list (#19299)
Browse files Browse the repository at this point in the history
* Update lists.nim

* Update tlists.nim

* removed check `if b.tail != nil`

The tail of the list being null it is still possible to retrieve its end by going through all nodes from the head. So checking for null from `b.tail` is unnecessary. However, setting `a.tail = b.tail` only if `a.head != nil`, so you don't break a good list with an already broken one.
  • Loading branch information
rockcavera authored Dec 30, 2021
1 parent 23d64be commit dc5c88c
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
11 changes: 6 additions & 5 deletions lib/pure/collections/lists.nim
Original file line number Diff line number Diff line change
Expand Up @@ -530,11 +530,12 @@ proc addMoved*[T](a, b: var SinglyLinkedList[T]) {.since: (1, 5, 1).} =
ci
assert s == [0, 1, 0, 1, 0, 1]

if a.tail != nil:
a.tail.next = b.head
a.tail = b.tail
if a.head == nil:
a.head = b.head
if b.head != nil:
if a.head == nil:
a.head = b.head
else:
a.tail.next = b.head
a.tail = b.tail
if a.addr != b.addr:
b.head = nil
b.tail = nil
Expand Down
12 changes: 12 additions & 0 deletions tests/stdlib/tlists.nim
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,18 @@ template main =
doAssert l.toSeq == [1]
doAssert l.remove(l.head) == true
doAssert l.toSeq == []

block issue19297: # add (appends a shallow copy)
var a: SinglyLinkedList[int]
var b: SinglyLinkedList[int]

doAssert a.toSeq == @[]
a.add(1)
doAssert a.toSeq == @[1]
a.add(b)
doAssert a.toSeq == @[1]
a.add(2)
doAssert a.toSeq == @[1, 2]

static: main()
main()

0 comments on commit dc5c88c

Please sign in to comment.