Struct rustc_middle::ty::_match::MatchAgainstFreshVars
source · pub struct MatchAgainstFreshVars<'tcx> {
tcx: TyCtxt<'tcx>,
param_env: ParamEnv<'tcx>,
}
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§
source§impl<'tcx> MatchAgainstFreshVars<'tcx>
impl<'tcx> MatchAgainstFreshVars<'tcx>
pub fn new( tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx> ) -> MatchAgainstFreshVars<'tcx>
Trait Implementations§
source§impl<'tcx> TypeRelation<'tcx> for MatchAgainstFreshVars<'tcx>
impl<'tcx> TypeRelation<'tcx> for MatchAgainstFreshVars<'tcx>
fn tcx(&self) -> TyCtxt<'tcx>
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.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_args(
&mut self,
item_def_id: DefId,
a_arg: GenericArgsRef<'tcx>,
b_arg: GenericArgsRef<'tcx>
) -> RelateResult<'tcx, GenericArgsRef<'tcx>>
fn relate_item_args( &mut self, item_def_id: DefId, a_arg: GenericArgsRef<'tcx>, b_arg: GenericArgsRef<'tcx> ) -> RelateResult<'tcx, GenericArgsRef<'tcx>>
Auto Trait Implementations§
impl<'tcx> !RefUnwindSafe for MatchAgainstFreshVars<'tcx>
impl<'tcx> !Send for MatchAgainstFreshVars<'tcx>
impl<'tcx> !Sync for MatchAgainstFreshVars<'tcx>
impl<'tcx> Unpin for MatchAgainstFreshVars<'tcx>
impl<'tcx> !UnwindSafe for MatchAgainstFreshVars<'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, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§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<'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, cycle: &[QueryInfo], _guar: ErrorGuaranteed ) -> 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