pub struct InferCtxt<'db> {
pub interner: DbInterner<'db>,
pub inner: RefCell<InferCtxtInner<'db>>,
/* private fields */
}
Fields§
§interner: DbInterner<'db>
§inner: RefCell<InferCtxtInner<'db>>
Implementations§
Source§impl<'db> InferCtxt<'db>
impl<'db> InferCtxt<'db>
pub fn at<'a>( &'a self, cause: &'a ObligationCause, param_env: ParamEnv<'db>, ) -> At<'a, 'db>
Sourcepub fn fork(&self) -> Self
pub fn fork(&self) -> Self
Forks the inference context, creating a new inference context with the same inference variables in the same state. This can be used to “branch off” many tests from the same common state.
Sourcepub fn fork_with_typing_mode(
&self,
typing_mode: TypingMode<DbInterner<'db>>,
) -> Self
pub fn fork_with_typing_mode( &self, typing_mode: TypingMode<DbInterner<'db>>, ) -> Self
Forks the inference context, creating a new inference context with the same inference variables in the same state, except possibly changing the intercrate mode. This can be used to “branch off” many tests from the same common state. Used in negative coherence.
Source§impl<'db> InferCtxt<'db>
impl<'db> InferCtxt<'db>
Sourcepub fn instantiate_canonical<T>(
&self,
canonical: &Canonical<'db, T>,
) -> (T, CanonicalVarValues<'db>)where
T: TypeFoldable<DbInterner<'db>>,
pub fn instantiate_canonical<T>(
&self,
canonical: &Canonical<'db, T>,
) -> (T, CanonicalVarValues<'db>)where
T: TypeFoldable<DbInterner<'db>>,
Creates an instantiation S for the canonical value with fresh inference variables and placeholders then applies it to the canonical value. Returns both the instantiated result and the instantiation S.
This can be invoked as part of constructing an
inference context at the start of a query (see
InferCtxtBuilder::build_with_canonical
). It basically
brings the canonical value “into scope” within your new infcx.
At the end of processing, the instantiation S (once canonicalized) then represents the values that you computed for each of the canonical inputs to your query.
Sourcepub fn instantiate_canonical_var(
&self,
cv_info: CanonicalVarKind<DbInterner<'db>>,
universe_map: impl Fn(UniverseIndex) -> UniverseIndex,
) -> GenericArg<'db>
pub fn instantiate_canonical_var( &self, cv_info: CanonicalVarKind<DbInterner<'db>>, universe_map: impl Fn(UniverseIndex) -> UniverseIndex, ) -> GenericArg<'db>
Given the “info” about a canonical variable, creates a fresh variable for it. If this is an existentially quantified variable, then you’ll get a new inference variable; if it is a universally quantified variable, you get a placeholder.
FIXME(-Znext-solver): This is public because it’s used by the new trait solver which has a different canonicalization routine. We should somehow deduplicate all of this.
Source§impl<'db> InferCtxt<'db>
impl<'db> InferCtxt<'db>
Insert a hidden type into the opaque type storage, making sure it hasn’t previously been defined. This does not emit any constraints and it’s the responsibility of the caller to make sure that the item bounds of the opaque are checked.
Source§impl<'db> InferCtxt<'db>
impl<'db> InferCtxt<'db>
Sourcepub fn instantiate_ty_var<R: PredicateEmittingRelation<InferCtxt<'db>>>(
&self,
relation: &mut R,
target_is_expected: bool,
target_vid: TyVid,
instantiation_variance: Variance,
source_ty: Ty<'db>,
) -> RelateResult<'db, ()>
pub fn instantiate_ty_var<R: PredicateEmittingRelation<InferCtxt<'db>>>( &self, relation: &mut R, target_is_expected: bool, target_vid: TyVid, instantiation_variance: Variance, source_ty: Ty<'db>, ) -> RelateResult<'db, ()>
The idea is that we should ensure that the type variable target_vid
is equal to, a subtype of, or a supertype of source_ty
.
For this, we will instantiate target_vid
with a generalized version
of source_ty
. Generalization introduces other inference variables wherever
subtyping could occur. This also does the occurs checks, detecting whether
instantiating target_vid
would result in a cyclic type. We eagerly error
in this case.
This is not expected to be used anywhere except for an implementation of
TypeRelation
. Do not use this, and instead please use At::eq
, for all
other usecases (i.e. setting the value of a type var).
Source§impl<'db> InferCtxt<'db>
impl<'db> InferCtxt<'db>
Sourcepub fn enter_forall_and_leak_universe<T>(&self, binder: Binder<'db, T>) -> Twhere
T: TypeFoldable<DbInterner<'db>> + Clone,
pub fn enter_forall_and_leak_universe<T>(&self, binder: Binder<'db, T>) -> Twhere
T: TypeFoldable<DbInterner<'db>> + Clone,
Replaces all bound variables (lifetimes, types, and constants) bound by
binder
with placeholder variables in a new universe. This means that the
new placeholders can only be named by inference variables created after
this method has been called.
This is the first step of checking subtyping when higher-ranked things are involved. For more details visit the relevant sections of the rustc dev guide.
fn enter_forall
should be preferred over this method.
Sourcepub fn enter_forall<T, U>(
&self,
forall: Binder<'db, T>,
f: impl FnOnce(T) -> U,
) -> Uwhere
T: TypeFoldable<DbInterner<'db>> + Clone,
pub fn enter_forall<T, U>(
&self,
forall: Binder<'db, T>,
f: impl FnOnce(T) -> U,
) -> Uwhere
T: TypeFoldable<DbInterner<'db>> + Clone,
Replaces all bound variables (lifetimes, types, and constants) bound by
binder
with placeholder variables in a new universe and then calls the
closure f
with the instantiated value. The new placeholders can only be
named by inference variables created inside of the closure f
or afterwards.
This is the first step of checking subtyping when higher-ranked things are involved. For more details visit the relevant sections of the rustc dev guide.
This method should be preferred over fn enter_forall_and_leak_universe
.
Source§impl<'db> InferCtxt<'db>
impl<'db> InferCtxt<'db>
pub fn in_snapshot(&self) -> bool
pub fn num_open_snapshots(&self) -> usize
Sourcepub fn commit_if_ok<T, E, F>(&self, f: F) -> Result<T, E>
pub fn commit_if_ok<T, E, F>(&self, f: F) -> Result<T, E>
Execute f
and commit the bindings if closure f
returns Ok(_)
.
Source§impl<'db> InferCtxt<'db>
impl<'db> InferCtxt<'db>
pub fn typing_mode(&self) -> TypingMode<'db>
pub fn typing_mode_unchecked(&self) -> TypingMode<'db>
pub fn unresolved_variables(&self) -> Vec<Ty<'db>>
pub fn sub_regions(&self, a: Region<'db>, b: Region<'db>)
Sourcepub fn coerce_predicate(
&self,
cause: &ObligationCause,
param_env: ParamEnv<'db>,
predicate: PolyCoercePredicate<'db>,
) -> Result<InferResult<'db, ()>, (TyVid, TyVid)>
pub fn coerce_predicate( &self, cause: &ObligationCause, param_env: ParamEnv<'db>, predicate: PolyCoercePredicate<'db>, ) -> Result<InferResult<'db, ()>, (TyVid, TyVid)>
Processes a Coerce
predicate from the fulfillment context.
This is NOT the preferred way to handle coercion, which is to
invoke FnCtxt::coerce
or a similar method (see coercion.rs
).
This method here is actually a fallback that winds up being
invoked when FnCtxt::coerce
encounters unresolved type variables
and records a coercion predicate. Presently, this method is equivalent
to subtype_predicate
– that is, “coercing” a
to b
winds up
actually requiring a <: b
. This is of course a valid coercion,
but it’s not as flexible as FnCtxt::coerce
would be.
(We may refactor this in the future, but there are a number of
practical obstacles. Among other things, FnCtxt::coerce
presently
records adjustments that are required on the HIR in order to perform
the coercion, and we don’t currently have a way to manage that.)
pub fn subtype_predicate( &self, cause: &ObligationCause, param_env: ParamEnv<'db>, predicate: PolySubtypePredicate<'db>, ) -> Result<InferResult<'db, ()>, (TyVid, TyVid)>
pub fn region_outlives_predicate( &self, cause: &ObligationCause, predicate: PolyRegionOutlivesPredicate<'db>, )
Sourcepub fn num_ty_vars(&self) -> usize
pub fn num_ty_vars(&self) -> usize
Number of type variables created so far.
pub fn next_ty_var(&self) -> Ty<'db>
pub fn next_ty_var_with_origin(&self, origin: TypeVariableOrigin) -> Ty<'db>
pub fn next_ty_var_id_in_universe(&self, universe: UniverseIndex) -> TyVid
pub fn next_ty_var_in_universe(&self, universe: UniverseIndex) -> Ty<'db>
pub fn next_const_var(&self) -> Const<'db>
pub fn next_const_var_with_origin( &self, origin: ConstVariableOrigin, ) -> Const<'db>
pub fn next_const_var_in_universe(&self, universe: UniverseIndex) -> Const<'db>
pub fn next_int_var(&self) -> Ty<'db>
pub fn next_float_var(&self) -> Ty<'db>
Sourcepub fn next_region_var(&self) -> Region<'db>
pub fn next_region_var(&self) -> Region<'db>
Creates a fresh region variable with the next available index. The variable will be created in the maximum universe created thus far, allowing it to name any region created thus far.
Sourcepub fn next_region_var_in_universe(
&self,
universe: UniverseIndex,
) -> Region<'db>
pub fn next_region_var_in_universe( &self, universe: UniverseIndex, ) -> Region<'db>
Creates a fresh region variable with the next available index
in the given universe; typically, you can use
next_region_var
and just use the maximal universe.
pub fn next_term_var_of_kind(&self, term: Term<'db>) -> Term<'db>
Sourcepub fn universe_of_region(&self, r: Region<'db>) -> UniverseIndex
pub fn universe_of_region(&self, r: Region<'db>) -> UniverseIndex
Return the universe that the region r
was created in. For
most regions (e.g., 'static
, named regions from the user,
etc) this is the root universe U0. For inference variables or
placeholders, however, it will return the universe which they
are associated.
Sourcepub fn num_region_vars(&self) -> usize
pub fn num_region_vars(&self) -> usize
Number of region variables created so far.
Sourcepub fn next_nll_region_var(&self) -> Region<'db>
pub fn next_nll_region_var(&self) -> Region<'db>
Just a convenient wrapper of next_region_var
for using during NLL.
Sourcepub fn next_nll_region_var_in_universe(
&self,
universe: UniverseIndex,
) -> Region<'db>
pub fn next_nll_region_var_in_universe( &self, universe: UniverseIndex, ) -> Region<'db>
Just a convenient wrapper of next_region_var
for using during NLL.
Sourcepub fn fresh_args_for_item(&self, def_id: SolverDefId) -> GenericArgs<'db>
pub fn fresh_args_for_item(&self, def_id: SolverDefId) -> GenericArgs<'db>
Given a set of generics defined on a type or impl, returns the generic parameters mapping each type/region parameter to a fresh inference variable.
Sourcepub fn tainted_by_errors(&self) -> Option<ErrorGuaranteed>
pub fn tainted_by_errors(&self) -> Option<ErrorGuaranteed>
Returns true
if errors have been reported since this infcx was
created. This is sometimes used as a heuristic to skip
reporting errors that often occur as a result of earlier
errors, but where it’s hard to be 100% sure (e.g., unresolved
inference variables, regionck errors).
Sourcepub fn set_tainted_by_errors(&self, e: ErrorGuaranteed)
pub fn set_tainted_by_errors(&self, e: ErrorGuaranteed)
Set the “tainted by errors” flag to true. We call this when we observe an error from a prior pass.
pub fn take_opaque_types( &self, ) -> Vec<(OpaqueTypeKey<'db>, OpaqueHiddenType<'db>)>
pub fn clone_opaque_types( &self, ) -> Vec<(OpaqueTypeKey<'db>, OpaqueHiddenType<'db>)>
pub fn can_define_opaque_ty(&self, id: impl Into<SolverDefId>) -> bool
Sourcepub fn probe_ty_var(&self, vid: TyVid) -> Result<Ty<'db>, UniverseIndex>
pub fn probe_ty_var(&self, vid: TyVid) -> Result<Ty<'db>, UniverseIndex>
If TyVar(vid)
resolves to a type, return that type. Else, return the
universe index of TyVar(vid)
.
pub fn shallow_resolve(&self, ty: Ty<'db>) -> Ty<'db>
pub fn shallow_resolve_const(&self, ct: Const<'db>) -> Const<'db>
pub fn root_var(&self, var: TyVid) -> TyVid
pub fn root_const_var(&self, var: ConstVid) -> ConstVid
Sourcepub fn opportunistic_resolve_int_var(&self, vid: IntVid) -> Ty<'db>
pub fn opportunistic_resolve_int_var(&self, vid: IntVid) -> Ty<'db>
Resolves an int var to a rigid int type, if it was constrained to one, or else the root int var in the unification table.
Sourcepub fn opportunistic_resolve_float_var(&self, vid: FloatVid) -> Ty<'db>
pub fn opportunistic_resolve_float_var(&self, vid: FloatVid) -> Ty<'db>
Resolves a float var to a rigid int type, if it was constrained to one, or else the root float var in the unification table.
Sourcepub fn resolve_vars_if_possible<T>(&self, value: T) -> Twhere
T: TypeFoldable<DbInterner<'db>>,
pub fn resolve_vars_if_possible<T>(&self, value: T) -> Twhere
T: TypeFoldable<DbInterner<'db>>,
Where possible, replaces type/const variables in
value
with their final value. Note that region variables
are unaffected. If a type/const variable has not been unified, it
is left as is. This is an idempotent operation that does
not affect inference state in any way and so you can do it
at will.
pub fn probe_const_var( &self, vid: ConstVid, ) -> Result<Const<'db>, UniverseIndex>
pub fn instantiate_binder_with_fresh_vars<T>(
&self,
lbrct: BoundRegionConversionTime,
value: Binder<'db, T>,
) -> Twhere
T: TypeFoldable<DbInterner<'db>> + Clone,
Sourcepub fn closure_kind(&self, closure_ty: Ty<'db>) -> Option<ClosureKind>
pub fn closure_kind(&self, closure_ty: Ty<'db>) -> Option<ClosureKind>
Obtains the latest type of the given closure; this may be a
closure in the current function, in which case its
ClosureKind
may not yet be known.
pub fn universe(&self) -> UniverseIndex
Sourcepub fn create_next_universe(&self) -> UniverseIndex
pub fn create_next_universe(&self) -> UniverseIndex
Creates and return a fresh universe that extends all previous
universes. Updates self.universe
to that new universe.
Sourcepub fn is_ty_infer_var_definitely_unchanged<'a>(
&'a self,
) -> impl Fn(TyOrConstInferVar) -> bool + Captures<'db> + 'a
pub fn is_ty_infer_var_definitely_unchanged<'a>( &'a self, ) -> impl Fn(TyOrConstInferVar) -> bool + Captures<'db> + 'a
The returned function is used in a fast path. If it returns true
the variable is
unchanged, false
indicates that the status is unknown.
Sourcepub fn ty_or_const_infer_var_changed(
&self,
infer_var: TyOrConstInferVar,
) -> bool
pub fn ty_or_const_infer_var_changed( &self, infer_var: TyOrConstInferVar, ) -> bool
ty_or_const_infer_var_changed
is equivalent to one of these two:
shallow_resolve(ty) != ty
(wherety.kind = Infer(_)
)shallow_resolve(ct) != ct
(wherect.kind = ConstKind::Infer(_)
)
However, ty_or_const_infer_var_changed
is more efficient. It’s always
inlined, despite being large, because it has only two call sites that
are extremely hot (both in traits::fulfill
’s checking of stalled_on
inference variables), and it handles both Ty
and Const
without
having to resort to storing full GenericArg
s in stalled_on
.
Trait Implementations§
Source§impl<'db> InferCtxtLike for InferCtxt<'db>
impl<'db> InferCtxtLike for InferCtxt<'db>
type Interner = DbInterner<'db>
type OpaqueTypeStorageEntries = OpaqueTypeStorageEntries
fn cx(&self) -> DbInterner<'db>
Source§fn next_trait_solver(&self) -> bool
fn next_trait_solver(&self) -> bool
fn typing_mode(&self) -> TypingMode<DbInterner<'db>>
fn universe(&self) -> UniverseIndex
fn create_next_universe(&self) -> UniverseIndex
fn universe_of_ty(&self, vid: TyVid) -> Option<UniverseIndex>
fn universe_of_lt(&self, lt: RegionVid) -> Option<UniverseIndex>
fn universe_of_ct(&self, ct: ConstVid) -> Option<UniverseIndex>
fn root_ty_var(&self, var: TyVid) -> TyVid
fn root_const_var(&self, var: ConstVid) -> ConstVid
fn opportunistic_resolve_ty_var(&self, vid: TyVid) -> Ty<'db>
fn opportunistic_resolve_int_var(&self, vid: IntVid) -> Ty<'db>
fn opportunistic_resolve_float_var(&self, vid: FloatVid) -> Ty<'db>
fn opportunistic_resolve_ct_var(&self, vid: ConstVid) -> Const<'db>
fn opportunistic_resolve_lt_var(&self, vid: RegionVid) -> Region<'db>
fn is_changed_arg(&self, arg: <Self::Interner as Interner>::GenericArg) -> bool
fn next_ty_infer(&self) -> Ty<'db>
fn next_region_infer(&self) -> <Self::Interner as Interner>::Region
fn next_const_infer(&self) -> Const<'db>
fn fresh_args_for_item(&self, def_id: SolverDefId) -> GenericArgs<'db>
fn instantiate_binder_with_infer<T: TypeFoldable<DbInterner<'db>> + Clone>( &self, value: Binder<'db, T>, ) -> T
fn enter_forall<T: TypeFoldable<DbInterner<'db>> + Clone, U>( &self, value: Binder<'db, T>, f: impl FnOnce(T) -> U, ) -> U
fn equate_ty_vids_raw(&self, a: TyVid, b: TyVid)
fn equate_int_vids_raw(&self, a: IntVid, b: IntVid)
fn equate_float_vids_raw(&self, a: FloatVid, b: FloatVid)
fn equate_const_vids_raw(&self, a: ConstVid, b: ConstVid)
fn instantiate_ty_var_raw<R: PredicateEmittingRelation<Self>>( &self, relation: &mut R, target_is_expected: bool, target_vid: TyVid, instantiation_variance: Variance, source_ty: Ty<'db>, ) -> RelateResult<'db, ()>
fn instantiate_int_var_raw(&self, vid: IntVid, value: IntVarValue)
fn instantiate_float_var_raw(&self, vid: FloatVid, value: FloatVarValue)
fn instantiate_const_var_raw<R: PredicateEmittingRelation<Self>>( &self, relation: &mut R, target_is_expected: bool, target_vid: ConstVid, source_ct: Const<'db>, ) -> RelateResult<'db, ()>
fn set_tainted_by_errors(&self, e: ErrorGuaranteed)
fn shallow_resolve(&self, ty: Ty<'db>) -> Ty<'db>
fn shallow_resolve_const(&self, ct: Const<'db>) -> Const<'db>
fn resolve_vars_if_possible<T>(&self, value: T) -> Twhere
T: TypeFoldable<DbInterner<'db>>,
fn probe<T>(&self, probe: impl FnOnce() -> T) -> T
fn sub_regions(&self, sub: Region<'db>, sup: Region<'db>, span: Span)
fn equate_regions(&self, a: Region<'db>, b: Region<'db>, span: Span)
fn register_ty_outlives(&self, ty: Ty<'db>, r: Region<'db>, span: Span)
fn opaque_types_storage_num_entries(&self) -> OpaqueTypeStorageEntries
fn clone_opaque_types_lookup_table(&self) -> Vec<(OpaqueTypeKey<'db>, Ty<'db>)>
fn clone_duplicate_opaque_types(&self) -> Vec<(OpaqueTypeKey<'db>, Ty<'db>)>
fn clone_opaque_types_added_since( &self, prev_entries: OpaqueTypeStorageEntries, ) -> Vec<(OpaqueTypeKey<'db>, Ty<'db>)>
fn add_duplicate_opaque_type( &self, opaque_type_key: OpaqueTypeKey<'db>, hidden_ty: Ty<'db>, _span: Span, )
fn reset_opaque_types(&self)
Auto Trait Implementations§
impl<'db> !Freeze for InferCtxt<'db>
impl<'db> !RefUnwindSafe for InferCtxt<'db>
impl<'db> Send for InferCtxt<'db>
impl<'db> !Sync for InferCtxt<'db>
impl<'db> Unpin for InferCtxt<'db>
impl<'db> !UnwindSafe for InferCtxt<'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
§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> ⓘ
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 more