Auto merge of #108312 - michaelwoerister:hash-set-not-hash-stable, r=eholk
Do not implement HashStable for HashSet (MCP 533) This PR removes all occurrences of `HashSet` in query results, replacing it either with `FxIndexSet` or with `UnordSet`, and then removes the `HashStable` implementation of `HashSet`. This is part of implementing [MCP 533](https://github.com/rust-lang/compiler-team/issues/533), that is, removing the `HashStable` implementations of all collection types with unstable iteration order. The changes are mostly mechanical. The only place where additional sorting is happening is in Miri's override implementation of the `exported_symbols` query.
This commit is contained in:
commit
9b60e6c68f
23 changed files with 127 additions and 103 deletions
|
@ -617,18 +617,10 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<K, R, HCX> HashStable<HCX> for ::std::collections::HashSet<K, R>
|
||||
where
|
||||
K: ToStableHashKey<HCX> + Eq,
|
||||
R: BuildHasher,
|
||||
{
|
||||
fn hash_stable(&self, hcx: &mut HCX, hasher: &mut StableHasher) {
|
||||
stable_hash_reduce(hcx, hasher, self.iter(), self.len(), |hasher, hcx, key| {
|
||||
let key = key.to_stable_hash_key(hcx);
|
||||
key.hash_stable(hcx, hasher);
|
||||
});
|
||||
}
|
||||
}
|
||||
// It is not safe to implement HashStable for HashSet or any other collection type
|
||||
// with unstable but observable iteration order.
|
||||
// See https://github.com/rust-lang/compiler-team/issues/533 for further information.
|
||||
impl<V, HCX> !HashStable<HCX> for std::collections::HashSet<V> {}
|
||||
|
||||
impl<K, V, HCX> HashStable<HCX> for ::std::collections::BTreeMap<K, V>
|
||||
where
|
||||
|
|
|
@ -109,6 +109,12 @@ impl<T, I: Iterator<Item = T>> UnordItems<T, I> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T> UnordItems<T, std::iter::Empty<T>> {
|
||||
pub fn empty() -> Self {
|
||||
UnordItems(std::iter::empty())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: Clone + 'a, I: Iterator<Item = &'a T>> UnordItems<&'a T, I> {
|
||||
#[inline]
|
||||
pub fn cloned(self) -> UnordItems<T, impl Iterator<Item = T>> {
|
||||
|
@ -133,6 +139,20 @@ impl<T: Ord, I: Iterator<Item = T>> UnordItems<T, I> {
|
|||
items
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn into_sorted_stable_ord(self, use_stable_sort: bool) -> Vec<T>
|
||||
where
|
||||
T: Ord + StableOrd,
|
||||
{
|
||||
let mut items: Vec<T> = self.0.collect();
|
||||
if use_stable_sort {
|
||||
items.sort();
|
||||
} else {
|
||||
items.sort_unstable()
|
||||
}
|
||||
items
|
||||
}
|
||||
|
||||
pub fn into_sorted_small_vec<HCX, const LEN: usize>(self, hcx: &HCX) -> SmallVec<[T; LEN]>
|
||||
where
|
||||
T: ToStableHashKey<HCX>,
|
||||
|
@ -175,6 +195,11 @@ impl<V: Eq + Hash> UnordSet<V> {
|
|||
self.inner.len()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.inner.is_empty()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn insert(&mut self, v: V) -> bool {
|
||||
self.inner.insert(v)
|
||||
|
@ -253,7 +278,7 @@ impl<V: Eq + Hash> UnordSet<V> {
|
|||
// We can safely extend this UnordSet from a set of unordered values because that
|
||||
// won't expose the internal ordering anywhere.
|
||||
#[inline]
|
||||
pub fn extend<I: Iterator<Item = V>>(&mut self, items: UnordItems<V, I>) {
|
||||
pub fn extend_unord<I: Iterator<Item = V>>(&mut self, items: UnordItems<V, I>) {
|
||||
self.inner.extend(items.0)
|
||||
}
|
||||
|
||||
|
@ -277,6 +302,12 @@ impl<V: Hash + Eq> FromIterator<V> for UnordSet<V> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<V: Hash + Eq> From<FxHashSet<V>> for UnordSet<V> {
|
||||
fn from(value: FxHashSet<V>) -> Self {
|
||||
UnordSet { inner: value }
|
||||
}
|
||||
}
|
||||
|
||||
impl<HCX, V: Hash + Eq + HashStable<HCX>> HashStable<HCX> for UnordSet<V> {
|
||||
#[inline]
|
||||
fn hash_stable(&self, hcx: &mut HCX, hasher: &mut StableHasher) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue