pub type TypingMode<'tcx> = TypingMode<TyCtxt<'tcx>>;
Aliased Type§
enum TypingMode<'tcx> {
Coherence,
Analysis {
defining_opaque_types: &'tcx RawList<(), LocalDefId>,
},
PostBorrowckAnalysis {
defined_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
.
We also refuse to project any associated type that is marked default
.
Non-default
(“final”) types are always projected. This is necessary in
general for soundness of specialization. However, we could allow projections
in fully-monomorphic cases. We choose not to, because we prefer for default type
to force the type definition to be treated abstractly by any consumers of the
impl. Concretely, that means that the following example will
fail to compile:
#![feature(specialization)]
trait Assoc {
type Output;
}
impl<T> Assoc for T {
default type Output = bool;
}
fn main() {
let x: <() as Assoc>::Output = true;
}
Fields
defining_opaque_types: &'tcx RawList<(), LocalDefId>
PostBorrowckAnalysis
Any analysis after borrowck for a given body should be able to use all the hidden types defined by borrowck, without being able to define any new ones.
This is currently only used by the new solver, but should be implemented in the old solver as well.
Fields
defined_opaque_types: &'tcx RawList<(), LocalDefId>
PostAnalysis
After analysis, mostly during codegen and MIR optimizations, we’re able to reveal all opaque types. As the concrete type should never be observable directly by the user, this should not be used by checks which may expose such details to the user.
There are some exceptions to this as for example layout_of
and const-evaluation
always run in PostAnalysis
mode, even when used during analysis. This exposes
some information about the underlying type to users, but not the type itself.
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 bytesPostBorrowckAnalysis
: 8 bytesPostAnalysis
: 0 bytes
Implementations
Source§impl<I> TypingMode<I>where
I: Interner,
impl<I> TypingMode<I>where
I: Interner,
Sourcepub fn non_body_analysis() -> TypingMode<I>
pub fn non_body_analysis() -> TypingMode<I>
Analysis outside of a body does not define any opaque types.
Sourcepub 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 post_borrowck_analysis( cx: I, body_def_id: <I as Interner>::LocalDefId, ) -> TypingMode<I>
Trait Implementations
Source§impl<I> Clone for TypingMode<I>where
I: Interner,
impl<I> Clone for TypingMode<I>where
I: Interner,
Source§fn clone(&self) -> TypingMode<I>
fn clone(&self) -> TypingMode<I>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<I> Debug for TypingMode<I>where
I: Interner,
impl<I> Debug for TypingMode<I>where
I: Interner,
Source§impl<I, __D> Decodable<__D> for TypingMode<I>
impl<I, __D> Decodable<__D> for TypingMode<I>
fn decode(__decoder: &mut __D) -> TypingMode<I>
Source§impl<I, __E> Encodable<__E> for TypingMode<I>
impl<I, __E> Encodable<__E> for TypingMode<I>
Source§impl<I> Hash for TypingMode<I>where
I: Interner,
impl<I> Hash for TypingMode<I>where
I: Interner,
Source§impl<I, __CTX> HashStable<__CTX> for TypingMode<I>
impl<I, __CTX> HashStable<__CTX> for TypingMode<I>
fn hash_stable( &self, __hcx: &mut __CTX, __hasher: &mut StableHasher<SipHasher128>, )
Source§impl<I> PartialEq for TypingMode<I>where
I: Interner,
impl<I> PartialEq for TypingMode<I>where
I: Interner,
Source§impl<I> TypeFoldable<I> for TypingMode<I>
impl<I> TypeFoldable<I> for TypingMode<I>
Source§fn try_fold_with<__F>(
self,
__folder: &mut __F,
) -> Result<TypingMode<I>, <__F as FallibleTypeFolder<I>>::Error>where
__F: FallibleTypeFolder<I>,
fn try_fold_with<__F>(
self,
__folder: &mut __F,
) -> Result<TypingMode<I>, <__F as FallibleTypeFolder<I>>::Error>where
__F: FallibleTypeFolder<I>,
Source§fn fold_with<F>(self, folder: &mut F) -> Selfwhere
F: TypeFolder<I>,
fn fold_with<F>(self, folder: &mut F) -> Selfwhere
F: TypeFolder<I>,
try_fold_with
for use with infallible
folders. Do not override this method, to ensure coherence with
try_fold_with
.