pub type TypingMode<'tcx> = TypingMode<TyCtxt<'tcx>>;
Aliased Type§
enum TypingMode<'tcx> {
Coherence,
Analysis {
defining_opaque_types: &'tcx RawList<(), LocalDefId>,
},
PostAnalysis,
}
Variants§
Coherence
When checking whether impls overlap, we check whether any obligations are guaranteed to never hold when unifying the impls. This requires us to be complete: we must never fail to prove something which may actually hold.
In this typing mode we bail with ambiguity in case its not knowable whether a trait goal may hold, e.g. because the trait may get implemented in a downstream or sibling crate.
We also have to be careful when generalizing aliases inside of higher-ranked types to not unnecessarily constrain any inference variables.
Analysis
Analysis includes type inference, checking that items are well-formed, and pretty much everything else which may emit proper type errors to the user.
We only normalize opaque types which may get defined by the current body,
which are stored in defining_opaque_types
.
Fields
defining_opaque_types: &'tcx RawList<(), LocalDefId>
PostAnalysis
After analysis, mostly during codegen and MIR optimizations, we’re able to reveal all opaque types.
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
Size for each variant:
Coherence
: 0 bytesAnalysis
: 8 bytesPostAnalysis
: 0 bytes
Implementations
§impl<I> TypingMode<I>where
I: Interner,
impl<I> TypingMode<I>where
I: Interner,
pub fn non_body_analysis() -> TypingMode<I>
pub fn non_body_analysis() -> TypingMode<I>
Analysis outside of a body does not define any opaque types.
pub fn analysis_in_body(
cx: I,
body_def_id: <I as Interner>::LocalDefId,
) -> TypingMode<I>
pub fn analysis_in_body( cx: I, body_def_id: <I as Interner>::LocalDefId, ) -> TypingMode<I>
While typechecking a body, we need to be able to define the opaque types defined by that body.
pub fn from_param_env(param_env: <I as Interner>::ParamEnv) -> TypingMode<I>
pub fn from_param_env(param_env: <I as Interner>::ParamEnv) -> TypingMode<I>
FIXME(#132279): Using this function is questionable as the param_env
does not track defining_opaque_types
and whether we’re in coherence mode.
Many uses of this function should also use a not-yet implemented typing mode
which reveals already defined opaque types in the future. This function will
get completely removed at some point.