Use a consistent way to filter out bounds instead of splitting it into three places

This commit is contained in:
Oli Scherer 2024-06-14 09:40:44 +00:00
parent d2ad293851
commit 5c8bb678d0

View file

@ -239,24 +239,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
return Ok(()); return Ok(());
} }
let all_bounds = stack let bounds = stack
.obligation .obligation
.param_env .param_env
.caller_bounds() .caller_bounds()
.iter() .iter()
.filter(|p| !p.references_error()) .filter(|p| !p.references_error())
.filter_map(|p| p.as_trait_clause()); .filter_map(|p| p.as_trait_clause())
// Micro-optimization: filter out predicates relating to different traits. // Micro-optimization: filter out predicates relating to different traits.
let matching_bounds = .filter(|p| p.def_id() == stack.obligation.predicate.def_id())
all_bounds.filter(|p| p.def_id() == stack.obligation.predicate.def_id()); .filter(|p| p.polarity() == stack.obligation.predicate.polarity());
// Keep only those bounds which may apply, and propagate overflow if it occurs. // Keep only those bounds which may apply, and propagate overflow if it occurs.
for bound in matching_bounds { for bound in bounds {
if bound.skip_binder().polarity != stack.obligation.predicate.skip_binder().polarity {
continue;
}
// FIXME(oli-obk): it is suspicious that we are dropping the constness and // FIXME(oli-obk): it is suspicious that we are dropping the constness and
// polarity here. // polarity here.
let wc = self.where_clause_may_apply(stack, bound.map_bound(|t| t.trait_ref))?; let wc = self.where_clause_may_apply(stack, bound.map_bound(|t| t.trait_ref))?;