# Enum rustc_trait_selection::traits::ImplSource

source ·

    pub enum ImplSource<'tcx, N> {
        UserDefined(ImplSourceUserDefinedData<'tcx, N>),
        Param(Vec<N>),
        Builtin(BuiltinImplSource, Vec<N>),
    }

Expand description

Given the successful resolution of an obligation, the `ImplSource` indicates where the impl comes from.

For example, the obligation may be satisfied by a specific impl (case A), or it may be relative to some bound that is in scope (case B).

ⓘ

    impl<T:Clone> Clone<T> for Option<T> { ... } // Impl_1
    impl<T:Clone> Clone<T> for Box<T> { ... }    // Impl_2
    impl Clone for i32 { ... }                   // Impl_3

    fn foo<T: Clone>(concrete: Option<Box<i32>>, param: T, mixed: Option<T>) {
        // Case A: ImplSource points at a specific impl. Only possible when
        // type is concretely known. If the impl itself has bounded
        // type parameters, ImplSource will carry resolutions for those as well:
        concrete.clone(); // ImplSource(Impl_1, [ImplSource(Impl_2, [ImplSource(Impl_3)])])

        // Case B: ImplSource must be provided by caller. This applies when
        // type is a type parameter.
        param.clone();    // ImplSource::Param

        // Case C: A mix of cases A and B.
        mixed.clone();    // ImplSource(Impl_1, [ImplSource::Param])
    }

#### The type parameter `N`

See explanation on `ImplSourceUserDefinedData`.

## Variants§

§

### UserDefined(ImplSourceUserDefinedData<'tcx, N>)

ImplSource identifying a particular impl.

§

### Param(Vec<N>)

Successful resolution to an obligation provided by the caller for some type parameter. The `Vec<N>` represents the obligations incurred from normalizing the where-clause (if any).

§

### Builtin(BuiltinImplSource, Vec<N>)

Successful resolution for a builtin impl.

## Auto Trait Implementations§

§

### impl<'tcx, N> !RefUnwindSafe for ImplSource<'tcx, N>

§

### impl<'tcx, N> Send for ImplSource<'tcx, N>
where N: Send,

§

### impl<'tcx, N> Sync for ImplSource<'tcx, N>
where N: Sync,

§

### impl<'tcx, N> Unpin for ImplSource<'tcx, N>
where N: Unpin,

§

### impl<'tcx, N> !UnwindSafe for ImplSource<'tcx, N>

## Blanket Implementations§

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> 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> From<T> for T

source§

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

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

§

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

§

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

§

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

## 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: 48 bytes

Size for each variant:

- `UserDefined`: 40 bytes
- `Param`: 24 bytes
- `Builtin`: 40 bytes