From 7f39b0c9ab7c2c3beeb9dd3a54f51b3a5f7e21a0 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Thu, 18 Jun 2020 00:18:58 +0200 Subject: [PATCH] subst_supertrait --- src/librustc_infer/traits/util.rs | 4 +-- src/librustc_middle/ty/mod.rs | 41 +++++++++---------------------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/librustc_infer/traits/util.rs b/src/librustc_infer/traits/util.rs index ddb7e7adbc6..9dfe23b5aad 100644 --- a/src/librustc_infer/traits/util.rs +++ b/src/librustc_infer/traits/util.rs @@ -156,10 +156,10 @@ impl Elaborator<'tcx> { // Get predicates declared on the trait. let predicates = tcx.super_predicates_of(data.def_id()); - let obligations = predicates.predicates.iter().map(|(pred, span)| { + let obligations = predicates.predicates.iter().map(|&(pred, span)| { predicate_obligation( pred.subst_supertrait(tcx, &data.to_poly_trait_ref()), - Some(*span), + Some(span), ) }); debug!("super_predicates: data={:?}", data); diff --git a/src/librustc_middle/ty/mod.rs b/src/librustc_middle/ty/mod.rs index b72dd638219..ac1642ec866 100644 --- a/src/librustc_middle/ty/mod.rs +++ b/src/librustc_middle/ty/mod.rs @@ -1303,37 +1303,20 @@ impl<'tcx> Predicate<'tcx> { // this trick achieves that). let substs = trait_ref.skip_binder().substs; - let kind = self.kind(); - let new = match kind { - &PredicateKind::Trait(ref binder, constness) => { - PredicateKind::Trait(binder.map_bound(|data| data.subst(tcx, substs)), constness) - } - PredicateKind::Subtype(binder) => { - PredicateKind::Subtype(binder.map_bound(|data| data.subst(tcx, substs))) - } - PredicateKind::RegionOutlives(binder) => { - PredicateKind::RegionOutlives(binder.map_bound(|data| data.subst(tcx, substs))) - } - PredicateKind::TypeOutlives(binder) => { - PredicateKind::TypeOutlives(binder.map_bound(|data| data.subst(tcx, substs))) - } - PredicateKind::Projection(binder) => { - PredicateKind::Projection(binder.map_bound(|data| data.subst(tcx, substs))) - } - &PredicateKind::WellFormed(data) => PredicateKind::WellFormed(data.subst(tcx, substs)), - &PredicateKind::ObjectSafe(trait_def_id) => PredicateKind::ObjectSafe(trait_def_id), - &PredicateKind::ClosureKind(closure_def_id, closure_substs, kind) => { - PredicateKind::ClosureKind(closure_def_id, closure_substs.subst(tcx, substs), kind) - } - &PredicateKind::ConstEvaluatable(def_id, const_substs) => { - PredicateKind::ConstEvaluatable(def_id, const_substs.subst(tcx, substs)) - } - PredicateKind::ConstEquate(c1, c2) => { - PredicateKind::ConstEquate(c1.subst(tcx, substs), c2.subst(tcx, substs)) - } + let kind = match self.kint(tcx) { + PredicateKint::ForAll(binder) => *binder.skip_binder(), + kind => kind, }; - if new != *kind { new.to_predicate(tcx) } else { self } + let new = kind.subst(tcx, substs); + + let rebound = if new.has_escaping_bound_vars() { + PredicateKint::ForAll(Binder::bind(tcx.intern_predicate_kint(new))) + } else { + new + }; + + if rebound != *kind { rebound.to_predicate(tcx) } else { self } } }