summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--changelog.md1
-rw-r--r--lib/pure/collections/lists.nim2
-rw-r--r--tests/stdlib/tlists.nim13
3 files changed, 16 insertions, 0 deletions
diff --git a/changelog.md b/changelog.md
index 1b97fd99a..d07f80623 100644
--- a/changelog.md
+++ b/changelog.md
@@ -22,6 +22,7 @@
 - `macros.parseExpr` and `macros.parseStmt` now accept an optional
   filename argument for more informative errors.
 - Module `colors` expanded with missing colors from the CSS color standard.
+- Fixed `lists.SinglyLinkedList` being broken after removing the last node ([#19353](https://github.com/nim-lang/Nim/pull/19353)).
 
 ## `std/smtp`
 
diff --git a/lib/pure/collections/lists.nim b/lib/pure/collections/lists.nim
index f7627ae67..d1de0ea67 100644
--- a/lib/pure/collections/lists.nim
+++ b/lib/pure/collections/lists.nim
@@ -739,6 +739,8 @@ proc remove*[T](L: var SinglyLinkedList[T], n: SinglyLinkedNode[T]): bool {.disc
     if prev.next == nil:
       return false
     prev.next = n.next
+    if L.tail == n:
+      L.tail = prev # update tail if we removed the last node
   true
 
 proc remove*[T](L: var DoublyLinkedList[T], n: DoublyLinkedNode[T]) =
diff --git a/tests/stdlib/tlists.nim b/tests/stdlib/tlists.nim
index 14cbf2f9d..00c5b1a27 100644
--- a/tests/stdlib/tlists.nim
+++ b/tests/stdlib/tlists.nim
@@ -258,5 +258,18 @@ template main =
     a.add(2)
     doAssert a.toSeq == @[1, 2]
 
+  block RemoveLastNodeFromSinglyLinkedList:
+    var list = initSinglyLinkedList[string]()
+    let n1 = newSinglyLinkedNode("sonic")
+    let n2 = newSinglyLinkedNode("the")
+    let n3 = newSinglyLinkedNode("tiger")
+    let n4 = newSinglyLinkedNode("hedgehog")
+    list.add(n1)
+    list.add(n2)
+    list.add(n3)
+    list.remove(n3)
+    list.add(n4)
+    doAssert list.toSeq == @["sonic", "the", "hedgehog"]
+
 static: main()
 main()