Move binder for dyn to each list item
This commit is contained in:
parent
58d2bad9f7
commit
ed80815bf2
25 changed files with 307 additions and 261 deletions
|
@ -1254,22 +1254,22 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
})
|
||||
});
|
||||
|
||||
// Calling `skip_binder` is okay because the predicates are re-bound.
|
||||
let regular_trait_predicates = existential_trait_refs
|
||||
.map(|trait_ref| ty::ExistentialPredicate::Trait(trait_ref.skip_binder()));
|
||||
let auto_trait_predicates = auto_traits
|
||||
.into_iter()
|
||||
.map(|trait_ref| ty::ExistentialPredicate::AutoTrait(trait_ref.trait_ref().def_id()));
|
||||
let regular_trait_predicates = existential_trait_refs.map(|trait_ref| {
|
||||
trait_ref.map_bound(|trait_ref| ty::ExistentialPredicate::Trait(trait_ref))
|
||||
});
|
||||
let auto_trait_predicates = auto_traits.into_iter().map(|trait_ref| {
|
||||
ty::Binder::dummy(ty::ExistentialPredicate::AutoTrait(trait_ref.trait_ref().def_id()))
|
||||
});
|
||||
let mut v = regular_trait_predicates
|
||||
.chain(auto_trait_predicates)
|
||||
.chain(
|
||||
existential_projections
|
||||
.map(|x| ty::ExistentialPredicate::Projection(x.skip_binder())),
|
||||
.map(|x| x.map_bound(|x| ty::ExistentialPredicate::Projection(x))),
|
||||
)
|
||||
.collect::<SmallVec<[_; 8]>>();
|
||||
v.sort_by(|a, b| a.stable_cmp(tcx, b));
|
||||
v.sort_by(|a, b| a.skip_binder().stable_cmp(tcx, &b.skip_binder()));
|
||||
v.dedup();
|
||||
let existential_predicates = ty::Binder::bind(tcx.mk_existential_predicates(v.into_iter()));
|
||||
let existential_predicates = tcx.mk_poly_existential_predicates(v.into_iter());
|
||||
|
||||
// Use explicitly-specified region bound.
|
||||
let region_bound = if !lifetime.is_elided() {
|
||||
|
@ -2331,7 +2331,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
fn compute_object_lifetime_bound(
|
||||
&self,
|
||||
span: Span,
|
||||
existential_predicates: ty::Binder<&'tcx ty::List<ty::ExistentialPredicate<'tcx>>>,
|
||||
existential_predicates: &'tcx ty::List<ty::Binder<ty::ExistentialPredicate<'tcx>>>,
|
||||
) -> Option<ty::Region<'tcx>> // if None, use the default
|
||||
{
|
||||
let tcx = self.tcx();
|
||||
|
|
|
@ -619,8 +619,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
ty::Adt(def, _) => bound_spans.push((def_span(def.did), msg)),
|
||||
// Point at the trait object that couldn't satisfy the bound.
|
||||
ty::Dynamic(preds, _) => {
|
||||
for pred in preds.skip_binder() {
|
||||
match pred {
|
||||
for pred in preds.iter() {
|
||||
match pred.skip_binder() {
|
||||
ty::ExistentialPredicate::Trait(tr) => {
|
||||
bound_spans.push((def_span(tr.def_id), msg.clone()))
|
||||
}
|
||||
|
@ -673,9 +673,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
.iter()
|
||||
.filter_map(|(pred, parent_pred)| {
|
||||
format_pred(*pred).map(|(p, self_ty)| match parent_pred {
|
||||
None => format!("`{}`", p),
|
||||
None => format!("`{}`", &p),
|
||||
Some(parent_pred) => match format_pred(*parent_pred) {
|
||||
None => format!("`{}`", p),
|
||||
None => format!("`{}`", &p),
|
||||
Some((parent_p, _)) => {
|
||||
collect_type_param_suggestions(self_ty, parent_pred, &p);
|
||||
format!("`{}`\nwhich is required by `{}`", p, parent_p)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue