Skip to content

Commit

Permalink
Make HashMap::take not corrupt the map. Fixes #19292
Browse files Browse the repository at this point in the history
  • Loading branch information
Gankra committed Nov 25, 2014
1 parent 4389ee3 commit b1e720f
Showing 1 changed file with 35 additions and 1 deletion.
36 changes: 35 additions & 1 deletion src/libstd/collections/hash/map.rs
Expand Up @@ -1376,7 +1376,7 @@ impl<'a, K, V> OccupiedEntry<'a, K, V> {

/// Takes the value out of the entry, and returns it
pub fn take(self) -> V {
let (_, _, v) = self.elem.take();
let (_, v) = pop_internal(self.elem);
v
}
}
Expand Down Expand Up @@ -1433,6 +1433,7 @@ mod test_map {
use hash;
use iter::{Iterator,range_inclusive,range_step_inclusive};
use cell::RefCell;
use rand::{weak_rng, Rng};

struct KindaIntLike(int);

Expand Down Expand Up @@ -2062,4 +2063,37 @@ mod test_map {
assert_eq!(map.get(&10).unwrap(), &1000);
assert_eq!(map.len(), 6);
}

#[test]
fn test_entry_take_doesnt_corrupt() {
// Test for #19292
fn check(m: &HashMap<int, ()>) {
for k in m.keys() {
assert!(m.contains_key(k),
"{} is in keys() but not in the map?", k);
}
}

let mut m = HashMap::new();
let mut rng = weak_rng();

// Populate the map with some items.
for _ in range(0u, 50) {
let x = rng.gen_range(-10, 10);
m.insert(x, ());
}

for i in range(0u, 1000) {
let x = rng.gen_range(-10, 10);
match m.entry(x) {
Vacant(_) => {},
Occupied(e) => {
println!("{}: remove {}", i, x);
e.take();
},
}

check(&m);
}
}
}

0 comments on commit b1e720f

Please sign in to comment.