| # Constant Evaluation |
| |
| Constant evaluation is the process of computing values at compile time. For a |
| specific item (constant/static/array length) this happens after the MIR for the |
| item is borrow-checked and optimized. In many cases trying to const evaluate an |
| item will trigger the computation of its MIR for the first time. |
| |
| Prominent examples are: |
| |
| * The initializer of a `static` |
| * Array length |
| * needs to be known to reserve stack or heap space |
| * Enum variant discriminants |
| * needs to be known to prevent two variants from having the same |
| discriminant |
| * Patterns |
| * need to be known to check for overlapping patterns |
| |
| Additionally constant evaluation can be used to reduce the workload or binary |
| size at runtime by precomputing complex operations at compile time and only |
| storing the result. |
| |
| All uses of constant evaluation can either be categorized as "influencing the type system" |
| (array lengths, enum variant discriminants, const generic parameters), or as solely being |
| done to precompute expressions to be used at runtime. |
| |
| Constant evaluation can be done by calling the `const_eval_*` functions of `TyCtxt`. |
| They're the wrappers of the `const_eval` query. |
| |
| * `const_eval_global_id_for_typeck` evaluates a constant to a valtree, |
| so the result value can be further inspected by the compiler. |
| * `const_eval_global_id` evaluate a constant to an "opaque blob" containing its final value; |
| this is only useful for codegen backends and the CTFE evaluator engine itself. |
| * `eval_static_initializer` specifically computes the initial values of a static. |
| Statics are special; all other functions do not represent statics correctly |
| and have thus assertions preventing their use on statics. |
| |
| The `const_eval_*` functions use a [`ParamEnv`](./typing_parameter_envs.html) of environment |
| in which the constant is evaluated (e.g. the function within which the constant is used) |
| and a [`GlobalId`]. The `GlobalId` is made up of an `Instance` referring to a constant |
| or static or of an `Instance` of a function and an index into the function's `Promoted` table. |
| |
| Constant evaluation returns an [`EvalToValTreeResult`] for type system constants |
| or [`EvalToConstValueResult`] with either the error, or a representation of the |
| evaluated constant: a [valtree](mir/index.md#valtrees) or a [MIR constant |
| value](mir/index.md#mir-constant-values), respectively. |
| |
| [`GlobalId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/struct.GlobalId.html |
| [`EvalToConstValueResult`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/error/type.EvalToConstValueResult.html |
| [`EvalToValTreeResult`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/error/type.EvalToValTreeResult.html |