struct OrphanChecker<'tcx, F> {
    in_crate: InCrate,
    in_self_ty: bool,
    lazily_normalize_ty: F,
    search_first_local_ty: bool,
    non_local_tys: Vec<(Ty<'tcx>, bool)>,
}

Fields§

§in_crate: InCrate§in_self_ty: bool§lazily_normalize_ty: F§search_first_local_ty: bool

Ignore orphan check failures and exclusively search for the first local type.

§non_local_tys: Vec<(Ty<'tcx>, bool)>

Implementations§

source§

impl<'tcx, F, E> OrphanChecker<'tcx, F>where F: FnOnce(Ty<'tcx>) -> Result<Ty<'tcx>, E>,

source

fn new(in_crate: InCrate, lazily_normalize_ty: F) -> Self

source

fn found_non_local_ty( &mut self, t: Ty<'tcx> ) -> ControlFlow<OrphanCheckEarlyExit<'tcx, E>>

source

fn found_param_ty( &mut self, t: Ty<'tcx> ) -> ControlFlow<OrphanCheckEarlyExit<'tcx, E>>

source

fn def_id_is_local(&mut self, def_id: DefId) -> bool

Trait Implementations§

source§

impl<'tcx, F, E> TypeVisitor<TyCtxt<'tcx>> for OrphanChecker<'tcx, F>where F: FnMut(Ty<'tcx>) -> Result<Ty<'tcx>, E>,

source§

fn visit_const(&mut self, _c: Const<'tcx>) -> ControlFlow<Self::BreakTy>

All possible values for a constant parameter already exist in the crate defining the trait, so they are always non-local1.

Because there’s no way to have an impl where the first local generic argument is a constant, we also don’t have to fail the orphan check when encountering a parameter or a generic constant.

This means that we can completely ignore constants during the orphan check.

See tests/ui/coherence/const-generics-orphan-check-ok.rs for examples.


  1. This might not hold for function pointers or trait objects in the future. As these should be quite rare as const arguments and especially rare as impl parameters, allowing uncovered const parameters in impls seems more useful than allowing impl<T> Trait<local_fn_ptr, T> for i32 to compile. 

§

type BreakTy = OrphanCheckEarlyExit<'tcx, E>

source§

fn visit_region(&mut self, _r: Region<'tcx>) -> ControlFlow<Self::BreakTy>

source§

fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow<Self::BreakTy>

source§

fn visit_binder<T>( &mut self, t: &<I as Interner>::Binder<T> ) -> ControlFlow<Self::BreakTy, ()>where T: TypeVisitable<I>, <I as Interner>::Binder<T>: TypeSuperVisitable<I>,

Auto Trait Implementations§

§

impl<'tcx, F> !RefUnwindSafe for OrphanChecker<'tcx, F>

§

impl<'tcx, F> Send for OrphanChecker<'tcx, F>where F: Send,

§

impl<'tcx, F> Sync for OrphanChecker<'tcx, F>where F: Sync,

§

impl<'tcx, F> Unpin for OrphanChecker<'tcx, F>where F: Unpin,

§

impl<'tcx, F> !UnwindSafe for OrphanChecker<'tcx, F>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.