From b9bca3492d75139097df3b018b6abdf5825ee868 Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Wed, 7 Jan 2026 09:05:01 +0100 Subject: [PATCH 1/2] Fix stacked borrows violation in `IterMut::next` and `IterMut::next_back` --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index df52963..f96ff32 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1733,7 +1733,7 @@ impl<'a, K, V> Iterator for IterMut<'a, K, V> { return None; } - let key = unsafe { &mut (*(*self.ptr).key.as_mut_ptr()) as &mut K }; + let key = unsafe { &(*(*self.ptr).key.as_ptr()) as &K }; let val = unsafe { &mut (*(*self.ptr).val.as_mut_ptr()) as &mut V }; self.len -= 1; @@ -1757,7 +1757,7 @@ impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> { return None; } - let key = unsafe { &mut (*(*self.end).key.as_mut_ptr()) as &mut K }; + let key = unsafe { &(*(*self.end).key.as_ptr()) as &K }; let val = unsafe { &mut (*(*self.end).val.as_mut_ptr()) as &mut V }; self.len -= 1; From 25669e76110133c73d72f1db0069934ba590162a Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Wed, 7 Jan 2026 09:05:32 +0100 Subject: [PATCH 2/2] Add regression test for `IterMut` stacked borrows violation --- src/lib.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index f96ff32..8f78c8f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2850,6 +2850,22 @@ mod tests { assert_eq!(cache.pop_lru(), None); assert_eq!(cloned.pop_lru(), None); } + + #[test] + fn iter_mut_stacked_borrows_violation() { + let mut cache: LruCache = LruCache::new(NonZeroUsize::new(3).unwrap()); + cache.put(1, 10); + cache.put(2, 20); + cache.put(3, 30); + + for (_k, v) in cache.iter_mut() { + *v *= 2; + } + + assert_eq!(cache.get(&1), Some(&20)); + assert_eq!(cache.get(&2), Some(&40)); + assert_eq!(cache.get(&3), Some(&60)); + } } /// Doctests for what should *not* compile