CandidateSource in rustc_middle::ty::solve - Rust
Description: Possible ways the given goal can be proven.

Skip to main content

## CandidateSource

# Enum CandidateSource

Source

    pub enum CandidateSource<I>where
        I: Interner,{
        Impl(<I as Interner>::ImplId),
        BuiltinImpl(BuiltinImplSource),
        ParamEnv(ParamEnvSource),
        AliasBound(AliasBoundKind),
        CoherenceUnknowable,
    }

Expand description

Possible ways the given goal can be proven.

## Variants§

§

### Impl(<I as Interner>::ImplId)

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(ParamEnvSource)

An assumption from the environment. Stores a `ParamEnvSource`, since we prefer non-global param-env candidates in candidate assembly.

##### §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(AliasBoundKind)

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,

Source§

#### fn clone(&self) -> CandidateSource<I>

Returns a duplicate of the value. Read more
1.0.0 · Source§

#### fn clone_from(&mut self, source: &Self)

Performs copy-assignment from `source`. Read more
Source§

### impl<I> Debug for CandidateSource<I>
where I: Interner,

Source§

#### fn fmt(&self, __f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

### impl<I> Hash for CandidateSource<I>
where I: Interner,

Source§

#### fn hash<__H>(&self, __state: &mut __H)
where __H: Hasher,

Feeds this value into the given `Hasher`. Read more
1.3.0 · Source§

#### fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given `Hasher`. Read more
Source§

### impl<I> PartialEq for CandidateSource<I>
where I: Interner,

Source§

#### fn eq(&self, __other: &CandidateSource<I>) -> bool

Tests for `self` and `other` values to be equal, and is used by `==`.
1.0.0 · Source§

#### fn ne(&self, other: &Rhs) -> bool

Tests for `!=`. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

### impl<I> Copy for CandidateSource<I>
where I: Interner,

Source§

### impl<I> Eq for CandidateSource<I>
where I: Interner,

## Auto Trait Implementations§

§

### impl<I> DynSend for CandidateSource<I>
where <I as Interner>::ImplId: DynSend,

§

### impl<I> DynSync for CandidateSource<I>
where <I as Interner>::ImplId: DynSync,

§

### impl<I> Freeze for CandidateSource<I>
where <I as Interner>::ImplId: Freeze,

§

### impl<I> RefUnwindSafe for CandidateSource<I>
where <I as Interner>::ImplId: RefUnwindSafe,

§

### impl<I> Send for CandidateSource<I>
where <I as Interner>::ImplId: Send,

§

### impl<I> Sync for CandidateSource<I>
where <I as Interner>::ImplId: Sync,

§

### impl<I> Unpin for CandidateSource<I>
where <I as Interner>::ImplId: Unpin,

§

### impl<I> UnsafeUnpin for CandidateSource<I>
where <I as Interner>::ImplId: UnsafeUnpin,

§

### impl<I> UnwindSafe for CandidateSource<I>
where <I as Interner>::ImplId: UnwindSafe,

## Blanket Implementations§

Source§

### impl<T> Aligned for T

Source§

#### const ALIGN: Alignment

Alignment of `Self`.
Source§

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

Source§

#### fn type_id(&self) -> TypeId

Gets the `TypeId` of `self`. Read more
Source§

### impl<T> AnyEq for T
where T: Any + PartialEq,

Source§

#### fn equals(&self, other: &(dyn Any + 'static)) -> bool

Source§

#### fn as_any(&self) -> &(dyn Any + 'static)

Source§

### impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for T
where T: Copy,

Source§

#### fn allocate_on(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut T

Source§

#### fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'tcx mut [T]

Source§

### impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for T
where T: Copy,

Source§

#### fn allocate_on(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut T

Source§

#### fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'tcx mut [T]

Source§

### impl<T> Borrow<T> for T
where T: ?Sized,

Source§

#### fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

### impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

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

Mutably borrows from an owned value. Read more
Source§

### impl<T> CloneToUninit for T
where T: Clone,

Source§

#### unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (`clone_to_uninit`)
Performs copy-assignment from `self` to `dest`. Read more
Source§

### impl<T, R> CollectAndApply<T, R> for T

Source§

#### fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to `f(&iter.collect::<Vec<_>>())`.

Source§

#### type Output = R

Source§

### impl<T> DynClone for T
where T: Clone,

Source§

#### fn __clone_box(&self, _: Private) -> *mut ()

Source§

### impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

#### fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

### impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

#### fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

### impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

#### fn equivalent(&self, key: &K) -> bool

Compare self to `key` and return `true` if they are equal.
Source§

### impl<T> From<T> for T

Source§

#### fn from(t: T) -> T

Returns the argument unchanged.

Source§

### impl<T> Instrument for T

Source§

#### fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided `Span`, returning an `Instrumented` wrapper. Read more
Source§

#### fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current `Span`, returning an `Instrumented` wrapper. Read more
Source§

### impl<T, U> Into<U> for T
where 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> IntoEither for T

Source§

#### fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts `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 more
Source§

#### fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts `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 more
Source§

### impl<K> IntoQueryKey<K> for K

Source§

#### fn into_query_key(self) -> K

Argument conversion from `Self` to `K`. This should always be a very cheap conversion, e.g. `LocalDefId::to_def_id`.
Source§

### impl<T> MaybeResult<T> for T

Source§

#### type Error = !

Source§

#### fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

Source§

#### fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

Source§

### impl<T> Pointable for T

Source§

#### const ALIGN: usize

The alignment of pointer.
Source§

#### type Init = T

The type for initializers.
Source§

#### unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

#### unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

#### unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

#### unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

### impl<T> Same for T

Source§

#### type Output = T

Should always be `Self`
Source§

### impl<T> ToOwned for T
where T: Clone,

Source§

#### type Owned = T

The resulting type after obtaining ownership.
Source§

#### fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

#### fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

### impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

#### 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 T
where U: TryFrom<T>,

Source§

#### 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.
Source§

### impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

Source§

#### fn upcast(self, interner: I) -> U

Source§

### impl<I, T> UpcastFrom<I, T> for T

Source§

#### fn upcast_from(from: T, _tcx: I) -> T

Source§

### impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

#### fn vzip(self) -> V

Source§

### impl<T> WithSubscriber for T

Source§

#### fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided `Subscriber` to this type, returning a `WithDispatch` wrapper. Read more
Source§

#### fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default `Subscriber` to this type, returning a `WithDispatch` wrapper. Read more
Source§

### impl<T> ErasedDestructor for T
where T: 'static,

## 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.