Use a consistent way to filter out bounds instead of splitting it into three places
This commit is contained in:
parent
d2ad293851
commit
5c8bb678d0
1 changed files with 6 additions and 11 deletions
|
@ -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))?;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue