From 7a43d00a6468d33548751bbf22b08cd51205ffc1 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 20 Jan 2023 18:43:45 +0800 Subject: [PATCH] fixes #21278; `deques.shrink` off by one bug (#21284) fixes #21278; deques.shrink off ny one bug (cherry picked from commit b82b5d44afbd860075f806f71a62d595f2376d6e) --- lib/pure/collections/deques.nim | 2 +- tests/stdlib/tdeques.nim | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/pure/collections/deques.nim b/lib/pure/collections/deques.nim index c4eb5331ec..dc5ef2a0ad 100644 --- a/lib/pure/collections/deques.nim +++ b/lib/pure/collections/deques.nim @@ -441,7 +441,7 @@ proc shrink*[T](deq: var Deque[T], fromFirst = 0, fromLast = 0) = deq.head = (deq.head + 1) and deq.mask for i in 0 ..< fromLast: - destroy(deq.data[deq.tail]) + destroy(deq.data[(deq.tail - 1) and deq.mask]) deq.tail = (deq.tail - 1) and deq.mask dec deq.count, fromFirst + fromLast diff --git a/tests/stdlib/tdeques.nim b/tests/stdlib/tdeques.nim index 03e951fce4..7b2518cda1 100644 --- a/tests/stdlib/tdeques.nim +++ b/tests/stdlib/tdeques.nim @@ -183,6 +183,12 @@ proc main() = clear(a) doAssert len(a) == 0 + block: # bug #21278 + var a = [10, 20, 30, 40].toDeque + + a.shrink(fromFirst = 0, fromLast = 1) + doAssert $a == "[10, 20, 30]" + static: main() main()