pub(crate) struct LatticeOp<'infcx, 'db> {
infcx: &'infcx InferCtxt<'db>,
trace: TypeTrace<'db>,
param_env: ParamEnv<'db>,
kind: LatticeOpKind,
obligations: Vec<Obligation<'db, Predicate<'db>>>,
}Expand description
A greatest lower bound“ (common subtype) or least upper bound (common supertype).
Fields§
§infcx: &'infcx InferCtxt<'db>§trace: TypeTrace<'db>§param_env: ParamEnv<'db>§kind: LatticeOpKind§obligations: Vec<Obligation<'db, Predicate<'db>>>Implementations§
Source§impl<'infcx, 'db> LatticeOp<'infcx, 'db>
impl<'infcx, 'db> LatticeOp<'infcx, 'db>
pub(crate) fn new( infcx: &'infcx InferCtxt<'db>, trace: TypeTrace<'db>, param_env: ParamEnv<'db>, kind: LatticeOpKind, ) -> LatticeOp<'infcx, 'db>
pub(crate) fn into_obligations(self) -> Vec<Obligation<'db, Predicate<'db>>>
Source§impl<'infcx, 'db> LatticeOp<'infcx, 'db>
impl<'infcx, 'db> LatticeOp<'infcx, 'db>
fn relate_bound( &mut self, v: Ty<'db>, a: Ty<'db>, b: Ty<'db>, ) -> RelateResult<'db, ()>
Trait Implementations§
Source§impl<'db> PredicateEmittingRelation<InferCtxt<'db>> for LatticeOp<'_, 'db>
impl<'db> PredicateEmittingRelation<InferCtxt<'db>> for LatticeOp<'_, 'db>
fn span(&self) -> Span
Source§fn structurally_relate_aliases(&self) -> StructurallyRelateAliases
fn structurally_relate_aliases(&self) -> StructurallyRelateAliases
Whether aliases should be related structurally. This is pretty much
always
No unless you’re equating in some specific locations of the
new solver. See the comments in these use-cases for more details.fn param_env(&self) -> ParamEnv<'db>
Source§fn register_predicates(
&mut self,
preds: impl IntoIterator<Item: Upcast<DbInterner<'db>, Predicate<'db>>>,
)
fn register_predicates( &mut self, preds: impl IntoIterator<Item: Upcast<DbInterner<'db>, Predicate<'db>>>, )
Register predicates that must hold in order for this relation to hold.
This uses the default
param_env of the obligation.Source§fn register_goals(
&mut self,
goals: impl IntoIterator<Item = Goal<'db, Predicate<'db>>>,
)
fn register_goals( &mut self, goals: impl IntoIterator<Item = Goal<'db, Predicate<'db>>>, )
Register obligations that must hold in order for this relation to hold
Source§fn register_alias_relate_predicate(&mut self, a: Ty<'db>, b: Ty<'db>)
fn register_alias_relate_predicate(&mut self, a: Ty<'db>, b: Ty<'db>)
Register
AliasRelate obligation(s) that both types must be related to each other.Source§impl<'db> TypeRelation<DbInterner<'db>> for LatticeOp<'_, 'db>
impl<'db> TypeRelation<DbInterner<'db>> for LatticeOp<'_, 'db>
Source§fn tys(&mut self, a: Ty<'db>, b: Ty<'db>) -> RelateResult<'db, Ty<'db>>
fn tys(&mut self, a: Ty<'db>, b: Ty<'db>) -> RelateResult<'db, Ty<'db>>
Relates two types using a given lattice.
fn cx(&self) -> DbInterner<'db>
fn relate_ty_args( &mut self, a_ty: Ty<'db>, b_ty: Ty<'db>, def_id: SolverDefId<'db>, a_args: GenericArgs<'db>, b_args: GenericArgs<'db>, mk: impl FnOnce(GenericArgs<'db>) -> Ty<'db>, ) -> RelateResult<'db, Ty<'db>>
Source§fn relate_with_variance<T: Relate<DbInterner<'db>>>(
&mut self,
variance: Variance,
_info: VarianceDiagInfo<DbInterner<'db>>,
a: T,
b: T,
) -> RelateResult<'db, T>
fn relate_with_variance<T: Relate<DbInterner<'db>>>( &mut self, variance: Variance, _info: VarianceDiagInfo<DbInterner<'db>>, a: T, b: T, ) -> RelateResult<'db, T>
Switch variance for the purpose of relating
a and b.fn regions( &mut self, a: Region<'db>, b: Region<'db>, ) -> RelateResult<'db, Region<'db>>
fn consts( &mut self, a: Const<'db>, b: Const<'db>, ) -> RelateResult<'db, Const<'db>>
fn binders<T>(
&mut self,
a: Binder<'db, T>,
b: Binder<'db, T>,
) -> RelateResult<'db, Binder<'db, T>>where
T: Relate<DbInterner<'db>>,
Auto Trait Implementations§
impl<'infcx, 'db> Freeze for LatticeOp<'infcx, 'db>
impl<'infcx, 'db> !RefUnwindSafe for LatticeOp<'infcx, 'db>
impl<'infcx, 'db> !Send for LatticeOp<'infcx, 'db>
impl<'infcx, 'db> !Sync for LatticeOp<'infcx, 'db>
impl<'infcx, 'db> Unpin for LatticeOp<'infcx, 'db>
impl<'infcx, 'db> UnsafeUnpin for LatticeOp<'infcx, 'db>
impl<'infcx, 'db> !UnwindSafe for LatticeOp<'infcx, 'db>
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
Mutably borrows from an owned value. Read more
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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> ⓘ
Converts
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> ⓘ
Converts
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 more