pub struct Assumptions<I: Interner> {
pub type_outlives: Vec<Binder<I, OutlivesClause<I, I::Ty>>>,
pub region_outlives: TransitiveRelation<Region<I>>,
pub inverse_region_outlives: TransitiveRelation<Region<I>>,
}Fields§
§type_outlives: Vec<Binder<I, OutlivesClause<I, I::Ty>>>§region_outlives: TransitiveRelation<Region<I>>Known 'a: 'b assumptions, stored as an edge from the outliving region to the
outlived one, i.e. an edge ('a, 'b) means 'a: 'b. Constructors expect a relation
with this direction, see regions_outlived_by and regions_outliving for how it
is consumed.
inverse_region_outlives: TransitiveRelation<Region<I>>Implementations§
Source§impl<I: Interner> Assumptions<I>
impl<I: Interner> Assumptions<I>
pub fn empty() -> Self
Sourcepub fn new(
infcx: &impl InferCtxtLike<Interner = I>,
clauses: impl IntoIterator<Item = I::Clause>,
region_outlives: TransitiveRelation<Region<I>>,
universe: UniverseIndex,
) -> Self
pub fn new( infcx: &impl InferCtxtLike<Interner = I>, clauses: impl IntoIterator<Item = I::Clause>, region_outlives: TransitiveRelation<Region<I>>, universe: UniverseIndex, ) -> Self
Builds assumptions from clauses, elaborating them and keeping the outlives ones.
Callers hand us their clauses straight from the environment, so we have to elaborate here to get at the implied outlives bounds:
- a
Ty: 'aclause tells us that every region component ofTyoutlives'a, e.g.&'b u8: 'aimplies'b: 'a. Without it we’d fail to prove'b: 'awhen leaving the binder these assumptions belong to. - it also gives us the components as type outlives, e.g.
Vec<T>: 'aimpliesT: 'a, which we need for placeholder and alias outlives. - trait clauses imply their supertraits, so
T: Bound<'a>wheretrait Bound<'c>: 'cgives usT: 'a. This is why we take clauses rather than just the outlives ones: filtering down to outlives before elaborating would throw those away.
Only the clauses whose max universe is exactly universe are kept, which is what the
solver wants when computing the assumptions of a single binder. This happens after
elaboration on purpose, so a clause whose regions live in more than one universe still
contributes its implied bounds to each of them: (&'b u8, &'c u8): 'a gives us
'c: 'a in 'cs universe even though the clause itself is in 'bs.
Use Assumptions::new_unelaborated when the caller needs the assumptions to be
exactly the clauses it passed in.
Sourcepub fn new_unelaborated(
type_outlives: Vec<Binder<I, OutlivesClause<I, I::Ty>>>,
region_outlives: TransitiveRelation<Region<I>>,
) -> Self
pub fn new_unelaborated( type_outlives: Vec<Binder<I, OutlivesClause<I, I::Ty>>>, region_outlives: TransitiveRelation<Region<I>>, ) -> Self
Builds assumptions from exactly the given clauses, see Assumptions::new for when
the clauses should get elaborated instead.
Trait Implementations§
Source§impl<I> Clone for Assumptions<I>where
I: Interner,
impl<I> Clone for Assumptions<I>where
I: Interner,
Auto Trait Implementations§
impl<I> DynSend for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: DynSend,
TransitiveRelation<Region<I>>: DynSend,
impl<I> DynSync for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: DynSync,
TransitiveRelation<Region<I>>: DynSync,
impl<I> Freeze for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: Freeze,
TransitiveRelation<Region<I>>: Freeze,
impl<I> RefUnwindSafe for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: RefUnwindSafe,
TransitiveRelation<Region<I>>: RefUnwindSafe,
impl<I> Send for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: Send,
TransitiveRelation<Region<I>>: Send,
impl<I> Sync for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: Sync,
TransitiveRelation<Region<I>>: Sync,
impl<I> Unpin for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: Unpin,
TransitiveRelation<Region<I>>: Unpin,
impl<I> UnsafeUnpin for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: UnsafeUnpin,
TransitiveRelation<Region<I>>: UnsafeUnpin,
impl<I> UnwindSafe for Assumptions<I>where
Vec<Binder<I, OutlivesClause<I, <I as Interner>::Ty>>>: UnwindSafe,
TransitiveRelation<Region<I>>: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
Source§fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 280 bytes