Struct rustc_trait_selection::traits::coherence::OrphanChecker
source · 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>,
impl<'tcx, F, E> OrphanChecker<'tcx, F>where F: FnOnce(Ty<'tcx>) -> Result<Ty<'tcx>, E>,
fn new(in_crate: InCrate, lazily_normalize_ty: F) -> Self
fn found_non_local_ty( &mut self, t: Ty<'tcx> ) -> ControlFlow<OrphanCheckEarlyExit<'tcx, E>>
fn found_param_ty( &mut self, t: Ty<'tcx> ) -> ControlFlow<OrphanCheckEarlyExit<'tcx, E>>
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>,
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>
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.
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>
fn visit_region(&mut self, _r: Region<'tcx>) -> ControlFlow<Self::BreakTy>
fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow<Self::BreakTy>
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> 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
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.