Change potentially_qualified to be defined on Binder<PredicateAtom>
This commit is contained in:
parent
e4297ba39c
commit
af3b1cb0b5
4 changed files with 41 additions and 27 deletions
|
@ -1149,17 +1149,16 @@ pub enum PredicateAtom<'tcx> {
|
|||
TypeWellFormedFromEnv(Ty<'tcx>),
|
||||
}
|
||||
|
||||
impl<'tcx> PredicateAtom<'tcx> {
|
||||
impl<'tcx> Binder<PredicateAtom<'tcx>> {
|
||||
/// Wraps `self` with the given qualifier if this predicate has any unbound variables.
|
||||
pub fn potentially_quantified(
|
||||
self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
qualifier: impl FnOnce(Binder<PredicateAtom<'tcx>>) -> PredicateKind<'tcx>,
|
||||
) -> Predicate<'tcx> {
|
||||
if self.has_escaping_bound_vars() {
|
||||
qualifier(Binder::bind(self))
|
||||
} else {
|
||||
PredicateKind::Atom(self)
|
||||
match self.no_bound_vars() {
|
||||
Some(atom) => PredicateKind::Atom(atom),
|
||||
None => qualifier(self),
|
||||
}
|
||||
.to_predicate(tcx)
|
||||
}
|
||||
|
@ -1252,7 +1251,11 @@ impl<'tcx> Predicate<'tcx> {
|
|||
let substs = trait_ref.skip_binder().substs;
|
||||
let pred = self.skip_binders();
|
||||
let new = pred.subst(tcx, substs);
|
||||
if new != pred { new.potentially_quantified(tcx, PredicateKind::ForAll) } else { self }
|
||||
if new != pred {
|
||||
trait_ref.rebind(new).potentially_quantified(tcx, PredicateKind::ForAll)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1403,28 +1406,29 @@ impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<PolyTraitRef<'tcx>> {
|
|||
|
||||
impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<PolyTraitPredicate<'tcx>> {
|
||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
||||
PredicateAtom::Trait(self.value.skip_binder(), self.constness)
|
||||
self.value
|
||||
.map_bound(|value| PredicateAtom::Trait(value, self.constness))
|
||||
.potentially_quantified(tcx, PredicateKind::ForAll)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> ToPredicate<'tcx> for PolyRegionOutlivesPredicate<'tcx> {
|
||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
||||
PredicateAtom::RegionOutlives(self.skip_binder())
|
||||
self.map_bound(|value| PredicateAtom::RegionOutlives(value))
|
||||
.potentially_quantified(tcx, PredicateKind::ForAll)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> ToPredicate<'tcx> for PolyTypeOutlivesPredicate<'tcx> {
|
||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
||||
PredicateAtom::TypeOutlives(self.skip_binder())
|
||||
self.map_bound(|value| PredicateAtom::TypeOutlives(value))
|
||||
.potentially_quantified(tcx, PredicateKind::ForAll)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> ToPredicate<'tcx> for PolyProjectionPredicate<'tcx> {
|
||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
||||
PredicateAtom::Projection(self.skip_binder())
|
||||
self.map_bound(|value| PredicateAtom::Projection(value))
|
||||
.potentially_quantified(tcx, PredicateKind::ForAll)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue