Struct rustc_middle::ty::adjustment::Adjustment[][src]

pub struct Adjustment<'tcx> {
    pub kind: Adjust<'tcx>,
    pub target: Ty<'tcx>,

Represents coercing a value to a different type of value.

We transform values by following a number of Adjust steps in order. See the documentation on variants of Adjust for more details.

Here are some common scenarios:

  1. The simplest cases are where a pointer is not adjusted fat vs thin. Here the pointer will be dereferenced N times (where a dereference can happen to raw or borrowed pointers or any smart pointer which implements Deref, including Box<_>). The types of dereferences is given by autoderefs. It can then be auto-referenced zero or one times, indicated by autoref, to either a raw or borrowed pointer. In these cases unsize is false.

  2. A thin-to-fat coercion involves unsizing the underlying data. We start with a thin pointer, deref a number of times, unsize the underlying data, then autoref. The ‘unsize’ phase may change a fixed length array to a dynamically sized one, a concrete object to a trait object, or statically sized struct to a dynamically sized one. E.g., &[i32; 4] -> &i32 is represented by:

    Deref(None) -> [i32; 4],
    Borrow(AutoBorrow::Ref) -> &[i32; 4],
    Unsize -> &[i32],

    Note that for a struct, the ‘deep’ unsizing of the struct is not recorded. E.g., struct Foo<T> { x: T } we can coerce &Foo<[i32; 4]> to &Foo<i32> The autoderef and -ref are the same as in the above example, but the type stored in unsize is Foo<[i32]>, we don’t store any further detail about the underlying conversions from [i32; 4] to [i32].

  3. Coercing a Box<T> to Box<dyn Trait> is an interesting special case. In that case, we have the pointer we need coming in, so there are no autoderefs, and no autoref. Instead we just do the Unsize transformation. At some point, of course, Box should move out of the compiler, in which case this is analogous to transforming a struct. E.g., Box<[i32; 4]> -> Box<i32> is an Adjust::Unsize with the target Box<[i32]>.


kind: Adjust<'tcx>target: Ty<'tcx>


impl<'tcx> Adjustment<'tcx>[src]

pub fn is_region_borrow(&self) -> bool[src]

Trait Implementations

impl<'tcx> Clone for Adjustment<'tcx>[src]

impl<'tcx> Debug for Adjustment<'tcx>[src]

impl<'tcx, __D: TyDecoder<'tcx>> Decodable<__D> for Adjustment<'tcx>[src]

impl<'tcx, __E: TyEncoder<'tcx>> Encodable<__E> for Adjustment<'tcx>[src]

impl<'tcx, '__ctx> HashStable<StableHashingContext<'__ctx>> for Adjustment<'tcx>[src]

impl<'a, 'tcx> Lift<'tcx> for Adjustment<'a>[src]

type Lifted = Adjustment<'tcx>

impl<'tcx> TypeFoldable<'tcx> for Adjustment<'tcx>[src]

Auto Trait Implementations

impl<'tcx> !RefUnwindSafe for Adjustment<'tcx>

impl<'tcx> !Send for Adjustment<'tcx>

impl<'tcx> !Sync for Adjustment<'tcx>

impl<'tcx> Unpin for Adjustment<'tcx>

impl<'tcx> !UnwindSafe for Adjustment<'tcx>

Blanket Implementations

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

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

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

impl<'a, T> Captures<'a> for T where
    T: ?Sized

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 

impl<T> MaybeResult<T> for T[src]

type Error = !

impl<'tcx, T> Subst<'tcx> for T where
    T: TypeFoldable<'tcx>, 

impl<T> ToOwned for T where
    T: Clone

type Owned = T

The resulting type after obtaining ownership.

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

type Error = Infallible

The type returned in the event of a conversion error.

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.

impl<T> WithConstness for T[src]