Enum rustc_type_ir::solve::CandidateSource
source · pub enum CandidateSource<I: Interner> {
Impl(I::DefId),
BuiltinImpl(BuiltinImplSource),
ParamEnv(usize),
AliasBound,
CoherenceUnknowable,
}
Expand description
Possible ways the given goal can be proven.
Variants§
Impl(I::DefId)
A user written impl.
§Examples
fn main() {
let x: Vec<u32> = Vec::new();
// This uses the impl from the standard library to prove `Vec<T>: Clone`.
let y = x.clone();
}
BuiltinImpl(BuiltinImplSource)
A builtin impl generated by the compiler. When adding a new special trait, try to use actual impls whenever possible. Builtin impls should only be used in cases where the impl cannot be manually be written.
Notable examples are auto traits, Sized
, and DiscriminantKind
.
For a list of all traits with builtin impls, check out the
EvalCtxt::assemble_builtin_impl_candidates
method.
ParamEnv(usize)
An assumption from the environment.
More precisely we’ve used the n-th
assumption in the param_env
.
§Examples
fn is_clone<T: Clone>(x: T) -> (T, T) {
// This uses the assumption `T: Clone` from the `where`-bounds
// to prove `T: Clone`.
(x.clone(), x)
}
AliasBound
If the self type is an alias type, e.g. an opaque type or a projection, we know the bounds on that alias to hold even without knowing its concrete underlying type.
More precisely this candidate is using the n-th
bound in the item_bounds
of
the self type.
§Examples
trait Trait {
type Assoc: Clone;
}
fn foo<T: Trait>(x: <T as Trait>::Assoc) {
// We prove `<T as Trait>::Assoc` by looking at the bounds on `Assoc` in
// in the trait definition.
let _y = x.clone();
}
CoherenceUnknowable
A candidate that is registered only during coherence to represent some yet-unknown impl that could be produced downstream without violating orphan rules.
Trait Implementations§
source§impl<I> Clone for CandidateSource<I>where
I: Interner,
impl<I> Clone for CandidateSource<I>where
I: Interner,
source§impl<I> Debug for CandidateSource<I>where
I: Interner,
impl<I> Debug for CandidateSource<I>where
I: Interner,
source§impl<I> Hash for CandidateSource<I>where
I: Interner,
impl<I> Hash for CandidateSource<I>where
I: Interner,
source§impl<I> PartialEq for CandidateSource<I>where
I: Interner,
impl<I> PartialEq for CandidateSource<I>where
I: Interner,
impl<I> Copy for CandidateSource<I>where
I: Interner,
impl<I> Eq for CandidateSource<I>where
I: Interner,
Auto Trait Implementations§
impl<I> Freeze for CandidateSource<I>
impl<I> RefUnwindSafe for CandidateSource<I>
impl<I> Send for CandidateSource<I>
impl<I> Sync for CandidateSource<I>
impl<I> Unpin for CandidateSource<I>
impl<I> UnwindSafe for CandidateSource<I>
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§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)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§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<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<'a, T> Captures<'a> for Twhere
T: ?Sized,
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.