Struct rustc_middle::ty::_match::Match
source · Expand description
A type “A” matches “B” if the fresh types in B could be substituted with values so as to make it equal to A. Matching is intended to be used only on freshened types, and it basically indicates if the non-freshened versions of A and B could have been unified.
It is only an approximation. If it yields false, unification would definitely fail, but a true result doesn’t mean unification would succeed. This is because we don’t track the “side-constraints” on type variables, nor do we track if the same freshened type appears more than once. To some extent these approximations could be fixed, given effort.
Like subtyping, matching is really a binary relation, so the only important thing about the result is Ok/Err. Also, matching never affects any type variables or unification state.
Fields§
§tcx: TyCtxt<'tcx>
§param_env: ParamEnv<'tcx>
Implementations§
Trait Implementations§
source§impl<'tcx> TypeRelation<'tcx> for Match<'tcx>
impl<'tcx> TypeRelation<'tcx> for Match<'tcx>
fn tcx(&self) -> TyCtxt<'tcx>
fn intercrate(&self) -> bool
fn param_env(&self) -> ParamEnv<'tcx>
source§fn a_is_expected(&self) -> bool
fn a_is_expected(&self) -> bool
true
if the value a
is the “expected” type in the
relation. Just affects error messages. Read moresource§fn mark_ambiguous(&mut self)
fn mark_ambiguous(&mut self)
source§fn relate_with_variance<T: Relate<'tcx>>(
&mut self,
_: Variance,
_: VarianceDiagInfo<'tcx>,
a: T,
b: T
) -> RelateResult<'tcx, T>
fn relate_with_variance<T: Relate<'tcx>>(
&mut self,
_: Variance,
_: VarianceDiagInfo<'tcx>,
a: T,
b: T
) -> RelateResult<'tcx, T>
a
and b
.fn regions(
&mut self,
a: Region<'tcx>,
b: Region<'tcx>
) -> RelateResult<'tcx, Region<'tcx>>
fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>>
fn consts(
&mut self,
a: Const<'tcx>,
b: Const<'tcx>
) -> RelateResult<'tcx, Const<'tcx>>
fn binders<T>(
&mut self,
a: Binder<'tcx, T>,
b: Binder<'tcx, T>
) -> RelateResult<'tcx, Binder<'tcx, T>>where
T: Relate<'tcx>,
fn with_cause<F, R>(&mut self, _cause: Cause, f: F) -> Rwhere
F: FnOnce(&mut Self) -> R,
source§fn relate<T: Relate<'tcx>>(&mut self, a: T, b: T) -> RelateResult<'tcx, T>
fn relate<T: Relate<'tcx>>(&mut self, a: T, b: T) -> RelateResult<'tcx, T>
source§fn relate_item_substs(
&mut self,
item_def_id: DefId,
a_subst: SubstsRef<'tcx>,
b_subst: SubstsRef<'tcx>
) -> RelateResult<'tcx, SubstsRef<'tcx>>
fn relate_item_substs(
&mut self,
item_def_id: DefId,
a_subst: SubstsRef<'tcx>,
b_subst: SubstsRef<'tcx>
) -> RelateResult<'tcx, SubstsRef<'tcx>>
Auto Trait Implementations§
impl<'tcx> !RefUnwindSafe for Match<'tcx>
impl<'tcx> !Send for Match<'tcx>
impl<'tcx> !Sync for Match<'tcx>
impl<'tcx> Unpin for Match<'tcx>
impl<'tcx> !UnwindSafe for Match<'tcx>
Blanket Implementations§
source§impl<T, R> InternIteratorElement<T, R> for T
impl<T, R> InternIteratorElement<T, R> for T
type Output = R
fn intern_with<I, F>(iter: I, f: F) -> <T as InternIteratorElement<T, R>>::Outputwhere
I: Iterator<Item = T>,
F: FnOnce(&[T]) -> R,
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
source§impl<'tcx, T> ToPredicate<'tcx, T> for T
impl<'tcx, T> ToPredicate<'tcx, T> for T
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> 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, _: &[QueryInfo]) -> T
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: 16 bytes