Skip to content

Commit 3020945

Browse files
committed
Fix into_iter of empty map and add test
1 parent fad2c94 commit 3020945

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,9 @@ impl<K: Hash + Eq, V, S: BuildHasher> IntoIterator for LinkedHashMap<K, V, S> {
10291029
};
10301030
let len = self.len();
10311031

1032-
unsafe { drop_empty_entry_box(self.head) }
1032+
if !self.head.is_null() {
1033+
unsafe { drop_empty_entry_box(self.head) }
1034+
}
10331035
self.clear_free_list();
10341036
// drop the HashMap but not the LinkedHashMap
10351037
self.map = unsafe { mem::uninitialized() };

tests/test.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,29 @@ fn test_consuming_iter() {
199199
}
200200
}
201201

202+
#[test]
203+
fn test_consuming_iter_empty() {
204+
let map = LinkedHashMap::<&str, i32>::new();
205+
let mut iter = map.into_iter();
206+
assert_eq!(None, iter.next());
207+
let mut clone = iter.clone();
208+
assert_eq!(None, clone.next());
209+
}
210+
211+
#[test]
212+
fn test_consuming_iter_with_free_list() {
213+
let mut map = LinkedHashMap::new();
214+
map.insert("a", 10);
215+
map.insert("c", 30);
216+
map.insert("b", 20);
217+
map.remove("a");
218+
map.remove("b");
219+
220+
let mut iter = map.into_iter();
221+
assert_eq!(Some(("c", 30)), iter.next());
222+
assert_eq!(None, iter.next());
223+
}
224+
202225
#[test]
203226
fn test_borrow() {
204227
#[derive(PartialEq, Eq, Hash)] struct Foo(Bar);

0 commit comments

Comments
 (0)