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 (const: unstable) · Source§

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

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

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

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> Eq for CandidateSource<I>
where I: Interner,

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 (const: unstable) · 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.

## 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<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<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> ErasedDestructor for T
where T: 'static,

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

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