pub(crate) struct TypeVariableStorage<'tcx> {
values: IndexVec<TyVid, TypeVariableData>,
eq_relations: UnificationTableStorage<TyVidEqKey<'tcx>>,
sub_unification_table: UnificationTableStorage<TyVidSubKey>,
}Fields§
§values: IndexVec<TyVid, TypeVariableData>The origins of each type variable.
eq_relations: UnificationTableStorage<TyVidEqKey<'tcx>>Two variables are unified in eq_relations when we have a
constraint ?X == ?Y. This table also stores, for each key,
the known value.
sub_unification_table: UnificationTableStorage<TyVidSubKey>Only used by -Znext-solver and for diagnostics. Tracks whether
type variables are related via subtyping at all, ignoring which of
the two is the subtype.
When reporting ambiguity errors, we sometimes want to treat all inference vars which are subtypes of each others as if they are equal. For this case we compute the transitive closure of our subtype obligations here.
E.g. when encountering ambiguity errors, we want to suggest specifying some method argument or to add a type annotation to a local variable. Because subtyping cannot change the shape of a type, it’s fine if the cause of the ambiguity error is only related to the suggested variable via subtyping.
Even for something like let x = returns_arg(); x.method(); the
type of x is only a supertype of the argument of returns_arg. We
still want to suggest specifying the type of the argument.
Implementations§
Source§impl<'tcx> TypeVariableStorage<'tcx>
impl<'tcx> TypeVariableStorage<'tcx>
pub(crate) fn with_log<'a>( &'a mut self, undo_log: &'a mut InferCtxtUndoLogs<'tcx>, ) -> TypeVariableTable<'a, 'tcx>
pub(crate) fn eq_relations_ref( &self, ) -> &UnificationTableStorage<TyVidEqKey<'tcx>>
pub(super) fn finalize_rollback(&mut self)
Trait Implementations§
Source§impl<'tcx> Clone for TypeVariableStorage<'tcx>
impl<'tcx> Clone for TypeVariableStorage<'tcx>
Source§fn clone(&self) -> TypeVariableStorage<'tcx>
fn clone(&self) -> TypeVariableStorage<'tcx>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<'tcx> Default for TypeVariableStorage<'tcx>
impl<'tcx> Default for TypeVariableStorage<'tcx>
Source§fn default() -> TypeVariableStorage<'tcx>
fn default() -> TypeVariableStorage<'tcx>
Auto Trait Implementations§
impl<'tcx> DynSend for TypeVariableStorage<'tcx>
impl<'tcx> DynSync for TypeVariableStorage<'tcx>
impl<'tcx> Freeze for TypeVariableStorage<'tcx>
impl<'tcx> !RefUnwindSafe for TypeVariableStorage<'tcx>
impl<'tcx> Send for TypeVariableStorage<'tcx>
impl<'tcx> Sync for TypeVariableStorage<'tcx>
impl<'tcx> Unpin for TypeVariableStorage<'tcx>
impl<'tcx> !UnwindSafe for TypeVariableStorage<'tcx>
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
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<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§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<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> 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>
impl<T> ErasedDestructor for Twhere
T: 'static,
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: 72 bytes