pub enum OpaqueTypesJank {
    AllGood,
    ErrorIfRigidSelfTy,
}Expand description
Supporting not-yet-defined opaque types in HIR typeck is somewhat challenging. Ideally we’d normalize them to a new inference variable and just defer type inference which relies on the opaque until we’ve constrained the hidden type.
This doesn’t work for method and function calls as we need to guide type inference for the function arguments. We treat not-yet-defined opaque types as if they were rigid instead in these places.
When we encounter a ?hidden_type_of_opaque: Trait<?var> goal, we use the
item bounds and blanket impls to guide inference by constraining other type
variables, see EvalCtxt::try_assemble_bounds_via_registered_opaques. We
always keep the certainty as Maybe so that we properly prove these goals
once the hidden type has been constrained.
If we fail to prove the trait goal via item bounds or blanket impls, the
goal would have errored if the opaque type were rigid. In this case, we
set OpaqueTypesJank::ErrorIfRigidSelfTy in the Certainty.
Places in HIR typeck where we want to treat not-yet-defined opaque types as if
they were kind of rigid then use fn root_goal_may_hold_opaque_types_jank which
returns false if the goal doesn’t hold or if OpaqueTypesJank::ErrorIfRigidSelfTy
is set (i.e. proving it required relies on some ?hidden_ty: NotInItemBounds goal).
This is subtly different from actually treating not-yet-defined opaque types as rigid, e.g. it allows constraining opaque types if they are not the self-type of a goal. It is good enough for now and only matters for very rare type inference edge cases. We can improve this later on if necessary.
Variants§
Implementations§
Source§impl OpaqueTypesJank
 
impl OpaqueTypesJank
fn and(self, other: OpaqueTypesJank) -> OpaqueTypesJank
pub fn or(self, other: OpaqueTypesJank) -> OpaqueTypesJank
Trait Implementations§
Source§impl Clone for OpaqueTypesJank
 
impl Clone for OpaqueTypesJank
Source§fn clone(&self) -> OpaqueTypesJank
 
fn clone(&self) -> OpaqueTypesJank
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
 
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for OpaqueTypesJank
 
impl Debug for OpaqueTypesJank
Source§impl Hash for OpaqueTypesJank
 
impl Hash for OpaqueTypesJank
Source§impl<__CTX> HashStable<__CTX> for OpaqueTypesJank
 
impl<__CTX> HashStable<__CTX> for OpaqueTypesJank
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
Source§impl PartialEq for OpaqueTypesJank
 
impl PartialEq for OpaqueTypesJank
impl Copy for OpaqueTypesJank
impl Eq for OpaqueTypesJank
impl StructuralPartialEq for OpaqueTypesJank
Auto Trait Implementations§
impl DynSend for OpaqueTypesJank
impl DynSync for OpaqueTypesJank
impl Freeze for OpaqueTypesJank
impl RefUnwindSafe for OpaqueTypesJank
impl Send for OpaqueTypesJank
impl Sync for OpaqueTypesJank
impl Unpin for OpaqueTypesJank
impl UnwindSafe for OpaqueTypesJank
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
Source§impl<T> CloneToUninit for Twhere
    T: Clone,
 
impl<T> CloneToUninit for Twhere
    T: Clone,
Source§impl<T, R> CollectAndApply<T, R> for T
 
impl<T, R> CollectAndApply<T, R> for T
Source§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
 
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
 
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
 
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
 
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
 
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
    U: UpcastFrom<I, T>,
 
impl<I, T, U> Upcast<I, U> for Twhere
    U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
 
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<T> WithSubscriber for T
 
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
 
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
 
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
    T: 'static,
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: 1 byte
Size for each variant:
- AllGood: 0 bytes
- ErrorIfRigidSelfTy: 0 bytes