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
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<SipHasher128>, )
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<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut T
fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'tcx mut [T]
Source§impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut T
fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'tcx mut [T]
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<Tcx, T> DepNodeParams<Tcx> for T
impl<Tcx, T> DepNodeParams<Tcx> for T
default fn fingerprint_style() -> FingerprintStyle
Source§default fn to_fingerprint(&self, tcx: Tcx) -> Fingerprint
default fn to_fingerprint(&self, tcx: Tcx) -> Fingerprint
default fn to_debug_str(&self, tcx: Tcx) -> String
Source§default fn recover(_: Tcx, _: &DepNode) -> Option<T>
default fn recover(_: Tcx, _: &DepNode) -> Option<T>
DepNode
,
something which is needed when forcing DepNode
s during red-green
evaluation. The query system will only call this method if
fingerprint_style()
is not FingerprintStyle::Opaque
.
It is always valid to return None
here, in which case incremental
compilation will treat the query as having changed instead of forcing it.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<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§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<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> 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 bytesErrorIfRigidSelfTy
: 0 bytes