[−][src]Module rustc::infer::canonical
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
Canonicalization is the key to constructing a query in the
middle of type inference. Ordinarily, it is not possible to store
types from type inference in query keys, because they contain
references to inference variables whose lifetimes are too short
and so forth. Canonicalizing a value T1 using canonicalize_query
produces two things:
- a value T2 where each unbound inference variable has been replaced with a canonical variable;
- a map M (of type
CanonicalVarValues
) from those canonical variables back to the original.
We can then do queries using T2. These will give back constriants
on the canonical variables which can be translated, using the map
M, into constraints in our source context. This process of
translating the results back is done by the
instantiate_query_result
method.
For a more detailed look at what is happening here, check out the chapter in the rustc guide.
Modules
canonicalizer |
[ Experimental ] This module contains the "canonicalizer" itself. |
query_result |
[ Experimental ] This module contains the code to instantiate a "query result", and in particular to extract out the resulting region obligations and encode them therein. |
substitute |
[ Experimental ] This module contains code to substitute new values into a
|
Structs
Canonical |
[ Experimental ] A "canonicalized" type |
CanonicalVarInfo |
[ Experimental ] Information about a canonical variable that is included with the canonical value. This is sufficient information for code to create a copy of the canonical value in some other inference context, with fresh inference variables replacing the canonical values. |
CanonicalVarValues |
[ Experimental ] A set of values corresponding to the canonical variables from some
|
QueryResult |
[ Experimental ] After we execute a query with a canonicalized key, we get back a
|
Enums
CanonicalTyVarKind |
[ Experimental ] Rust actually has more than one category of type variables; notably, the type variables we create for literals (e.g., 22 or 22.) can only be instantiated with integral/float types (e.g., usize or f32). In order to faithfully reproduce a type, we need to know what set of types a given type variable can be unified with. |
CanonicalVarKind |
[ Experimental ] Describes the "kind" of the canonical variable. This is a "kind" in the type-theory sense of the term -- i.e., a "meta" type system that analyzes type-like values. |
Certainty |
[ Experimental ] Indicates whether or not we were able to prove the query to be true. |
Type Definitions
CanonicalVarInfos |
[ Experimental ]
|
Canonicalized |
[ Experimental ]
|
CanonicalizedQueryResult |
[ Experimental ]
|
QueryRegionConstraint |
[ Experimental ]
|
SmallCanonicalVarValues |
[ Experimental ] Like CanonicalVarValues, but for use in places where a SmallVec is appropriate. |