tcx: TyCtxt<'tcx>,
pred: ty::Predicate<'tcx>,
) -> ty::Predicate<'tcx> {
- match pred.kind() {
+ let kind = pred.kind();
+ let new = match kind {
&ty::PredicateKind::Trait(ref data, constness) => {
ty::PredicateKind::Trait(tcx.anonymize_late_bound_regions(data), constness)
- .to_predicate(tcx)
}
ty::PredicateKind::RegionOutlives(data) => {
ty::PredicateKind::RegionOutlives(tcx.anonymize_late_bound_regions(data))
- .to_predicate(tcx)
}
ty::PredicateKind::TypeOutlives(data) => {
ty::PredicateKind::TypeOutlives(tcx.anonymize_late_bound_regions(data))
- .to_predicate(tcx)
}
ty::PredicateKind::Projection(data) => {
- ty::PredicateKind::Projection(tcx.anonymize_late_bound_regions(data)).to_predicate(tcx)
+ ty::PredicateKind::Projection(tcx.anonymize_late_bound_regions(data))
}
- &ty::PredicateKind::WellFormed(data) => {
- ty::PredicateKind::WellFormed(data).to_predicate(tcx)
- }
+ &ty::PredicateKind::WellFormed(data) => ty::PredicateKind::WellFormed(data),
- &ty::PredicateKind::ObjectSafe(data) => {
- ty::PredicateKind::ObjectSafe(data).to_predicate(tcx)
- }
+ &ty::PredicateKind::ObjectSafe(data) => ty::PredicateKind::ObjectSafe(data),
&ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind) => {
- ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind).to_predicate(tcx)
+ ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind)
}
ty::PredicateKind::Subtype(data) => {
- ty::PredicateKind::Subtype(tcx.anonymize_late_bound_regions(data)).to_predicate(tcx)
+ ty::PredicateKind::Subtype(tcx.anonymize_late_bound_regions(data))
}
&ty::PredicateKind::ConstEvaluatable(def_id, substs) => {
- ty::PredicateKind::ConstEvaluatable(def_id, substs).to_predicate(tcx)
+ ty::PredicateKind::ConstEvaluatable(def_id, substs)
}
- ty::PredicateKind::ConstEquate(c1, c2) => {
- ty::PredicateKind::ConstEquate(c1, c2).to_predicate(tcx)
- }
- }
+ ty::PredicateKind::ConstEquate(c1, c2) => ty::PredicateKind::ConstEquate(c1, c2),
+ };
+
+ if new != *kind { new.to_predicate(tcx) } else { pred }
}
struct PredicateSet<'tcx> {
impl<'tcx> Eq for Predicate<'tcx> {}
impl<'tcx> Predicate<'tcx> {
+ #[inline(always)]
pub fn kind(self) -> &'tcx PredicateKind<'tcx> {
self.kind
}
// this trick achieves that).
let substs = &trait_ref.skip_binder().substs;
- let predicate = match self.kind() {
+ let kind = self.kind();
+ let new = match kind {
&PredicateKind::Trait(ref binder, constness) => {
PredicateKind::Trait(binder.map_bound(|data| data.subst(tcx, substs)), constness)
}
}
};
- predicate.to_predicate(tcx)
+ if new != *kind { new.to_predicate(tcx) } else { self }
}
}
}
impl ToPredicate<'tcx> for PredicateKind<'tcx> {
+ #[inline(always)]
fn to_predicate(&self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
tcx.mk_predicate(*self)
}