[][src]Enum chalk_ir::DomainGoal

pub enum DomainGoal<I: Interner> {
    Holds(WhereClause<I>),
    WellFormed(WellFormed<I>),
    FromEnv(FromEnv<I>),
    Normalize(Normalize<I>),
    IsLocal(Ty<I>),
    IsUpstream(Ty<I>),
    IsFullyVisible(Ty<I>),
    LocalImplAllowed(TraitRef<I>),
    Compatible(()),
    DownstreamType(Ty<I>),
    Reveal(()),
    ObjectSafe(TraitId<I>),
}

A "domain goal" is a goal that is directly about Rust, rather than a pure logical statement. As much as possible, the Chalk solver should avoid decomposing this enum, and instead treat its values opaquely.

Variants

Holds(WhereClause<I>)
WellFormed(WellFormed<I>)
FromEnv(FromEnv<I>)
Normalize(Normalize<I>)
IsLocal(Ty<I>)

True if a type is considered to have been "defined" by the current crate. This is true for a struct Foo { } but false for a #[upstream] struct Foo { }. However, for fundamental types like Box<T>, it is true if T is local.

IsUpstream(Ty<I>)

True if a type is not considered to have been "defined" by the current crate. This is false for a struct Foo { } but true for a #[upstream] struct Foo { }. However, for fundamental types like Box<T>, it is true if T is upstream.

IsFullyVisible(Ty<I>)

True if a type and its input types are fully visible, known types. That is, there are no unknown type parameters anywhere in this type.

More formally, for each struct S<P0..Pn>: forall<P0..Pn> { IsFullyVisible(S<P0...Pn>) :- IsFullyVisible(P0), ... IsFullyVisible(Pn) }

Note that any of these types can have lifetimes in their parameters too, but we only consider type parameters.

LocalImplAllowed(TraitRef<I>)

Used to dictate when trait impls are allowed in the current (local) crate based on the orphan rules.

LocalImplAllowed(T: Trait) is true if the type T is allowed to impl trait Trait in the current crate. Under the current rules, this is unconditionally true for all types if the Trait is considered to be "defined" in the current crate. If that is not the case, then LocalImplAllowed(T: Trait) can still be true if IsLocal(T) is true.

Compatible(())

Used to activate the "compatible modality" rules. Rules that introduce predicates that have to do with "all compatible universes" should depend on this clause so that they only apply if this is present.

(HACK: Having () makes some of our macros work better.)

DownstreamType(Ty<I>)

Used to indicate that a given type is in a downstream crate. Downstream crates contain the current crate at some level of their dependencies.

Since chalk does not actually see downstream types, this is usually introduced with implication on a fresh, universally quantified type.

forall { if (DownstreamType(T)) { /* ... */ } }

This makes a new type T available and makes DownstreamType(T) provable for that type.

Reveal(())

Used to activate the "reveal mode", in which opaque (impl Trait) types can be equated to their actual type.

ObjectSafe(TraitId<I>)

Used to indicate that a trait is object safe.

Implementations

impl<I: Interner> DomainGoal<I>[src]

pub fn into_from_env_goal(self, interner: &I) -> DomainGoal<I>[src]

Convert Implemented(...) into FromEnv(...), but leave other goals unchanged.

pub fn inputs(&self, interner: &I) -> Vec<GenericArg<I>>[src]

Trait Implementations

impl<I: Interner> CastTo<DomainGoal<I>> for DomainGoal<I>[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    T: CastTo<WhereClause<I>>,
    I: Interner
[src]

impl<I: Interner> CastTo<DomainGoal<I>> for Normalize<I>[src]

impl<I: Interner> CastTo<DomainGoal<I>> for WellFormed<I>[src]

impl<I: Interner> CastTo<DomainGoal<I>> for FromEnv<I>[src]

impl<I: Clone + Interner> Clone for DomainGoal<I>[src]

impl<I: Interner> CouldMatch<DomainGoal<I>> for ProgramClauseData<I>[src]

impl<I: Interner> CouldMatch<DomainGoal<I>> for ProgramClause<I>[src]

impl<I: Interner> Debug for DomainGoal<I>[src]

impl<I: Eq + Interner> Eq for DomainGoal<I>[src]

impl<I: Interner, _TI> Fold<I, _TI> for DomainGoal<I> where
    _TI: TargetInterner<I>, 
[src]

type Result = DomainGoal<_TI>

The type of value that will be produced once folding is done. Typically this is Self, unless Self contains borrowed values, in which case owned values are produced (for example, one can fold over a &T value where T: Fold, in which case you get back a T, not a &T). Read more

impl<I: Interner> HasInterner for DomainGoal<I>[src]

type Interner = I

impl<I: Hash + Interner> Hash for DomainGoal<I>[src]

impl<I: PartialEq + Interner> PartialEq<DomainGoal<I>> for DomainGoal<I>[src]

impl<I: Interner> StructuralEq for DomainGoal<I>[src]

impl<I: Interner> StructuralPartialEq for DomainGoal<I>[src]

impl<I: Interner> SuperVisit<I> for DomainGoal<I>[src]

impl<I: Interner> Visit<I> for DomainGoal<I>[src]

impl<I: Interner> Zip<I> for DomainGoal<I>[src]

Auto Trait Implementations

impl<I> RefUnwindSafe for DomainGoal<I> where
    <I as Interner>::DefId: RefUnwindSafe,
    <I as Interner>::InternedLifetime: RefUnwindSafe,
    <I as Interner>::InternedSubstitution: RefUnwindSafe,
    <I as Interner>::InternedType: RefUnwindSafe

impl<I> Send for DomainGoal<I> where
    <I as Interner>::DefId: Send,
    <I as Interner>::InternedLifetime: Send,
    <I as Interner>::InternedSubstitution: Send,
    <I as Interner>::InternedType: Send

impl<I> Sync for DomainGoal<I> where
    <I as Interner>::DefId: Sync,
    <I as Interner>::InternedLifetime: Sync,
    <I as Interner>::InternedSubstitution: Sync,
    <I as Interner>::InternedType: Sync

impl<I> Unpin for DomainGoal<I> where
    <I as Interner>::DefId: Unpin,
    <I as Interner>::InternedLifetime: Unpin,
    <I as Interner>::InternedSubstitution: Unpin,
    <I as Interner>::InternedType: Unpin

impl<I> UnwindSafe for DomainGoal<I> where
    <I as Interner>::DefId: UnwindSafe,
    <I as Interner>::InternedLifetime: UnwindSafe,
    <I as Interner>::InternedSubstitution: UnwindSafe,
    <I as Interner>::InternedType: UnwindSafe

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<T> Cast for T[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<DomainGoal<I>> for T where
    I: Interner,
    T: CastTo<WhereClause<I>>, 
[src]

impl<T, I> CastTo<Goal<I>> for T where
    I: Interner,
    T: CastTo<DomainGoal<I>>, 
[src]

impl<T, I> CastTo<ProgramClause<I>> for T where
    I: Interner,
    T: CastTo<DomainGoal<I>>, 
[src]

impl<T, I> CouldMatch<T> for T where
    I: Interner,
    T: Zip<I> + HasInterner<Interner = I> + ?Sized
[src]

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

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

impl<T, I> Shift<I> for T where
    I: Interner,
    T: Fold<I, I>, 
[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, I> VisitExt<I> for T where
    I: Interner,
    T: Visit<I>, 
[src]