More rebinds
This commit is contained in:
parent
af3b1cb0b5
commit
5e7095850c
24 changed files with 152 additions and 148 deletions
|
@ -118,6 +118,6 @@ impl TypeRelation<'tcx> for Match<'tcx> {
|
|||
where
|
||||
T: Relate<'tcx>,
|
||||
{
|
||||
Ok(ty::Binder::bind(self.relate(a.skip_binder(), b.skip_binder())?))
|
||||
Ok(a.rebind(self.relate(a.skip_binder(), b.skip_binder())?))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -299,6 +299,7 @@ pub struct ResolvedOpaqueTy<'tcx> {
|
|||
/// Here, we would store the type `T`, the span of the value `x`, the "scope-span" for
|
||||
/// the scope that contains `x`, the expr `T` evaluated from, and the span of `foo.await`.
|
||||
#[derive(TyEncodable, TyDecodable, Clone, Debug, Eq, Hash, PartialEq, HashStable)]
|
||||
#[derive(TypeFoldable)]
|
||||
pub struct GeneratorInteriorTypeCause<'tcx> {
|
||||
/// Type of the captured binding.
|
||||
pub ty: Ty<'tcx>,
|
||||
|
@ -423,7 +424,7 @@ pub struct TypeckResults<'tcx> {
|
|||
|
||||
/// Stores the type, expression, span and optional scope span of all types
|
||||
/// that are live across the yield of this generator (if a generator).
|
||||
pub generator_interior_types: Vec<GeneratorInteriorTypeCause<'tcx>>,
|
||||
pub generator_interior_types: ty::Binder<Vec<GeneratorInteriorTypeCause<'tcx>>>,
|
||||
|
||||
/// We sometimes treat byte string literals (which are of type `&[u8; N]`)
|
||||
/// as `&[u8]`, depending on the pattern in which they are used.
|
||||
|
@ -455,7 +456,7 @@ impl<'tcx> TypeckResults<'tcx> {
|
|||
concrete_opaque_types: Default::default(),
|
||||
closure_captures: Default::default(),
|
||||
closure_min_captures: Default::default(),
|
||||
generator_interior_types: Default::default(),
|
||||
generator_interior_types: ty::Binder::dummy(Default::default()),
|
||||
treat_byte_string_as_slice: Default::default(),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1252,7 +1252,7 @@ impl<'tcx> Predicate<'tcx> {
|
|||
let pred = self.skip_binders();
|
||||
let new = pred.subst(tcx, substs);
|
||||
if new != pred {
|
||||
trait_ref.rebind(new).potentially_quantified(tcx, PredicateKind::ForAll)
|
||||
ty::Binder::bind(new).potentially_quantified(tcx, PredicateKind::ForAll)
|
||||
} else {
|
||||
self
|
||||
}
|
||||
|
@ -1282,6 +1282,10 @@ impl<'tcx> PolyTraitPredicate<'tcx> {
|
|||
// Ok to skip binder since trait `DefId` does not care about regions.
|
||||
self.skip_binder().def_id()
|
||||
}
|
||||
|
||||
pub fn self_ty(self) -> ty::Binder<Ty<'tcx>> {
|
||||
self.map_bound(|trait_ref| trait_ref.self_ty())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TyEncodable, TyDecodable)]
|
||||
|
@ -1435,9 +1439,10 @@ impl<'tcx> ToPredicate<'tcx> for PolyProjectionPredicate<'tcx> {
|
|||
|
||||
impl<'tcx> Predicate<'tcx> {
|
||||
pub fn to_opt_poly_trait_ref(self) -> Option<ConstnessAnd<PolyTraitRef<'tcx>>> {
|
||||
match self.skip_binders() {
|
||||
let predicate = self.bound_atom();
|
||||
match predicate.skip_binder() {
|
||||
PredicateAtom::Trait(t, constness) => {
|
||||
Some(ConstnessAnd { constness, value: ty::Binder::bind(t.trait_ref) })
|
||||
Some(ConstnessAnd { constness, value: predicate.rebind(t.trait_ref) })
|
||||
}
|
||||
PredicateAtom::Projection(..)
|
||||
| PredicateAtom::Subtype(..)
|
||||
|
@ -1453,8 +1458,9 @@ impl<'tcx> Predicate<'tcx> {
|
|||
}
|
||||
|
||||
pub fn to_opt_type_outlives(self) -> Option<PolyTypeOutlivesPredicate<'tcx>> {
|
||||
match self.skip_binders() {
|
||||
PredicateAtom::TypeOutlives(data) => Some(ty::Binder::bind(data)),
|
||||
let predicate = self.bound_atom();
|
||||
match predicate.skip_binder() {
|
||||
PredicateAtom::TypeOutlives(data) => Some(predicate.rebind(data)),
|
||||
PredicateAtom::Trait(..)
|
||||
| PredicateAtom::Projection(..)
|
||||
| PredicateAtom::Subtype(..)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue