# Constant evaluation

Constant evaluation is the process of computing the result of expressions during compilation. Only a subset of all expressions can be evaluated at compile-time.

## Constant expressions

Certain forms of expressions, called constant expressions, can be evaluated at
compile time. In const contexts, these are the only allowed
expressions, and are always evaluated at compile time. In other places, such as
let statements, constant expressions *may*
be, but are not guaranteed to be, evaluated at compile time. Behaviors such as
out of bounds array indexing or overflow are compiler errors if the value
must be evaluated at compile time (i.e. in const contexts). Otherwise, these
behaviors are warnings, but will likely panic at run-time.

The following expressions are constant expressions, so long as any operands are
also constant expressions and do not cause any `Drop::drop`

calls
to be ran.

- Literals.
- Paths to functions and constants. Recursively defining constants is not allowed.
- Tuple expressions.
- Array expressions.
- Struct expressions.
- Enum variant expressions.
- Block expressions, including
`unsafe`

blocks.- let statements and thus irrefutable patterns, with the caveat that until
`if`

and`match`

are implemented, one cannot use both short circuiting operators (`&&`

and`||`

) and let statements within the same constant. - assignment expressions
- assignment operator expressions
- expression statements

- let statements and thus irrefutable patterns, with the caveat that until
- Field expressions.
- Index expressions, array indexing or slice with a
`usize`

. - Range expressions.
- Closure expressions which don't capture variables from the environment.
- Built in negation, arithmetic, logical, comparison or lazy boolean
operators used on integer and floating point types,
`bool`

and`char`

. - Shared borrows, except if applied to a type with interior mutability.
- The dereference operator.
- Grouped expressions.
- Cast expressions, except pointer to address and function pointer to address casts.
- Calls of const functions and const methods.

## Const context

A *const context* is one of the following:

- Array type length expressions
- Repeat expression length expressions
- The initializer of