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

pub struct Adjustment<'tcx> {
    pub kind: Adjust<'tcx>,
    pub target: Ty<'tcx>,
}
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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

Fields

kind: Adjust<'tcx>
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

target: Ty<'tcx>
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Methods

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

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

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Trait Implementations

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

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

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

impl<'tcx> Encodable 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>

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

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

impl<T> Decodable for T where
    T: UseSpecializedDecodable
[src]

impl<T> Encodable for T where
    T: UseSpecializedEncodable + ?Sized
[src]

impl<T> Erased for T[src]

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

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

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

type Error = !

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

impl<E> SpecializationError for E[src]

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

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.