Auto merge of #89016 - lcnr:non_blanket_impls, r=nikomatsakis,michaelwoerister
fix non_blanket_impls iteration order We sometimes iterate over all `non_blanket_impls`, not sure if this is observable outside of error messages (i.e. as incremental bugs). This should fix the underlying issue of #86986. second attempt of #88718 r? `@nikomatsakis`
This commit is contained in:
commit
bf642323d6
8 changed files with 43 additions and 118 deletions
|
@ -50,7 +50,7 @@ impl ChildrenExt for Children {
|
|||
let trait_ref = tcx.impl_trait_ref(impl_def_id).unwrap();
|
||||
if let Some(st) = fast_reject::simplify_type(tcx, trait_ref.self_ty(), false) {
|
||||
debug!("insert_blindly: impl_def_id={:?} st={:?}", impl_def_id, st);
|
||||
self.nonblanket_impls.entry(st).or_default().push(impl_def_id)
|
||||
self.non_blanket_impls.entry(st).or_default().push(impl_def_id)
|
||||
} else {
|
||||
debug!("insert_blindly: impl_def_id={:?} st=None", impl_def_id);
|
||||
self.blanket_impls.push(impl_def_id)
|
||||
|
@ -65,7 +65,7 @@ impl ChildrenExt for Children {
|
|||
let vec: &mut Vec<DefId>;
|
||||
if let Some(st) = fast_reject::simplify_type(tcx, trait_ref.self_ty(), false) {
|
||||
debug!("remove_existing: impl_def_id={:?} st={:?}", impl_def_id, st);
|
||||
vec = self.nonblanket_impls.get_mut(&st).unwrap();
|
||||
vec = self.non_blanket_impls.get_mut(&st).unwrap();
|
||||
} else {
|
||||
debug!("remove_existing: impl_def_id={:?} st=None", impl_def_id);
|
||||
vec = &mut self.blanket_impls;
|
||||
|
@ -218,7 +218,7 @@ impl ChildrenExt for Children {
|
|||
}
|
||||
|
||||
fn iter_children(children: &mut Children) -> impl Iterator<Item = DefId> + '_ {
|
||||
let nonblanket = children.nonblanket_impls.iter_mut().flat_map(|(_, v)| v.iter());
|
||||
let nonblanket = children.non_blanket_impls.iter().flat_map(|(_, v)| v.iter());
|
||||
children.blanket_impls.iter().chain(nonblanket).cloned()
|
||||
}
|
||||
|
||||
|
@ -226,7 +226,7 @@ fn filtered_children(
|
|||
children: &mut Children,
|
||||
st: SimplifiedType,
|
||||
) -> impl Iterator<Item = DefId> + '_ {
|
||||
let nonblanket = children.nonblanket_impls.entry(st).or_default().iter();
|
||||
let nonblanket = children.non_blanket_impls.entry(st).or_default().iter();
|
||||
children.blanket_impls.iter().chain(nonblanket).cloned()
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue