[cfe] Report "!" in constant expressions as error

Closes https://github.com/dart-lang/sdk/issues/59800

Change-Id: I06d68eb1d0608a0a865002c88f7665415159f468
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405901
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Mayank Patke <fishythefish@google.com>
diff --git a/pkg/compiler/test/model/cfe_constant_evaluation_common.dart b/pkg/compiler/test/model/cfe_constant_evaluation_common.dart
index adb1247..29df78a 100644
--- a/pkg/compiler/test/model/cfe_constant_evaluation_common.dart
+++ b/pkg/compiler/test/model/cfe_constant_evaluation_common.dart
@@ -604,9 +604,6 @@
       final b;
       const D(c) : b = c + 2, super(c + 1);
     }
-    class E {
-      const E() : assert(true_!);
-    }
   ''',
     [
       ConstantData(r'const A()', 'ConstructedConstant(A())'),
@@ -615,7 +612,6 @@
         r'const D(0)',
         'ConstructedConstant(D(a=IntConstant(1),b=IntConstant(2)))',
       ),
-      ConstantData(r'const E()', 'ConstructedConstant(E())'),
     ],
   ),
   TestData(
diff --git a/pkg/front_end/lib/src/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/kernel/constant_evaluator.dart
index fcef74df..fd26d78 100644
--- a/pkg/front_end/lib/src/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/kernel/constant_evaluator.dart
@@ -4716,16 +4716,20 @@
 
   @override
   Constant visitNullCheck(NullCheck node) {
-    final Constant constant = _evaluateSubexpression(node.operand);
-    if (constant is AbortConstant) return constant;
-    if (constant is NullConstant) {
-      return createEvaluationErrorConstant(node, messageConstEvalNonNull);
-    }
-    if (shouldBeUnevaluated) {
+    if (enableConstFunctions) {
       // Coverage-ignore-block(suite): Not run.
-      return unevaluated(node, new NullCheck(_wrap(constant)));
+      final Constant constant = _evaluateSubexpression(node.operand);
+      if (constant is AbortConstant) return constant;
+      if (constant is NullConstant) {
+        return createEvaluationErrorConstant(node, messageConstEvalNonNull);
+      }
+      if (shouldBeUnevaluated) {
+        return unevaluated(node, new NullCheck(_wrap(constant)));
+      }
+      return constant;
+    } else {
+      return _notAConstantExpression(node);
     }
-    return constant;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart
index 4e77f1b..cf24a4c 100644
--- a/pkg/front_end/lib/src/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/kernel/expression_generator.dart
@@ -205,7 +205,6 @@
     } else {
       if (_helper.constantContext != ConstantContext.none &&
           selector.name != lengthName) {
-        // Coverage-ignore-block(suite): Not run.
         _helper.addProblem(
             messageNotAConstantExpression, fileOffset, token.length);
       }
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index ca9577f..4f8f00b 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -148,10 +148,10 @@
     hitCount: 97,
     missCount: 0,
   ),
-  // 99.88331388564761%.
+  // 100.0%.
   "package:front_end/src/base/incremental_compiler.dart": (
     hitCount: 856,
-    missCount: 1,
+    missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/base/incremental_serializer.dart": (
@@ -183,10 +183,10 @@
     hitCount: 31,
     missCount: 0,
   ),
-  // 99.26470588235294%.
+  // 100.0%.
   "package:front_end/src/base/modifiers.dart": (
     hitCount: 135,
-    missCount: 1,
+    missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/base/name_space.dart": (
@@ -208,10 +208,10 @@
     hitCount: 260,
     missCount: 0,
   ),
-  // 99.38837920489296%.
+  // 100.0%.
   "package:front_end/src/base/scope.dart": (
     hitCount: 650,
-    missCount: 4,
+    missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/base/ticker.dart": (
@@ -615,7 +615,7 @@
   ),
   // 100.0%.
   "package:front_end/src/kernel/constant_evaluator.dart": (
-    hitCount: 3735,
+    hitCount: 3731,
     missCount: 0,
   ),
   // 100.0%.
@@ -640,7 +640,7 @@
   ),
   // 100.0%.
   "package:front_end/src/kernel/expression_generator.dart": (
-    hitCount: 2522,
+    hitCount: 2527,
     missCount: 0,
   ),
   // 100.0%.
@@ -944,10 +944,10 @@
     hitCount: 1003,
     missCount: 0,
   ),
-  // 97.91666666666666%.
+  // 100.0%.
   "package:front_end/src/source/source_function_builder.dart": (
     hitCount: 47,
-    missCount: 1,
+    missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_library_builder.dart": (
@@ -1109,10 +1109,10 @@
     hitCount: 20,
     missCount: 0,
   ),
-  // 92.0%.
+  // 100.0%.
   "package:front_end/src/util/local_stack.dart": (
     hitCount: 23,
-    missCount: 2,
+    missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/util/parser_ast.dart": (
diff --git a/pkg/front_end/testcases/general/issue59800.dart b/pkg/front_end/testcases/general/issue59800.dart
new file mode 100644
index 0000000..3902784
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  final int? foo;
+  const A(this.foo);
+}
+
+const int? CNull = null;
+const int? CInt = 0;
+const A CANull = const A(null);
+const A CAInt = const A(0);
+
+const int C1 = 0!; // Error.
+const int C2 = null!; // Error.
+const int C3 = CInt!; // Error.
+const int C4 = CNull!; // Error.
+const int C5 = CAInt.foo!; // Error.
+const int C6 = CANull.foo!; // Error.
+const int C7 = "".length!; // Error.
+const int C8 = ""!.length; // Error.
+const int C9 = ""!.length!; // Error.
+
+test() {
+  return [C1, C2, C3, C4, C5, C6, C7, C8, C9];
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.expect
new file mode 100644
index 0000000..e176a19
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+//                ^^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:15:17: Error: Not a constant expression.
+// const int C1 = 0!; // Error.
+//                 ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:16:20: Error: Not a constant expression.
+// const int C2 = null!; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:17:20: Error: Not a constant expression.
+// const int C3 = CInt!; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:18:21: Error: Not a constant expression.
+// const int C4 = CNull!; // Error.
+//                     ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:25: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:26: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:21:25: Error: Not a constant expression.
+// const int C7 = "".length!; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:22:18: Error: Not a constant expression.
+// const int C8 = ""!.length; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:23:26: Error: Not a constant expression.
+// const int C9 = ""!.length!; // Error.
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int? foo;
+  const constructor •(core::int? foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::int? CNull = #C1;
+static const field core::int? CInt = #C2;
+static const field self::A CANull = #C3;
+static const field self::A CAInt = #C4;
+static const field core::int C1 = invalid-expression "Not a constant expression.";
+static const field core::int C2 = invalid-expression "Not a constant expression.";
+static const field core::int C3 = invalid-expression "Not a constant expression.";
+static const field core::int C4 = invalid-expression "Not a constant expression.";
+static const field core::int C5 = invalid-expression "Not a constant expression.";
+static const field core::int C6 = invalid-expression "Not a constant expression.";
+static const field core::int C7 = invalid-expression "Not a constant expression.";
+static const field core::int C8 = invalid-expression "Not a constant expression.";
+static const field core::int C9 = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
+  return <core::int>[invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression."];
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = self::A {foo:#C1}
+  #C4 = self::A {foo:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue59800.dart:
+- A. (from org-dartlang-testcase:///issue59800.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.modular.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.modular.expect
new file mode 100644
index 0000000..e176a19
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.modular.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+//                ^^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:15:17: Error: Not a constant expression.
+// const int C1 = 0!; // Error.
+//                 ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:16:20: Error: Not a constant expression.
+// const int C2 = null!; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:17:20: Error: Not a constant expression.
+// const int C3 = CInt!; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:18:21: Error: Not a constant expression.
+// const int C4 = CNull!; // Error.
+//                     ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:25: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:26: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:21:25: Error: Not a constant expression.
+// const int C7 = "".length!; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:22:18: Error: Not a constant expression.
+// const int C8 = ""!.length; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:23:26: Error: Not a constant expression.
+// const int C9 = ""!.length!; // Error.
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int? foo;
+  const constructor •(core::int? foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::int? CNull = #C1;
+static const field core::int? CInt = #C2;
+static const field self::A CANull = #C3;
+static const field self::A CAInt = #C4;
+static const field core::int C1 = invalid-expression "Not a constant expression.";
+static const field core::int C2 = invalid-expression "Not a constant expression.";
+static const field core::int C3 = invalid-expression "Not a constant expression.";
+static const field core::int C4 = invalid-expression "Not a constant expression.";
+static const field core::int C5 = invalid-expression "Not a constant expression.";
+static const field core::int C6 = invalid-expression "Not a constant expression.";
+static const field core::int C7 = invalid-expression "Not a constant expression.";
+static const field core::int C8 = invalid-expression "Not a constant expression.";
+static const field core::int C9 = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
+  return <core::int>[invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression."];
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = self::A {foo:#C1}
+  #C4 = self::A {foo:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue59800.dart:
+- A. (from org-dartlang-testcase:///issue59800.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.outline.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.outline.expect
new file mode 100644
index 0000000..573ea14
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.outline.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+//                ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int? foo;
+  const constructor •(core::int? foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::int? CNull = null;
+static const field core::int? CInt = 0;
+static const field self::A CANull = const self::A::•(null);
+static const field self::A CAInt = const self::A::•(0);
+static const field core::int C1 = 0!;
+static const field core::int C2 = null!;
+static const field core::int C3 = self::CInt!;
+static const field core::int C4 = self::CNull!;
+static const field core::int C5 = self::CAInt.{self::A::foo}{core::int?}!;
+static const field core::int C6 = self::CANull.{self::A::foo}{core::int?}!;
+static const field core::int C7 = "".{core::String::length}{core::int}!;
+static const field core::int C8 = ""!.{core::String::length}{core::int};
+static const field core::int C9 = ""!.{core::String::length}{core::int}!;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue59800.dart:12:24 -> InstanceConstant(const A{A.foo: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue59800.dart:13:23 -> InstanceConstant(const A{A.foo: 0})
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:17:16 -> IntConstant(0)
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:18:16 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:19:16 -> InstanceConstant(const A{A.foo: 0})
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:20:16 -> InstanceConstant(const A{A.foo: null})
+Evaluated: InstanceGet @ org-dartlang-testcase:///issue59800.dart:21:19 -> IntConstant(0)
+Extra constant evaluation: evaluated: 22, effectively constant: 7
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.transformed.expect
new file mode 100644
index 0000000..e176a19
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.transformed.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+//                ^^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:15:17: Error: Not a constant expression.
+// const int C1 = 0!; // Error.
+//                 ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:16:20: Error: Not a constant expression.
+// const int C2 = null!; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:17:20: Error: Not a constant expression.
+// const int C3 = CInt!; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:18:21: Error: Not a constant expression.
+// const int C4 = CNull!; // Error.
+//                     ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:25: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:26: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:21:25: Error: Not a constant expression.
+// const int C7 = "".length!; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:22:18: Error: Not a constant expression.
+// const int C8 = ""!.length; // Error.
+//                  ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:23:26: Error: Not a constant expression.
+// const int C9 = ""!.length!; // Error.
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int? foo;
+  const constructor •(core::int? foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::int? CNull = #C1;
+static const field core::int? CInt = #C2;
+static const field self::A CANull = #C3;
+static const field self::A CAInt = #C4;
+static const field core::int C1 = invalid-expression "Not a constant expression.";
+static const field core::int C2 = invalid-expression "Not a constant expression.";
+static const field core::int C3 = invalid-expression "Not a constant expression.";
+static const field core::int C4 = invalid-expression "Not a constant expression.";
+static const field core::int C5 = invalid-expression "Not a constant expression.";
+static const field core::int C6 = invalid-expression "Not a constant expression.";
+static const field core::int C7 = invalid-expression "Not a constant expression.";
+static const field core::int C8 = invalid-expression "Not a constant expression.";
+static const field core::int C9 = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
+  return <core::int>[invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression."];
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = self::A {foo:#C1}
+  #C4 = self::A {foo:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue59800.dart:
+- A. (from org-dartlang-testcase:///issue59800.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/issue59800.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue59800.dart.textual_outline.expect
new file mode 100644
index 0000000..58a6d6a
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.textual_outline.expect
@@ -0,0 +1,34 @@
+class A {
+  final int? foo;
+  const A(this.foo);
+}
+
+const int? CNull = null;
+
+const int? CInt = 0;
+
+const A CANull = const A(null);
+
+const A CAInt = const A(0);
+
+const int C1 = 0!;
+
+const int C2 = null!;
+
+const int C3 = CInt!;
+
+const int C4 = CNull!;
+
+const int C5 = CAInt.foo!;
+
+const int C6 = CANull.foo!;
+
+const int C7 = "".length!;
+
+const int C8 = ""!.length;
+
+const int C9 = ""!.length!;
+
+test() {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue59800.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue59800.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..96f735d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.textual_outline_modelled.expect
@@ -0,0 +1,34 @@
+class A {
+  const A(this.foo);
+  final int? foo;
+}
+
+const A CAInt = const A(0);
+
+const A CANull = const A(null);
+
+const int? CInt = 0;
+
+const int? CNull = null;
+
+const int C1 = 0!;
+
+const int C2 = null!;
+
+const int C3 = CInt!;
+
+const int C4 = CNull!;
+
+const int C5 = CAInt.foo!;
+
+const int C6 = CANull.foo!;
+
+const int C7 = "".length!;
+
+const int C8 = ""!.length;
+
+const int C9 = ""!.length!;
+
+main() {}
+
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart b/pkg/front_end/testcases/nnbd/constant_null_check.dart
index 3ebe34f..f8c1621 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart
@@ -16,12 +16,14 @@
 const Class e = const Class(a);
 const Class f = const Class(c);
 
-main() {
+test() {
   expect(42, a);
   expect(42, b);
   expect(42, e.y);
 }
 
+main() {}
+
 expect(expected, actual) {
   if (expected != actual) throw 'Expected $expected, actual $actual';
 }
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect
index 7966bdf..cff9e1d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect
@@ -2,25 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Constant evaluation error:
-// const int? d = c!;
-//                 ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Context: Constant expression must be non-null.
-// const int? d = c!;
-//                 ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:12: Context: While analyzing:
-// const int? d = c!;
-//            ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:6:16: Error: Not a constant expression.
+// const int b = a!;
+//                ^
 //
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:23: Error: Constant evaluation error:
-// const Class f = const Class(c);
-//                       ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Context: Constant expression must be non-null.
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Error: Not a constant expression.
 //   const Class(int? x) : y = x!;
 //                              ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:13: Context: While analyzing:
-// const Class f = const Class(c);
-//             ^
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Not a constant expression.
+// const int? d = c!;
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -32,16 +24,17 @@
     ;
 }
 static const field core::int? a = #C1;
-static const field core::int b = #C1;
+static const field core::int b = invalid-expression "Not a constant expression.";
 static const field core::int? c = #C2;
-static const field core::int? d = invalid-expression "Constant expression must be non-null.";
-static const field self::Class e = #C3;
-static const field self::Class f = invalid-expression "Constant expression must be non-null.";
-static method main() → dynamic {
+static const field core::int? d = invalid-expression "Not a constant expression.";
+static const field self::Class e = invalid-expression "Not a constant expression.";
+static const field self::Class f = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
   self::expect(42, #C1);
-  self::expect(42, #C1);
-  self::expect(42, #C3.{self::Class::y}{core::int});
+  self::expect(42, invalid-expression "Not a constant expression.");
+  self::expect(42, invalid-expression "Not a constant expression.".{self::Class::y}{core::int});
 }
+static method main() → dynamic {}
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
@@ -50,11 +43,9 @@
 constants  {
   #C1 = 42
   #C2 = null
-  #C3 = self::Class {y:#C1}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///constant_null_check.dart:
 - Class. (from org-dartlang-testcase:///constant_null_check.dart:13:9)
-- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect
index 7966bdf..cff9e1d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect
@@ -2,25 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Constant evaluation error:
-// const int? d = c!;
-//                 ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Context: Constant expression must be non-null.
-// const int? d = c!;
-//                 ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:12: Context: While analyzing:
-// const int? d = c!;
-//            ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:6:16: Error: Not a constant expression.
+// const int b = a!;
+//                ^
 //
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:23: Error: Constant evaluation error:
-// const Class f = const Class(c);
-//                       ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Context: Constant expression must be non-null.
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Error: Not a constant expression.
 //   const Class(int? x) : y = x!;
 //                              ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:13: Context: While analyzing:
-// const Class f = const Class(c);
-//             ^
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Not a constant expression.
+// const int? d = c!;
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -32,16 +24,17 @@
     ;
 }
 static const field core::int? a = #C1;
-static const field core::int b = #C1;
+static const field core::int b = invalid-expression "Not a constant expression.";
 static const field core::int? c = #C2;
-static const field core::int? d = invalid-expression "Constant expression must be non-null.";
-static const field self::Class e = #C3;
-static const field self::Class f = invalid-expression "Constant expression must be non-null.";
-static method main() → dynamic {
+static const field core::int? d = invalid-expression "Not a constant expression.";
+static const field self::Class e = invalid-expression "Not a constant expression.";
+static const field self::Class f = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
   self::expect(42, #C1);
-  self::expect(42, #C1);
-  self::expect(42, #C3.{self::Class::y}{core::int});
+  self::expect(42, invalid-expression "Not a constant expression.");
+  self::expect(42, invalid-expression "Not a constant expression.".{self::Class::y}{core::int});
 }
+static method main() → dynamic {}
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
@@ -50,11 +43,9 @@
 constants  {
   #C1 = 42
   #C2 = null
-  #C3 = self::Class {y:#C1}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///constant_null_check.dart:
 - Class. (from org-dartlang-testcase:///constant_null_check.dart:13:9)
-- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect
index 52b5f54..baa0ec5 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect
@@ -14,6 +14,8 @@
 static const field core::int? d = self::c!;
 static const field self::Class e = const self::Class::•(self::a);
 static const field self::Class f = const self::Class::•(self::c);
+static method test() → dynamic
+  ;
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
@@ -21,8 +23,8 @@
 
 
 Extra constant evaluation status:
-Evaluated: NullCheck @ org-dartlang-testcase:///constant_null_check.dart:6:16 -> IntConstant(42)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:6:15 -> IntConstant(42)
 Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:9:16 -> NullConstant(null)
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_check.dart:16:23 -> InstanceConstant(const Class{Class.y: 42})
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:16:29 -> IntConstant(42)
 Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:17:29 -> NullConstant(null)
-Extra constant evaluation: evaluated: 8, effectively constant: 4
+Extra constant evaluation: evaluated: 10, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect
index 7966bdf..cff9e1d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect
@@ -2,25 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Constant evaluation error:
-// const int? d = c!;
-//                 ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Context: Constant expression must be non-null.
-// const int? d = c!;
-//                 ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:12: Context: While analyzing:
-// const int? d = c!;
-//            ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:6:16: Error: Not a constant expression.
+// const int b = a!;
+//                ^
 //
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:23: Error: Constant evaluation error:
-// const Class f = const Class(c);
-//                       ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Context: Constant expression must be non-null.
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Error: Not a constant expression.
 //   const Class(int? x) : y = x!;
 //                              ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:13: Context: While analyzing:
-// const Class f = const Class(c);
-//             ^
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Not a constant expression.
+// const int? d = c!;
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -32,16 +24,17 @@
     ;
 }
 static const field core::int? a = #C1;
-static const field core::int b = #C1;
+static const field core::int b = invalid-expression "Not a constant expression.";
 static const field core::int? c = #C2;
-static const field core::int? d = invalid-expression "Constant expression must be non-null.";
-static const field self::Class e = #C3;
-static const field self::Class f = invalid-expression "Constant expression must be non-null.";
-static method main() → dynamic {
+static const field core::int? d = invalid-expression "Not a constant expression.";
+static const field self::Class e = invalid-expression "Not a constant expression.";
+static const field self::Class f = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
   self::expect(42, #C1);
-  self::expect(42, #C1);
-  self::expect(42, #C3.{self::Class::y}{core::int});
+  self::expect(42, invalid-expression "Not a constant expression.");
+  self::expect(42, invalid-expression "Not a constant expression.".{self::Class::y}{core::int});
 }
+static method main() → dynamic {}
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
@@ -50,11 +43,9 @@
 constants  {
   #C1 = 42
   #C2 = null
-  #C3 = self::Class {y:#C1}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///constant_null_check.dart:
 - Class. (from org-dartlang-testcase:///constant_null_check.dart:13:9)
-- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect
index 595b26b..ae74f24 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect
@@ -15,6 +15,8 @@
 
 const Class f = const Class(c);
 
+test() {}
+
 main() {}
 
 expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect
index 0c3d45a..3435f9d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect
@@ -18,3 +18,5 @@
 expect(expected, actual) {}
 
 main() {}
+
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
index 4662909..933b4ab 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
@@ -81,11 +81,6 @@
   #C19 = 1
 }
 
-Extra constant evaluation status:
-Evaluated: NullCheck @ org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:18:25 -> IntConstant(0)
-Evaluated: NullCheck @ org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:19:8 -> IntConstant(1)
-Extra constant evaluation: evaluated: 93, effectively constant: 2
-
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart: