Expand description
Defines the IR for types and logical predicates.
Re-exports§
pub use crate::debug::SeparatorTraitRef;
Modules§
- cast
- Upcasts, to avoid writing out wrapper types.
- could_
match - Fast matching check for zippable values.
- debug
- Debug impls for types.
- fold
- Traits for transforming bits of IR.
- interner
- Encapsulates the concrete representation of core types such as types and goals.
- visit
- Traits for visiting bits of IR.
- zip
- Traits for “zipping” types, walking through two structures and checking that they match.
Macros§
- try_
break - Unwraps a
ControlFlowor propagates itsBreakvalue. This replaces theTryimplementation that would be used withstd::ops::ControlFlow.
Structs§
- AdtId
- The id for an Abstract Data Type (i.e. structs, unions and enums).
- AliasEq
- Proves equality between an alias and a type.
- Answer
Subst - The resulting substitution after solving a goal.
- Assoc
Type Id - The id for the associated type member of a trait. The details of the type
can be found by invoking the
associated_ty_datamethod. - Binders
- Indicates that the
valueis universally quantified overNparameters of the given kinds, whereN == self.binders.len(). A variable with depthi < Nrefers to the value atself.binders[i]. Variables with depth>= Nare free. - Binders
Into Iterator IntoIteratorfor binders.- Bound
Var - Identifies a particular bound variable within a binder.
Variables are identified by the combination of a
DebruijnIndex, which identifies the binder, and an index within that binder. - Canonical
- Wraps a “canonicalized item”. Items are canonicalized as follows:
- Canonical
VarKinds - List of interned elements.
- Clause
Id - Id for a specific clause.
- Closure
Id - Id for Rust closures.
- Concrete
Const - Concrete constant, whose value is known (as opposed to inferred constants and placeholders).
- Const
- Constants.
- Const
Data - Constant data, containing the constant’s type and value.
- Constrained
Subst - Combines a substitution (
subst) with a set of region constraints (constraints). This represents the result of a query; the substitution stores the values for the query’s unknown variables, and the constraints represents any region constraints that must additionally be solved. - Constraints
- List of interned elements.
- Coroutine
Id - Id for Rust coroutines.
- Debruijn
Index - References the binder at the given depth. The index is a de
Bruijn index, so it counts back through the in-scope binders,
with 0 being the innermost binder. This is used in impls and
the like. For example, if we had a rule like
for<T> { (T: Clone) :- (T: Copy) }, thenTwould be represented as aBoundVar(0)(as theforis the innermost binder). - DynTy
- A “DynTy” represents a trait object (
dyn Trait). Trait objects are conceptually very related to an “existential type” of the formexists<T> { T: Trait }(another example of such type isimpl Trait).DynTyrepresents the bounds on that type. - Environment
- The set of assumptions we’ve made so far, and the current number of universal (forall) quantifiers we’re within.
- EqGoal
- Equality goal: tries to prove that two values are equal.
- Floundered
- Indicates that the complete set of program clauses for this goal cannot be enumerated.
- FnDefId
- Function definition id.
- FnPointer
- for<’a…’z> X – all binders are instantiated at once,
and we use deBruijn indices within
self.ty - FnSig
- A function signature.
- FnSubst
- A wrapper for the substs on a Fn.
- Foreign
DefId - Id for foreign types.
- Generic
Arg - A generic argument, see
GenericArgDatafor more information. - Goal
- A general goal; this is the full range of questions you can pose to Chalk.
- Goals
- List of interned elements.
- ImplId
- The id for an impl.
- InEnvironment
- A goal with an environment to solve it in.
- Inference
Var - A type, lifetime or constant whose value is being inferred.
- Lifetime
- A Rust lifetime.
- Lifetime
Outlives - Lifetime outlives, which for
'a: 'bchecks that the lifetime'ais a superset of the value of'b. - NoSolution
- Indicates that the attempted operation has “no solution” – i.e., cannot be performed.
- Normalize
- Proves that the given type alias normalizes to the given
type. A projection
T::Foonormalizes to the typeUif we can match it to an impl and that impl has atype Foo = VwhereU = V. - Opaque
Ty - An opaque type
opaque type T<..>: Trait = HiddenTy. - Opaque
TyId - Id for an opaque type.
- Placeholder
Index - Index of an universally quantified parameter in the environment. Two indexes are required, the one of the universe itself and the relative index inside the universe.
- Program
Clause - A program clause is a logic expression used to describe a part of the program.
- Program
Clause Data - Contains the data for a program clause.
- Program
Clause Implication - Represents one clause of the form
consequence :- conditionswhereconditions = cond_1 && cond_2 && ...is the conjunction of the individual conditions. - Program
Clauses - List of interned elements.
- Projection
Ty - A projection
<P0 as TraitName<P1..Pn>>::AssocItem<Pn+1..Pm>. - Quantified
Where Clauses - List of interned elements.
- Substitution
- List of interned elements.
- Subtype
Goal - Subtype goal: tries to prove that
ais a subtype ofb - TraitId
- The id of a trait definition; could be used to load the trait datum by
invoking the
trait_datummethod. - Trait
Ref - A trait reference describes the relationship between a type and a trait. This can be used in two forms:
- Ty
- A Rust type. The actual type data is stored in
TyKind. - TyData
- Contains the data for a Ty
- Type
Flags - Contains flags indicating various properties of a Ty
- Type
Outlives - Type outlives, which for
T: 'achecks that the typeTlives at least as long as the lifetime'a - UCanonical
- A “universe canonical” value. This is a wrapper around a
Canonical, indicating that the universes within have been “renumbered” to start from 0 and collapse unimportant distinctions. - Universe
Index - An universe index is how a universally quantified parameter is
represented when it’s binder is moved into the environment.
An example chain of transformations would be:
forall<T> { Goal(T) }(syntactical representation)forall { Goal(?0) }(used a DeBruijn index)Goal(!U1)(the quantifier was moved to the environment and replaced with a universe index) See https://rustc-dev-guide.rust-lang.org/borrow_check/region_inference.html#placeholders-and-universes for more. - Universe
Map - Maps the universes found in the
u_canonicalizeresult (the “canonical” universes) to the universes found in the original value (and vice versa). When used as a folder – i.e., from outside this module – converts from “canonical” universes to the original (but see theUMapToCanonicalfolder). - Variable
Kinds - List of interned elements.
- Variances
- List of interned elements.
- With
Kind - A value with an associated variable kind.
Enums§
- AliasTy
- An alias, which is a trait indirection such as a projection or opaque type.
- Clause
Priority - Specifies how important an implication is.
- Const
Value - A constant value, not necessarily concrete.
- Constraint
- A constraint on lifetimes.
- Domain
Goal - 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.
- Fallible
OrFloundered - A combination of
FallibleandFloundered. - FloatTy
- Different kinds of float types.
- FromEnv
- Checks whether a type or trait ref can be derived from the contents of the environment.
- Generic
ArgData - Generic arguments data.
- Goal
Data - A general goal; this is the full range of questions you can pose to Chalk.
- IntTy
- Different signed int types.
- Lifetime
Data - Lifetime data, including what kind of lifetime it is and what it points to.
- Mutability
- Whether a type is mutable or not.
- Quantifier
Kind - Kinds of quantifiers in the logic, such as
forallandexists. - Safety
- Whether a function is safe or not.
- Scalar
- Types of scalar values.
- TyKind
- Type data, which holds the actual type information.
- TyVariable
Kind - Represents some extra knowledge we may have about the type variable.
- UintTy
- Different unsigned int types.
- Variable
Kind - The “kind” of variable. Type, lifetime or constant.
- Variance
- Variance
- Void
- Uninhabited (empty) type, used in combination with
PhantomData. - Well
Formed - Checks whether a type or trait ref is well-formed.
- Where
Clause - Where clauses that can be written by a Rust programmer.
Traits§
- AsParameters
- Convert a value to a list of parameters.
- Substitute
- An extension trait to anything that can be represented as list of
GenericArgs that signifies that it can applied as a substituion to a value - ToGeneric
Arg - Utility for converting a list of all the binders into scope
into references to those binders. Simply pair the binders with
the indices, and invoke
to_generic_arg()on the(binder, index)pair. The result will be a reference to a bound variable of appropriate kind at the corresponding index. - Unification
Database - Logic to decide the Variance for a given subst
Type Aliases§
- Canonical
VarKind - A variable kind with universe index.
- Fallible
- Many of our internal operations (e.g., unification) are an attempt to perform some operation which may not complete.
- Quantified
Where Clause - A where clause that can contain
forall<>orexists<>quantifiers.