rustc_middle::ty

Type Alias TypingMode

Source
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 bytes
  • Analysis: 8 bytes
  • PostAnalysis: 0 bytes

Implementations

Source§

impl<I> TypingMode<I>
where I: Interner,

Source

pub fn non_body_analysis() -> TypingMode<I>

Analysis outside of a body does not define any opaque types.

Source

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.

Trait Implementations

Source§

impl<I> Clone for TypingMode<I>
where I: Interner,

Source§

fn clone(&self) -> TypingMode<I>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<I> Debug for TypingMode<I>
where I: Interner,

Source§

fn fmt(&self, __f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<I, __D> Decodable<__D> for TypingMode<I>
where I: Interner, __D: TyDecoder<I = I>, <I as Interner>::DefiningOpaqueTypes: Decodable<__D>,

Source§

fn decode(__decoder: &mut __D) -> TypingMode<I>

Source§

impl<I, __E> Encodable<__E> for TypingMode<I>
where I: Interner, __E: TyEncoder<I = I>, <I as Interner>::DefiningOpaqueTypes: Encodable<__E>,

Source§

fn encode(&self, __encoder: &mut __E)

Source§

impl<I> Hash for TypingMode<I>
where I: Interner,

Source§

fn hash<__H>(&self, __state: &mut __H)
where __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<I, __CTX> HashStable<__CTX> for TypingMode<I>
where I: Interner, <I as Interner>::DefiningOpaqueTypes: HashStable<__CTX>,

Source§

fn hash_stable( &self, __hcx: &mut __CTX, __hasher: &mut StableHasher<SipHasher128>, )

Source§

impl<I> PartialEq for TypingMode<I>
where I: Interner,

Source§

fn eq(&self, __other: &TypingMode<I>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

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>,

The entry point for folding. To fold a value t with a folder f call: t.try_fold_with(f). Read more
Source§

fn fold_with<F>(self, folder: &mut F) -> Self
where F: TypeFolder<I>,

A convenient alternative to try_fold_with for use with infallible folders. Do not override this method, to ensure coherence with try_fold_with.
Source§

impl<I> TypeVisitable<I> for TypingMode<I>

Source§

fn visit_with<__V>( &self, __visitor: &mut __V, ) -> <__V as TypeVisitor<I>>::Result
where __V: TypeVisitor<I>,

The entry point for visiting. To visit a value t with a visitor v call: t.visit_with(v). Read more
Source§

impl<I> Copy for TypingMode<I>
where I: Interner,

Source§

impl<I> Eq for TypingMode<I>
where I: Interner,