diff --git a/src/lib.rs b/src/lib.rs index df52963..8f78c8f 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; @@ -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