[][src]Struct rustc_middle::ty::WithOptConstParam

pub struct WithOptConstParam<T> {
    pub did: T,
    pub const_param_did: Option<DefId>,
}

A DefId which is potentially bundled with its corresponding generic parameter in case did is a const argument.

This is used to prevent cycle errors during typeck as type_of(const_arg) depends on typeck(owning_body) which once again requires the type of its generic arguments.

Luckily we only need to deal with const arguments once we know their corresponding parameters. We (ab)use this by calling type_of(param_did) for these arguments.

#![feature(const_generics)]

struct A;
impl A {
    fn foo<const N: usize>(&self) -> usize { N }
}
struct B;
impl B {
    fn foo<const N: u8>(&self) -> usize { 42 }
}

fn main() {
    let a = A;
    a.foo::<7>();
}

Fields

did: Tconst_param_did: Option<DefId>

The DefId of the corresponding generic paramter in case did is a const argument.

Note that even if did is a const argument, this may still be None. All queries taking WithOptConstParam start by calling tcx.opt_const_param_of(def.did) to potentially update param_did in case it None.

Implementations

impl<T> WithOptConstParam<T>[src]

pub fn unknown(did: T) -> WithOptConstParam<T>[src]

Creates a new WithOptConstParam setting const_param_did to None.

impl WithOptConstParam<LocalDefId>[src]

pub fn try_lookup(
    did: LocalDefId,
    tcx: TyCtxt<'_>
) -> Option<(LocalDefId, DefId)>
[src]

Returns Some((did, param_did)) if def_id is a const argument, None otherwise.

pub fn try_upgrade(
    self,
    tcx: TyCtxt<'_>
) -> Option<WithOptConstParam<LocalDefId>>
[src]

In case self is unknown but self.did is a const argument, this returns a WithOptConstParam with the correct const_param_did.

pub fn to_global(self) -> WithOptConstParam<DefId>[src]

pub fn def_id_for_type_of(self) -> DefId[src]

impl WithOptConstParam<DefId>[src]

pub fn as_local(self) -> Option<WithOptConstParam<LocalDefId>>[src]

pub fn as_const_arg(self) -> Option<(LocalDefId, DefId)>[src]

pub fn expect_local(self) -> WithOptConstParam<LocalDefId>[src]

pub fn is_local(self) -> bool[src]

pub fn def_id_for_type_of(self) -> DefId[src]

Trait Implementations

impl<T: Clone> Clone for WithOptConstParam<T>[src]

impl<T: Copy> Copy for WithOptConstParam<T>[src]

impl<T: Debug> Debug for WithOptConstParam<T>[src]

impl<'tcx, T, __D: TyDecoder<'tcx>> Decodable<__D> for WithOptConstParam<T> where
    T: Decodable<__D>, 
[src]

impl<'tcx, T, __E: TyEncoder<'tcx>> Encodable<__E> for WithOptConstParam<T> where
    T: Encodable<__E>, 
[src]

impl<T: Eq> Eq for WithOptConstParam<T>[src]

impl<T: Hash> Hash for WithOptConstParam<T>[src]

impl<'__ctx, T> HashStable<StableHashingContext<'__ctx>> for WithOptConstParam<T> where
    T: HashStable<StableHashingContext<'__ctx>>, 
[src]

impl Key for WithOptConstParam<LocalDefId>[src]

type CacheSelector = DefaultCacheSelector

impl<'__lifted, T> Lift<'__lifted> for WithOptConstParam<T> where
    T: Lift<'__lifted>, 
[src]

type Lifted = WithOptConstParam<T::Lifted>

impl<T: Ord> Ord for WithOptConstParam<T>[src]

impl<T: PartialEq> PartialEq<WithOptConstParam<T>> for WithOptConstParam<T>[src]

impl<T: PartialOrd> PartialOrd<WithOptConstParam<T>> for WithOptConstParam<T>[src]

impl<T: SpecIntoSelfProfilingString> SpecIntoSelfProfilingString for WithOptConstParam<T>[src]

impl<T> StructuralEq for WithOptConstParam<T>[src]

impl<T> StructuralPartialEq for WithOptConstParam<T>[src]

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

Auto Trait Implementations

impl<T> RefUnwindSafe for WithOptConstParam<T> where
    T: RefUnwindSafe

impl<T> Send for WithOptConstParam<T> where
    T: Send

impl<T> Sync for WithOptConstParam<T> where
    T: Sync

impl<T> Unpin for WithOptConstParam<T> where
    T: Unpin

impl<T> UnwindSafe for WithOptConstParam<T> where
    T: UnwindSafe

Blanket Implementations

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

impl<'tcx, T> ArenaAllocatable<'tcx, ()> for T where
    T: Copy
[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<Ctxt, T> DepNodeParams<Ctxt> for T where
    Ctxt: DepContext,
    T: HashStable<<Ctxt as DepContext>::StableHashingContext> + Debug
[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 = !

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.

impl<T> WithConstness for T[src]