pub(super) struct WfCheckingCtxt<'a, 'tcx> {
pub(super) ocx: ObligationCtxt<'a, 'tcx, FulfillmentError<'tcx>>,
body_def_id: LocalDefId,
param_env: ParamEnv<'tcx>,
}Fields§
§ocx: ObligationCtxt<'a, 'tcx, FulfillmentError<'tcx>>§body_def_id: LocalDefId§param_env: ParamEnv<'tcx>Implementations§
Source§impl<'tcx> WfCheckingCtxt<'_, 'tcx>
impl<'tcx> WfCheckingCtxt<'_, 'tcx>
fn tcx(&self) -> TyCtxt<'tcx>
fn normalize<T>(&self, span: Span, loc: Option<WellFormedLoc>, value: T) -> Twhere
T: TypeFoldable<TyCtxt<'tcx>>,
Sourcepub(super) fn deeply_normalize<T>(
&self,
span: Span,
loc: Option<WellFormedLoc>,
value: T,
) -> Twhere
T: TypeFoldable<TyCtxt<'tcx>>,
pub(super) fn deeply_normalize<T>(
&self,
span: Span,
loc: Option<WellFormedLoc>,
value: T,
) -> Twhere
T: TypeFoldable<TyCtxt<'tcx>>,
Convenience function to deeply normalize during wfcheck. In the old solver,
this just dispatches to WfCheckingCtxt::normalize, but in the new solver
this calls deeply_normalize and reports errors if they are encountered.
This function should be called in favor of normalize in cases where we will
then check the well-formedness of the type, since we only use the normalized
signature types for implied bounds when checking regions.
pub(super) fn register_wf_obligation( &self, span: Span, loc: Option<WellFormedLoc>, term: Term<'tcx>, )
Source§impl<'tcx> WfCheckingCtxt<'_, 'tcx>
impl<'tcx> WfCheckingCtxt<'_, 'tcx>
Sourcefn check_false_global_bounds(&mut self)
fn check_false_global_bounds(&mut self)
Feature gates RFC 2056 – trivial bounds, checking for global bounds that aren’t true.
Methods from Deref<Target = ObligationCtxt<'a, 'tcx, FulfillmentError<'tcx>>>§
pub fn register_obligation(&self, obligation: Obligation<'tcx, Predicate<'tcx>>)
pub fn register_obligations( &self, obligations: impl IntoIterator<Item = Obligation<'tcx, Predicate<'tcx>>>, )
pub fn register_infer_ok_obligations<T>(&self, infer_ok: InferOk<'tcx, T>) -> T
pub fn register_bound(
&self,
cause: ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
ty: Ty<'tcx>,
def_id: DefId,
)
pub fn register_bound( &self, cause: ObligationCause<'tcx>, param_env: ParamEnv<'tcx>, ty: Ty<'tcx>, def_id: DefId, )
Requires that ty must implement the trait with def_id in
the given environment. This trait must not have any type
parameters (except for Self).
pub fn normalize<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
value: T,
) -> Twhere
T: TypeFoldable<TyCtxt<'tcx>>,
pub fn eq<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
expected: T,
actual: T,
) -> Result<(), TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
pub fn eq_trace<T>( &self, cause: &ObligationCause<'tcx>, param_env: ParamEnv<'tcx>, trace: TypeTrace<'tcx>, expected: T, actual: T, ) -> Result<(), TypeError<TyCtxt<'tcx>>>
pub fn sub<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
expected: T,
actual: T,
) -> Result<(), TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
pub fn sub<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
expected: T,
actual: T,
) -> Result<(), TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
Checks whether expected is a subtype of actual: expected <: actual.
pub fn relate<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
variance: Variance,
expected: T,
actual: T,
) -> Result<(), TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
pub fn sup<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
expected: T,
actual: T,
) -> Result<(), TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
pub fn sup<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
expected: T,
actual: T,
) -> Result<(), TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
Checks whether expected is a supertype of actual: expected :> actual.
pub fn lub<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
expected: T,
actual: T,
) -> Result<T, TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
pub fn lub<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
expected: T,
actual: T,
) -> Result<T, TypeError<TyCtxt<'tcx>>>where
T: ToTrace<'tcx>,
Computes the least-upper-bound, or mutual supertype, of two values.
pub fn try_evaluate_obligations(&self) -> Vec<E>
pub fn try_evaluate_obligations(&self) -> Vec<E>
Go over the list of pending obligations and try to evaluate them.
For each result: Ok: remove the obligation from the list Ambiguous: leave the obligation in the list to be evaluated later Err: remove the obligation from the list and return an error
Returns a list of errors from obligations that evaluated to Err.
pub fn evaluate_obligations_error_on_ambiguity(&self) -> Vec<E>
pub fn evaluate_obligations_error_on_ambiguity(&self) -> Vec<E>
Evaluate all pending obligations, return error if they can’t be evaluated.
For each result: Ok: remove the obligation from the list Ambiguous: remove the obligation from the list and return an error Err: remove the obligation from the list and return an error
Returns a list of errors from obligations that evaluated to Ambiguous or Err.
pub fn assumed_wf_types_and_report_errors( &self, param_env: ParamEnv<'tcx>, def_id: LocalDefId, ) -> Result<IndexSet<Ty<'tcx>, BuildHasherDefault<FxHasher>>, ErrorGuaranteed>
pub fn make_canonicalized_query_response<T>(
&self,
inference_vars: CanonicalVarValues<TyCtxt<'tcx>>,
answer: T,
) -> Result<&'tcx Canonical<TyCtxt<'tcx>, QueryResponse<'tcx, T>>, NoSolution>where
T: Debug + TypeFoldable<TyCtxt<'tcx>>,
Canonical<TyCtxt<'tcx>, QueryResponse<'tcx, T>>: ArenaAllocatable<'tcx>,
pub fn assumed_wf_types( &self, param_env: ParamEnv<'tcx>, def_id: LocalDefId, ) -> Result<IndexSet<Ty<'tcx>, BuildHasherDefault<FxHasher>>, Vec<E>>
pub fn deeply_normalize<T>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ParamEnv<'tcx>,
value: T,
) -> Result<T, Vec<E>>where
T: TypeFoldable<TyCtxt<'tcx>>,
pub fn structurally_normalize_ty( &self, cause: &ObligationCause<'tcx>, param_env: ParamEnv<'tcx>, value: Ty<'tcx>, ) -> Result<Ty<'tcx>, Vec<E>>
pub fn structurally_normalize_const( &self, cause: &ObligationCause<'tcx>, param_env: ParamEnv<'tcx>, value: Const<'tcx>, ) -> Result<Const<'tcx>, Vec<E>>
pub fn structurally_normalize_term( &self, cause: &ObligationCause<'tcx>, param_env: ParamEnv<'tcx>, value: Term<'tcx>, ) -> Result<Term<'tcx>, Vec<E>>
Trait Implementations§
Auto Trait Implementations§
impl<'a, 'tcx> !DynSend for WfCheckingCtxt<'a, 'tcx>
impl<'a, 'tcx> !DynSync for WfCheckingCtxt<'a, 'tcx>
impl<'a, 'tcx> !Freeze for WfCheckingCtxt<'a, 'tcx>
impl<'a, 'tcx> !RefUnwindSafe for WfCheckingCtxt<'a, 'tcx>
impl<'a, 'tcx> !Send for WfCheckingCtxt<'a, 'tcx>
impl<'a, 'tcx> !Sync for WfCheckingCtxt<'a, 'tcx>
impl<'a, 'tcx> Unpin for WfCheckingCtxt<'a, 'tcx>
impl<'a, 'tcx> !UnwindSafe for WfCheckingCtxt<'a, '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<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: 48 bytes