pub(crate) fn trivial_const<'a, 'tcx: 'a, F, B>(
tcx: TyCtxt<'tcx>,
def: LocalDefId,
body_provider: F,
) -> Option<(ConstValue, Ty<'tcx>)>Expand description
If the given def is a trivial const, returns the value and type the const evaluates to.
A “trivial const” is a const which can be easily proven to evaluate successfully, and the value that it evaluates to can be easily found without going through the usual MIR phases for a const.
Currently, we support two forms of trivial const.
The base case is this:
const A: usize = 0;which has this MIR:
const A: usize = {
let mut _0: usize;
bb0: {
_0 = const 0_usize;
return;
}
}Which we recognize by looking for a Body which has a single basic block with a return
terminator and a single statement which assigns an Operand::Constant(Const::Val) to the
return place.
This scenario meets the required criteria because:
- Control flow cannot panic, we don’t have any calls or assert terminators
- The value of the const is already computed, so it cannot fail
In addition to assignment of literals, assignments of trivial consts are also considered
trivial consts. In this case, both A and B are trivial:
const A: usize = 0;
const B: usize = A;