From d693a98f4ef508299c7c6550d9fb79d81f818d84 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Mon, 19 Jul 2021 16:38:14 +0000 Subject: [PATCH] Fix VecMap::iter_mut It used to allow you to mutate the key, even though that can invalidate the map by creating duplicate keys. --- compiler/rustc_data_structures/src/lib.rs | 1 + compiler/rustc_data_structures/src/vec_map.rs | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_data_structures/src/lib.rs b/compiler/rustc_data_structures/src/lib.rs index 16151e9dca5e0..4467980054f54 100644 --- a/compiler/rustc_data_structures/src/lib.rs +++ b/compiler/rustc_data_structures/src/lib.rs @@ -24,6 +24,7 @@ #![feature(new_uninit)] #![feature(once_cell)] #![feature(maybe_uninit_uninit_array)] +#![feature(min_type_alias_impl_trait)] #![allow(rustc::default_hash_types)] #![deny(unaligned_references)] diff --git a/compiler/rustc_data_structures/src/vec_map.rs b/compiler/rustc_data_structures/src/vec_map.rs index 1786fa340cc8b..96e33184658a3 100644 --- a/compiler/rustc_data_structures/src/vec_map.rs +++ b/compiler/rustc_data_structures/src/vec_map.rs @@ -1,6 +1,6 @@ use std::borrow::Borrow; use std::iter::FromIterator; -use std::slice::{Iter, IterMut}; +use std::slice::Iter; use std::vec::IntoIter; use crate::stable_hasher::{HashStable, StableHasher}; @@ -67,7 +67,7 @@ where self.into_iter() } - pub fn iter_mut(&mut self) -> IterMut<'_, (K, V)> { + pub fn iter_mut(&mut self) -> impl Iterator { self.into_iter() } } @@ -108,12 +108,12 @@ impl<'a, K, V> IntoIterator for &'a VecMap { } impl<'a, K, V> IntoIterator for &'a mut VecMap { - type Item = &'a mut (K, V); - type IntoIter = IterMut<'a, (K, V)>; + type Item = (&'a K, &'a mut V); + type IntoIter = impl Iterator; #[inline] fn into_iter(self) -> Self::IntoIter { - self.0.iter_mut() + self.0.iter_mut().map(|(k, v)| (&*k, v)) } }