diff --git a/accepted/future-releases/nnbd/feature-specification.md b/accepted/future-releases/nnbd/feature-specification.md index ebc7694ee9..5893cb3c83 100644 --- a/accepted/future-releases/nnbd/feature-specification.md +++ b/accepted/future-releases/nnbd/feature-specification.md @@ -6,6 +6,9 @@ Status: Draft ## CHANGELOG +2020.10.26 + - Specify that constant evaluation executes all assertions. + 2020.10.14 - Include selector `!` among the null-shorting constructs. @@ -1008,6 +1011,33 @@ void main() { } ``` +### Constant assertions + +Currently assertions are enabled only when the compiler is passed an `enable-asserts` flag. +With null safety, when an assert is evaluated as part of a constant invocation of a `const` +constructor, any `assert`s in the initializer list are evaluated. +The `enable-asserts` flag then only applies to *run-time assertions*. + +More precisely, a assert _s_ of the form assert(_e_1, _e_2) +is executed as follows: + * If the execution of _s_ happens during evaluation of a const invocation of the + surrounding `const` constructor, then _e_1 is evaluated to a constant value _c_. + It is a compile-time error if this evaluation would have thrown, or if _c_ is not the + `bool` value `true`, and otherwise _s_ completes normally. + * Otherwise (when it's not part of a constant evaluation), if run-time assertions are enabled + then then _e_1 is evaluated to a value _v_. + If _v_ is not an instance of the type `bool`, then a dynamic error occurs. + If _v_ is the value `false` then _e_2 is evaluated to a value _m_, + and an object, _o_, implementing the class `AssertionError` and containing _m_ is created. + Then execution of _s_ throws _o_ and a stack trace corresponding + to the current evaluation context. + If _v_ is the value `true` then execution of *s* completes normally. + * Otherwise (when execution is not not part of a constant evaluation + and run-time assertions are disabled), execution of _s_ completes normally without evaluating + either of _e_1 or _e_2. + +(An assert of the form assert(_e_) is equivalent to assert(_e_, null).) + ### Null promotion The machinery of type promotion is extended to promote the type of variables