Version 2.11.0-181.0.dev

Merge commit '6a1c54ec302854a8b13d03ca5b9a6463b4a82df2' into 'dev'
diff --git a/DEPS b/DEPS
index 87d2db4..fbc3992 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "58e95961ea492a749ca6eccf5586fdf8271f8266",
+  "co19_rev": "53dd55a31d345320a6aa2b6eea0467f868b72377",
   "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index e404a1a..7959ff9 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -1525,12 +1525,11 @@
     return _identicalOrNew(this, other, newReachable, newVariableInfo);
   }
 
-  /// Updates the state to indicate whether the control flow path is
-  /// [reachable].
-  FlowModel<Variable, Type> setReachable(bool reachable) {
-    if (this.reachable == reachable) return this;
+  /// Updates the state to indicate that the control flow path is unreachable.
+  FlowModel<Variable, Type> setUnreachable() {
+    if (!reachable) return this;
 
-    return new FlowModel<Variable, Type>.withInfo(reachable, variableInfo);
+    return new FlowModel<Variable, Type>.withInfo(false, variableInfo);
   }
 
   @override
@@ -2547,7 +2546,7 @@
 
   @override
   void booleanLiteral(Expression expression, bool value) {
-    FlowModel<Variable, Type> unreachable = _current.setReachable(false);
+    FlowModel<Variable, Type> unreachable = _current.setUnreachable();
     _storeExpressionInfo(
         expression,
         value
@@ -2676,7 +2675,7 @@
   @override
   void for_bodyBegin(Statement node, Expression condition) {
     ExpressionInfo<Variable, Type> conditionInfo = condition == null
-        ? new ExpressionInfo(_current, _current, _current.setReachable(false))
+        ? new ExpressionInfo(_current, _current, _current.setUnreachable())
         : _expressionEnd(condition);
     _WhileContext<Variable, Type> context =
         new _WhileContext<Variable, Type>(conditionInfo);
@@ -2755,11 +2754,9 @@
   void functionExpression_end() {
     --_functionNestingLevel;
     assert(_functionNestingLevel >= 0);
-    FlowModel<Variable, Type> afterBody = _current;
     _SimpleContext<Variable, Type> context =
         _stack.removeLast() as _SimpleContext<Variable, Type>;
     _current = context._previous;
-    _current = _current.joinUnassigned(afterBody);
   }
 
   @override
@@ -2768,7 +2765,7 @@
     if (context != null) {
       context._breakModel = _join(context._breakModel, _current);
     }
-    _current = _current.setReachable(false);
+    _current = _current.setUnreachable();
   }
 
   @override
@@ -2777,12 +2774,12 @@
     if (context != null) {
       context._continueModel = _join(context._continueModel, _current);
     }
-    _current = _current.setReachable(false);
+    _current = _current.setUnreachable();
   }
 
   @override
   void handleExit() {
-    _current = _current.setReachable(false);
+    _current = _current.setUnreachable();
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 1b8ff62..1269bc4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1194,33 +1194,32 @@
 const Template<
     Message Function(
         String
-            name)> templateConstEvalDeferredLibrary = const Template<
-        Message Function(String name)>(
+            nameOKEmpty)> templateConstEvalDeferredLibrary = const Template<
+        Message Function(String nameOKEmpty)>(
     messageTemplate:
-        r"""'#name' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
+        r"""'#nameOKEmpty' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
     tipTemplate:
         r"""Try moving the constant from the deferred library, or removing 'deferred' from the import.
 """,
     withArguments: _withArgumentsConstEvalDeferredLibrary);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeConstEvalDeferredLibrary =
-    const Code<Message Function(String name)>(
+const Code<Message Function(String nameOKEmpty)> codeConstEvalDeferredLibrary =
+    const Code<Message Function(String nameOKEmpty)>(
         "ConstEvalDeferredLibrary", templateConstEvalDeferredLibrary,
         analyzerCodes: <String>[
       "NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY"
     ]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsConstEvalDeferredLibrary(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
+Message _withArgumentsConstEvalDeferredLibrary(String nameOKEmpty) {
+  if (nameOKEmpty == null || nameOKEmpty.isEmpty) nameOKEmpty = '(unnamed)';
   return new Message(codeConstEvalDeferredLibrary,
       message:
-          """'${name}' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
+          """'${nameOKEmpty}' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
       tip: """Try moving the constant from the deferred library, or removing 'deferred' from the import.
 """,
-      arguments: {'name': name});
+      arguments: {'nameOKEmpty': nameOKEmpty});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1243,53 +1242,53 @@
     message: r"""This assertion failed.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String string)>
+const Template<Message Function(String stringOKEmpty)>
     templateConstEvalFailedAssertionWithMessage =
-    const Template<Message Function(String string)>(
-        messageTemplate: r"""This assertion failed with message: #string""",
+    const Template<Message Function(String stringOKEmpty)>(
+        messageTemplate:
+            r"""This assertion failed with message: #stringOKEmpty""",
         withArguments: _withArgumentsConstEvalFailedAssertionWithMessage);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String string)>
+const Code<Message Function(String stringOKEmpty)>
     codeConstEvalFailedAssertionWithMessage =
-    const Code<Message Function(String string)>(
+    const Code<Message Function(String stringOKEmpty)>(
         "ConstEvalFailedAssertionWithMessage",
         templateConstEvalFailedAssertionWithMessage,
         analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsConstEvalFailedAssertionWithMessage(String string) {
-  if (string.isEmpty) throw 'No string provided';
+Message _withArgumentsConstEvalFailedAssertionWithMessage(
+    String stringOKEmpty) {
+  if (stringOKEmpty == null || stringOKEmpty.isEmpty) stringOKEmpty = '(empty)';
   return new Message(codeConstEvalFailedAssertionWithMessage,
-      message: """This assertion failed with message: ${string}""",
-      arguments: {'string': string});
+      message: """This assertion failed with message: ${stringOKEmpty}""",
+      arguments: {'stringOKEmpty': stringOKEmpty});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        String
-            name)> templateConstEvalInvalidStaticInvocation = const Template<
-        Message Function(String name)>(
-    messageTemplate:
-        r"""The invocation of '#name' is not allowed in a constant expression.""",
-    withArguments: _withArgumentsConstEvalInvalidStaticInvocation);
+const Template<Message Function(String nameOKEmpty)>
+    templateConstEvalInvalidStaticInvocation =
+    const Template<Message Function(String nameOKEmpty)>(
+        messageTemplate:
+            r"""The invocation of '#nameOKEmpty' is not allowed in a constant expression.""",
+        withArguments: _withArgumentsConstEvalInvalidStaticInvocation);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeConstEvalInvalidStaticInvocation =
-    const Code<Message Function(String name)>(
+const Code<Message Function(String nameOKEmpty)>
+    codeConstEvalInvalidStaticInvocation =
+    const Code<Message Function(String nameOKEmpty)>(
         "ConstEvalInvalidStaticInvocation",
         templateConstEvalInvalidStaticInvocation,
         analyzerCodes: <String>["CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsConstEvalInvalidStaticInvocation(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
+Message _withArgumentsConstEvalInvalidStaticInvocation(String nameOKEmpty) {
+  if (nameOKEmpty == null || nameOKEmpty.isEmpty) nameOKEmpty = '(unnamed)';
   return new Message(codeConstEvalInvalidStaticInvocation,
       message:
-          """The invocation of '${name}' is not allowed in a constant expression.""",
-      arguments: {'name': name});
+          """The invocation of '${nameOKEmpty}' is not allowed in a constant expression.""",
+      arguments: {'nameOKEmpty': nameOKEmpty});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1328,27 +1327,27 @@
 const Template<
     Message Function(
         String
-            string)> templateConstEvalNonConstantVariableGet = const Template<
-        Message Function(String string)>(
+            nameOKEmpty)> templateConstEvalNonConstantVariableGet = const Template<
+        Message Function(String nameOKEmpty)>(
     messageTemplate:
-        r"""The variable '#string' is not a constant, only constant expressions are allowed.""",
+        r"""The variable '#nameOKEmpty' is not a constant, only constant expressions are allowed.""",
     withArguments: _withArgumentsConstEvalNonConstantVariableGet);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String string)>
+const Code<Message Function(String nameOKEmpty)>
     codeConstEvalNonConstantVariableGet =
-    const Code<Message Function(String string)>(
+    const Code<Message Function(String nameOKEmpty)>(
         "ConstEvalNonConstantVariableGet",
         templateConstEvalNonConstantVariableGet,
         analyzerCodes: <String>["NON_CONSTANT_VALUE_IN_INITIALIZER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsConstEvalNonConstantVariableGet(String string) {
-  if (string.isEmpty) throw 'No string provided';
+Message _withArgumentsConstEvalNonConstantVariableGet(String nameOKEmpty) {
+  if (nameOKEmpty == null || nameOKEmpty.isEmpty) nameOKEmpty = '(unnamed)';
   return new Message(codeConstEvalNonConstantVariableGet,
       message:
-          """The variable '${string}' is not a constant, only constant expressions are allowed.""",
-      arguments: {'string': string});
+          """The variable '${nameOKEmpty}' is not a constant, only constant expressions are allowed.""",
+      arguments: {'nameOKEmpty': nameOKEmpty});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5821,6 +5820,30 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateLateDefinitelyAssignedError =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""Late final variable '#name' definitely assigned.""",
+        withArguments: _withArgumentsLateDefinitelyAssignedError);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeLateDefinitelyAssignedError =
+    const Code<Message Function(String name)>(
+  "LateDefinitelyAssignedError",
+  templateLateDefinitelyAssignedError,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsLateDefinitelyAssignedError(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeLateDefinitelyAssignedError,
+      message: """Late final variable '${name}' definitely assigned.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String
@@ -6622,32 +6645,6 @@
     message: r"""Can only use type variables in instance methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateNonNullableLateDefinitelyAssignedError =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Non-nullable late final variable '#name' definitely assigned.""",
-        withArguments: _withArgumentsNonNullableLateDefinitelyAssignedError);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
-    codeNonNullableLateDefinitelyAssignedError =
-    const Code<Message Function(String name)>(
-  "NonNullableLateDefinitelyAssignedError",
-  templateNonNullableLateDefinitelyAssignedError,
-);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNonNullableLateDefinitelyAssignedError(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeNonNullableLateDefinitelyAssignedError,
-      message:
-          """Non-nullable late final variable '${name}' definitely assigned.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/issue43006.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/issue43006.dart
new file mode 100644
index 0000000..76c6b78
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/issue43006.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, 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.
+
+test() {
+  late int x;
+  late int y;
+  var f = () => x;
+  int z0 = /*unassigned*/ x;
+  int z1 = /*unassigned*/ y;
+  x = 3;
+  y = 3;
+}
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index aaba6ae..b7b9be9 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -1014,6 +1014,32 @@
       });
     });
 
+    test(
+        'functionExpression_end does not propagate "definitely unassigned" data',
+        () {
+      var h = _Harness();
+      var x = h.addVar('x', 'int');
+      var functionNode = _Node();
+      h.assignedVariables((vars) {
+        vars.function(functionNode, () {});
+        vars.write(x);
+      });
+      h.run((flow) {
+        flow.declare(x, false);
+        expect(flow.isUnassigned(x), true);
+        flow.functionExpression_begin(functionNode);
+        // The function expression could be called at any time, so x might be
+        // assigned now.
+        expect(flow.isUnassigned(x), false);
+        flow.functionExpression_end();
+        // But now that we are back outside the function expression, we once
+        // again know that x is unassigned.
+        expect(flow.isUnassigned(x), true);
+        flow.write(x, _Type('int'));
+        expect(flow.isUnassigned(x), false);
+      });
+    });
+
     test('ifNullExpression allows ensure guarding', () {
       var h = _Harness();
       var x = h.addVar('x', 'int?');
@@ -2189,24 +2215,22 @@
     var intQVar = _Var('x', _Type('int?'));
     var objectQVar = _Var('x', _Type('Object?'));
     var nullVar = _Var('x', _Type('Null'));
-    group('setReachable', () {
+    group('setUnreachable', () {
       var unreachable = FlowModel<_Var, _Type>(false);
       var reachable = FlowModel<_Var, _Type>(true);
       test('unchanged', () {
-        expect(unreachable.setReachable(false), same(unreachable));
-        expect(reachable.setReachable(true), same(reachable));
+        expect(unreachable.setUnreachable(), same(unreachable));
       });
 
       test('changed', () {
-        void _check(FlowModel<_Var, _Type> initial, bool newReachability) {
-          var s = initial.setReachable(newReachability);
+        void _check(FlowModel<_Var, _Type> initial) {
+          var s = initial.setUnreachable();
           expect(s, isNot(same(initial)));
-          expect(s.reachable, newReachability);
+          expect(s.reachable, false);
           expect(s.variableInfo, same(initial.variableInfo));
         }
 
-        _check(unreachable, true);
-        _check(reachable, false);
+        _check(reachable);
       });
     });
 
@@ -2927,7 +2951,7 @@
       test('reachability', () {
         var h = _Harness();
         var reachable = FlowModel<_Var, _Type>(true);
-        var unreachable = reachable.setReachable(false);
+        var unreachable = reachable.setUnreachable();
         expect(reachable.restrict(h, reachable, Set()), same(reachable));
         expect(reachable.restrict(h, unreachable, Set()), same(unreachable));
         expect(unreachable.restrict(h, unreachable, Set()), same(unreachable));
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart
index 3d890e8..35f2d63 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/initialization.dart
@@ -55,6 +55,18 @@
   x;
 }
 
+localVariable_initialized_nonNull() {
+  num? x = 0;
+  /*num*/ x;
+  x = null;
+  x;
+}
+
+localVariable_initialized_nonNull_final() {
+  final num? x = 0;
+  x;
+}
+
 localVariable_initialized_promoted_type_var<T>(T t) {
   if (t is num) {
     var x = /*T & num*/ t;
@@ -94,13 +106,13 @@
 
 localVariable_initialized_promoted_type_var_typed<T>(T t) {
   if (t is num) {
-    // TODO(paulberry): This should promote to `T & Object`, because that's the
-    // non-nullable version of T, but it shouldn't promote to `T & num`.
+    // This should promote to `T & Object`, because that's the non-nullable
+    // version of T, but it shouldn't promote to `T & num`.
     T x = /*T & num*/ t;
-    x;
+    /*T & Object*/ x;
     // Check that `T & Object` is a type of interest by promoting and then
     // writing to it
-    if (x is int) {
+    if (/*T & Object*/ x is int) {
       /*T & int*/ x;
       x = /*T & num*/ t;
       /*T & Object*/ x;
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index daf702f..6578de6 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -4897,9 +4897,9 @@
   static const jsonHandler =
       LspJsonHandler(CreateFile.canParse, CreateFile.fromJson);
 
-  CreateFile({@required this.kind, @required this.uri, this.options}) {
-    if (kind == null) {
-      throw 'kind is required but was not provided';
+  CreateFile({this.kind = 'create', @required this.uri, this.options}) {
+    if (kind != 'create') {
+      throw 'kind may only be the literal \'create\'';
     }
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -5922,9 +5922,9 @@
   static const jsonHandler =
       LspJsonHandler(DeleteFile.canParse, DeleteFile.fromJson);
 
-  DeleteFile({@required this.kind, @required this.uri, this.options}) {
-    if (kind == null) {
-      throw 'kind is required but was not provided';
+  DeleteFile({this.kind = 'delete', @required this.uri, this.options}) {
+    if (kind != 'delete') {
+      throw 'kind may only be the literal \'delete\'';
     }
     if (uri == null) {
       throw 'uri is required but was not provided';
@@ -16615,12 +16615,12 @@
       LspJsonHandler(RenameFile.canParse, RenameFile.fromJson);
 
   RenameFile(
-      {@required this.kind,
+      {this.kind = 'rename',
       @required this.oldUri,
       @required this.newUri,
       this.options}) {
-    if (kind == null) {
-      throw 'kind is required but was not provided';
+    if (kind != 'rename') {
+      throw 'kind may only be the literal \'rename\'';
     }
     if (oldUri == null) {
       throw 'oldUri is required but was not provided';
@@ -23768,13 +23768,13 @@
       WorkDoneProgressBegin.canParse, WorkDoneProgressBegin.fromJson);
 
   WorkDoneProgressBegin(
-      {@required this.kind,
+      {this.kind = 'begin',
       @required this.title,
       this.cancellable,
       this.message,
       this.percentage}) {
-    if (kind == null) {
-      throw 'kind is required but was not provided';
+    if (kind != 'begin') {
+      throw 'kind may only be the literal \'begin\'';
     }
     if (title == null) {
       throw 'title is required but was not provided';
@@ -24088,9 +24088,9 @@
   static const jsonHandler = LspJsonHandler(
       WorkDoneProgressEnd.canParse, WorkDoneProgressEnd.fromJson);
 
-  WorkDoneProgressEnd({@required this.kind, this.message}) {
-    if (kind == null) {
-      throw 'kind is required but was not provided';
+  WorkDoneProgressEnd({this.kind = 'end', this.message}) {
+    if (kind != 'end') {
+      throw 'kind may only be the literal \'end\'';
     }
   }
   static WorkDoneProgressEnd fromJson(Map<String, dynamic> json) {
@@ -24433,9 +24433,9 @@
       WorkDoneProgressReport.canParse, WorkDoneProgressReport.fromJson);
 
   WorkDoneProgressReport(
-      {@required this.kind, this.cancellable, this.message, this.percentage}) {
-    if (kind == null) {
-      throw 'kind is required but was not provided';
+      {this.kind = 'report', this.cancellable, this.message, this.percentage}) {
+    if (kind != 'report') {
+      throw 'kind may only be the literal \'report\'';
     }
   }
   static WorkDoneProgressReport fromJson(Map<String, dynamic> json) {
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index 57febf1..27abeb9 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -49,11 +49,6 @@
 /// Characters to trigger formatting when format-on-type is enabled.
 const dartTypeFormattingCharacters = ['}', ';'];
 
-final analyzingProgressBegin =
-    WorkDoneProgressBegin(kind: 'begin', title: 'Analyzing…');
-
-final analyzingProgressEnd = WorkDoneProgressEnd(kind: 'end');
-
 /// A [ProgressToken] used for reporting progress when the server is analyzing.
 final analyzingProgressToken = Either2<num, String>.t2('ANALYZING');
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
index 85f8c67..c1c00de 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
@@ -6,7 +6,9 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/progress.dart';
 import 'package:analysis_server/src/services/correction/organize_imports.dart';
 
 class OrganizeImportsCommandHandler extends SimpleEditCommandHandler {
@@ -16,7 +18,8 @@
   String get commandName => 'Organize Imports';
 
   @override
-  Future<ErrorOr<void>> handle(List<dynamic> arguments) async {
+  Future<ErrorOr<void>> handle(List<dynamic> arguments,
+      ProgressReporter reporter, CancellationToken cancellationToken) async {
     if (arguments == null || arguments.length != 1 || arguments[0] is! String) {
       return ErrorOr.error(ResponseError(
         code: ServerErrorCodes.InvalidCommandArguments,
@@ -32,6 +35,11 @@
     final docIdentifier = server.getVersionedDocumentIdentifier(path);
 
     final result = await requireResolvedUnit(path);
+
+    if (cancellationToken.isCancellationRequested) {
+      return error(ErrorCodes.RequestCancelled, 'Request was cancelled');
+    }
+
     return result.mapResult((result) {
       final code = result.content;
       final unit = result.unit;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
index c81db2e..bd880eb 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
@@ -6,11 +6,16 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/lsp/progress.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+
+final _manager = _RefactorManager();
 
 class PerformRefactorCommandHandler extends SimpleEditCommandHandler {
   PerformRefactorCommandHandler(LspAnalysisServer server) : super(server);
@@ -19,7 +24,8 @@
   String get commandName => 'Perform Refactor';
 
   @override
-  Future<ErrorOr<void>> handle(List<dynamic> arguments) async {
+  Future<ErrorOr<void>> handle(List<dynamic> arguments,
+      ProgressReporter reporter, CancellationToken cancellationToken) async {
     if (arguments == null ||
         arguments.length != 6 ||
         arguments[0] is! String || // kind
@@ -49,24 +55,50 @@
       return _getRefactoring(
               RefactoringKind(kind), result, offset, length, options)
           .mapResult((refactoring) async {
-        final status = await refactoring.checkAllConditions();
-
-        if (status.hasError) {
-          return error(ServerErrorCodes.RefactorFailed, status.message);
+        // If the token we were given is not cancellable, replace it with one that
+        // is for the rest of this request, as a future refactor may need to cancel
+        // this request.
+        if (cancellationToken is! CancelableToken) {
+          cancellationToken = CancelableToken();
         }
+        _manager.begin(cancellationToken);
 
-        final change = await refactoring.createChange();
+        try {
+          reporter.begin('Refactoring…');
+          final status = await refactoring.checkAllConditions();
 
-        // If the file changed while we were validating and preparing the change,
-        // we should fail to avoid sending bad edits.
-        if (docVersion != null &&
-            docVersion != server.getVersionedDocumentIdentifier(path).version) {
+          if (status.hasError) {
+            return error(ServerErrorCodes.RefactorFailed, status.message);
+          }
+
+          if (cancellationToken.isCancellationRequested) {
+            return error(ErrorCodes.RequestCancelled, 'Request was cancelled');
+          }
+
+          final change = await refactoring.createChange();
+
+          if (cancellationToken.isCancellationRequested) {
+            return error(ErrorCodes.RequestCancelled, 'Request was cancelled');
+          }
+
+          // If the file changed while we were validating and preparing the change,
+          // we should fail to avoid sending bad edits.
+          if (docVersion != null &&
+              docVersion !=
+                  server.getVersionedDocumentIdentifier(path).version) {
+            return error(ErrorCodes.ContentModified,
+                'Content was modified before refactor was applied');
+          }
+
+          final edit = createWorkspaceEdit(server, change.edits);
+          return await sendWorkspaceEditToClient(edit);
+        } on InconsistentAnalysisException {
           return error(ErrorCodes.ContentModified,
               'Content was modified before refactor was applied');
+        } finally {
+          _manager.end(cancellationToken);
+          reporter.end();
         }
-
-        final edit = createWorkspaceEdit(server, change.edits);
-        return await sendWorkspaceEditToClient(edit);
       });
     });
   }
@@ -112,3 +144,22 @@
     }
   }
 }
+
+/// Manages a running refactor to help ensure only one refactor runs at a time.
+class _RefactorManager {
+  /// The cancellation token for the current in-progress refactor (or null).
+  CancelableToken _currentRefactoringCancellationToken;
+
+  /// Begins a new refactor, cancelling any other in-progress refactors.
+  void begin(CancelableToken cancelToken) {
+    _currentRefactoringCancellationToken?.cancel();
+    _currentRefactoringCancellationToken = cancelToken;
+  }
+
+  /// Marks a refactor as no longer current.
+  void end(CancelableToken cancelToken) {
+    if (_currentRefactoringCancellationToken == cancelToken) {
+      _currentRefactoringCancellationToken = null;
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart
index c918eb6..c4eda52 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart
@@ -6,7 +6,9 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/progress.dart';
 
 /// This command allows a client to request the server send it a
 /// workspace/applyEdit command, simply passing through the edits provided
@@ -22,7 +24,8 @@
   String get commandName => 'Send Workspace Edit';
 
   @override
-  Future<ErrorOr<void>> handle(List<dynamic> arguments) async {
+  Future<ErrorOr<void>> handle(List<dynamic> arguments,
+      ProgressReporter reporter, CancellationToken cancellationToken) async {
     if (arguments == null ||
         arguments.length != 1 ||
         arguments[0] is! Map<String, dynamic>) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
index c1a5b8f..ca10fa4 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
@@ -6,7 +6,9 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/progress.dart';
 import 'package:analysis_server/src/services/correction/sort_members.dart';
 
 class SortMembersCommandHandler extends SimpleEditCommandHandler {
@@ -16,7 +18,8 @@
   String get commandName => 'Sort Members';
 
   @override
-  Future<ErrorOr<void>> handle(List<dynamic> arguments) async {
+  Future<ErrorOr<void>> handle(List<dynamic> arguments,
+      ProgressReporter reporter, CancellationToken cancellationToken) async {
     if (arguments == null || arguments.length != 1 || arguments[0] is! String) {
       return ErrorOr.error(ResponseError(
         code: ServerErrorCodes.InvalidCommandArguments,
@@ -33,6 +36,11 @@
 
     var driver = server.getAnalysisDriver(path);
     final result = await driver?.parseFile(path);
+
+    if (cancellationToken.isCancellationRequested) {
+      return error(ErrorCodes.RequestCancelled, 'Request was cancelled');
+    }
+
     if (result == null) {
       return ErrorOr.error(ResponseError(
         code: ServerErrorCodes.FileNotAnalyzed,
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
index 22b99d1..967e8e8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/lsp/handlers/commands/sort_members.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/progress.dart';
 
 /// Handles workspace/executeCommand messages by delegating to a specific handler
 /// based on the command.
@@ -35,12 +36,18 @@
 
   @override
   Future<ErrorOr<Object>> handle(
-      ExecuteCommandParams params, CancellationToken token) async {
+      ExecuteCommandParams params, CancellationToken cancellationToken) async {
     final handler = commandHandlers[params.command];
     if (handler == null) {
       return error(ServerErrorCodes.UnknownCommand,
           '${params.command} is not a valid command identifier', null);
     }
-    return handler.handle(params.arguments);
+
+    final progress = params.workDoneToken != null
+        ? ProgressReporter.clientProvided(server, params.workDoneToken)
+        : server.clientCapabilities.window?.workDoneProgress == true
+            ? ProgressReporter.serverCreated(server)
+            : ProgressReporter.noop;
+    return handler.handle(params.arguments, progress, cancellationToken);
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index c87b9c7..41f20f4 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/lsp/handlers/handler_reject.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/progress.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
@@ -47,7 +48,8 @@
     this.server = server;
   }
 
-  Future<ErrorOr<void>> handle(List<dynamic> arguments);
+  Future<ErrorOr<void>> handle(List<dynamic> arguments,
+      ProgressReporter progress, CancellationToken cancellationToken);
 }
 
 mixin Handler<P, R> {
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 9adc503..85debf8 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -25,6 +25,7 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/lsp/notification_manager.dart';
+import 'package:analysis_server/src/lsp/progress.dart';
 import 'package:analysis_server/src/lsp/server_capabilities_computer.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
@@ -118,10 +119,8 @@
   /// The set of analysis roots explicitly added to the workspace.
   final _explicitAnalysisRoots = HashSet<String>();
 
-  /// A [Future] that completes once the client has acknowledged the request to
-  /// create a progress token for Analyzing events. If this completes with an
-  /// error, progress notifications should not be sent.
-  Future<ResponseMessage> analyzingProgressTokenCreate;
+  /// A progress reporter for analysis status.
+  ProgressReporter analyzingProgressReporter;
 
   /// Initialize a newly created server to send and receive messages to the
   /// given [channel].
@@ -156,6 +155,9 @@
     channel.listen(handleMessage, onDone: done, onError: socketError);
     _pluginChangeSubscription =
         pluginManager.pluginsChanged.listen((_) => _onPluginsChanged());
+
+    analyzingProgressReporter =
+        ProgressReporter.serverCreated(this, analyzingProgressToken);
   }
 
   /// The capabilities of the LSP client. Will be null prior to initialization.
@@ -548,28 +550,11 @@
       return;
     }
 
-    // We must ask the client to create a progress token before we can report
-    // any progress using it.
-    analyzingProgressTokenCreate ??= sendRequest(
-        Method.window_workDoneProgress_create,
-        WorkDoneProgressCreateParams(token: analyzingProgressToken));
-
-    // Only send notifications after the token creation response has completed.
-    analyzingProgressTokenCreate.then((response) async {
-      // Don't try to send progress notifications if the client responded with an
-      // error.
-      if (response.error != null) return;
-
-      sendNotification(NotificationMessage(
-          method: Method.progress,
-          params: ProgressParams(
-            token: analyzingProgressToken,
-            value: status.isAnalyzing
-                ? analyzingProgressBegin
-                : analyzingProgressEnd,
-          ),
-          jsonrpc: jsonRpcVersion));
-    });
+    if (status.isAnalyzing) {
+      analyzingProgressReporter.begin('Analyzing…');
+    } else {
+      analyzingProgressReporter.end();
+    }
   }
 
   /// Returns `true` if closing labels should be sent for [file] with the given
diff --git a/pkg/analysis_server/lib/src/lsp/progress.dart b/pkg/analysis_server/lib/src/lsp/progress.dart
new file mode 100644
index 0000000..585c391
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/progress.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2020, 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.
+
+import 'dart:math';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+/// Reports progress of long-running operations to the LSP client.
+abstract class ProgressReporter {
+  /// A no-op reporter that does nothing.
+  static final noop = _NoopProgressReporter();
+
+  /// Creates a reporter for a token that was supplied by the client and does
+  /// not need creating prior to use.
+  factory ProgressReporter.clientProvided(
+          LspAnalysisServer server, Either2<num, String> token) =>
+      _TokenProgressReporter(server, token);
+
+  /// Creates a reporter for a new token that must be created prior to being
+  /// used.
+  ///
+  /// If [token] is not supplied, a random identifier will be used.
+  factory ProgressReporter.serverCreated(LspAnalysisServer server,
+          [Either2<num, String> token]) =>
+      _ServerCreatedProgressReporter(server, token);
+
+  ProgressReporter._();
+
+  // TODO(dantup): Add support for cancellable progress notifications.
+  void begin(String title, {String message});
+
+  void end([String message]);
+}
+
+class _NoopProgressReporter extends ProgressReporter {
+  _NoopProgressReporter() : super._();
+  @override
+  void begin(String title, {String message}) {}
+  @override
+  void end([String message]) {}
+}
+
+class _ServerCreatedProgressReporter extends _TokenProgressReporter {
+  static final _random = Random();
+  Future<ResponseMessage> _tokenCreateRequest;
+
+  _ServerCreatedProgressReporter(
+    LspAnalysisServer server,
+    Either2<num, String> token,
+  ) : super(
+          server,
+          token ?? Either2<num, String>.t2(_randomTokenIdentifier()),
+        );
+
+  @override
+  void begin(String title, {String message}) {
+    // Create the token lazily so we don't create it if it's not required.
+    _tokenCreateRequest ??= _server.sendRequest(
+        Method.window_workDoneProgress_create,
+        WorkDoneProgressCreateParams(token: _token));
+
+    // Chain onto the end of tokenCreateRequest so we do not try to use
+    // the token without the client accepting it.
+    _tokenCreateRequest.then((response) {
+      if (response.error != null) return;
+      super.begin(title, message: message);
+    });
+  }
+
+  @override
+  void end([String message]) {
+    // Chain onto the end of tokenCreateRequest so we do not try to use
+    // the token without the client accepting it.
+    _tokenCreateRequest.then((response) {
+      if (response.error != null) return;
+      super.end(message);
+    });
+  }
+
+  static String _randomTokenIdentifier() {
+    final millisecondsSinceEpoch = DateTime.now().millisecondsSinceEpoch;
+    final random = _random.nextInt(0x3fffffff);
+    return '$millisecondsSinceEpoch$random';
+  }
+}
+
+class _TokenProgressReporter extends ProgressReporter {
+  final LspAnalysisServer _server;
+  final Either2<num, String> _token;
+  bool _needsEnd = false;
+
+  _TokenProgressReporter(this._server, this._token) : super._();
+
+  @override
+  void begin(String title, {String message}) {
+    _needsEnd = true;
+    _sendNotification(
+        WorkDoneProgressBegin(title: title ?? 'Working…', message: message));
+  }
+
+  @override
+  void end([String message]) {
+    if (!_needsEnd) return;
+    _needsEnd = false;
+    _sendNotification(WorkDoneProgressEnd(message: message));
+  }
+
+  void _sendNotification(ToJsonable value) async {
+    _server.sendNotification(NotificationMessage(
+        method: Method.progress,
+        params: ProgressParams(
+          token: _token,
+          value: value,
+        ),
+        jsonrpc: jsonRpcVersion));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index 9d762cf..2a7a501e 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -201,6 +201,7 @@
             ),
       executeCommandProvider: ExecuteCommandOptions(
         commands: Commands.serverSupportedCommands,
+        workDoneProgress: true,
       ),
       workspaceSymbolProvider: true,
       workspace: ServerCapabilitiesWorkspace(
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 003eeb4..9e583cc 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -249,68 +249,72 @@
     CompileTimeErrorCode.EXTENDS_NON_CLASS: [
       DataDriven.newInstance,
     ],
-    // TODO(brianwilkerson) Uncomment the entries below as we add tests for
-    //  them.
+    // TODO(brianwilkerson) The following fix fails if an invocation of the
+    //  function is the argument that needs to be removed.
     // CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS: [
     //   DataDriven.newInstance,
     // ],
+    // TODO(brianwilkerson) The following fix fails if an invocation of the
+    //  function is the argument that needs to be updated.
     // CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED: [
     //   DataDriven.newInstance,
     // ],
     CompileTimeErrorCode.IMPLEMENTS_NON_CLASS: [
       DataDriven.newInstance,
     ],
-    // CompileTimeErrorCode.INVALID_OVERRIDE: [
-    //   DataDriven.newInstance,
-    // ],
+    CompileTimeErrorCode.INVALID_OVERRIDE: [
+      DataDriven.newInstance,
+    ],
     CompileTimeErrorCode.MIXIN_OF_NON_CLASS: [
       DataDriven.newInstance,
     ],
-    // CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.UNDEFINED_CLASS: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.UNDEFINED_FUNCTION: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.UNDEFINED_GETTER: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.UNDEFINED_IDENTIFIER: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.UNDEFINED_METHOD: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.UNDEFINED_SETTER: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION: [
-    //   DataDriven.newInstance,
-    // ],
-    // CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: [
-    //   DataDriven.newInstance,
-    // ],
+    CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_CLASS: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_FUNCTION: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_GETTER: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_IDENTIFIER: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_METHOD: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_SETTER: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: [
+      DataDriven.newInstance,
+    ],
+    // TODO(brianwilkerson) Uncomment the entries below as we add tests for
+    //  them.
     // HintCode.DEPRECATED_MEMBER_USE: [
     //   DataDriven.newInstance,
     // ],
     // HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE: [
     //   DataDriven.newInstance,
     // ],
-    // HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD: [
-    //   DataDriven.newInstance,
-    // ],
+    HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD: [
+      DataDriven.newInstance,
+    ],
   };
 
   /// A map from an error code to a generator used to create the correction
diff --git a/pkg/analysis_server/test/lsp/analyzer_status_test.dart b/pkg/analysis_server/test/lsp/analyzer_status_test.dart
index 6484112..40cb5e4 100644
--- a/pkg/analysis_server/test/lsp/analyzer_status_test.dart
+++ b/pkg/analysis_server/test/lsp/analyzer_status_test.dart
@@ -34,10 +34,7 @@
   bool get progressSupport;
 
   ClientCapabilitiesWindow get _windowCapabilities => progressSupport
-      ? extendWindowCapabilities(
-          emptyWindowClientCapabilities,
-          {'workDoneProgress': true},
-        )
+      ? withWorkDoneProgressSupport(emptyWindowClientCapabilities)
       : emptyWindowClientCapabilities;
 
   Future<void> test_afterDocumentEdits() async {
diff --git a/pkg/analysis_server/test/lsp/code_actions_abstract.dart b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
index 33f1418..df1425e 100644
--- a/pkg/analysis_server/test/lsp/code_actions_abstract.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
@@ -79,14 +79,16 @@
   /// the expected content.
   Future verifyCodeActionEdits(Either2<Command, CodeAction> codeAction,
       String content, String expectedContent,
-      {bool expectDocumentChanges = false}) async {
+      {bool expectDocumentChanges = false,
+      Either2<num, String> workDoneToken}) async {
     final command = codeAction.map(
       (command) => command,
       (codeAction) => codeAction.command,
     );
 
     await verifyCommandEdits(command, content, expectedContent,
-        expectDocumentChanges: expectDocumentChanges);
+        expectDocumentChanges: expectDocumentChanges,
+        workDoneToken: workDoneToken);
   }
 
   /// Verifies that executing the given command on the server results in an edit
@@ -94,14 +96,15 @@
   /// content.
   Future<void> verifyCommandEdits(
       Command command, String content, String expectedContent,
-      {bool expectDocumentChanges = false}) async {
+      {bool expectDocumentChanges = false,
+      Either2<num, String> workDoneToken}) async {
     ApplyWorkspaceEditParams editParams;
 
     final commandResponse = await handleExpectedRequest<Object,
         ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
       Method.workspace_applyEdit,
       ApplyWorkspaceEditParams.fromJson,
-      () => executeCommand(command),
+      () => executeCommand(command, workDoneToken: workDoneToken),
       handler: (edit) {
         // When the server sends the edit back, just keep a copy and say we
         // applied successfully (it'll be verified below).
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index 2701b41..07d6afb3 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -2,11 +2,16 @@
 // 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.
 
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../src/utilities/mock_packages.dart';
+import '../tool/lsp_spec/matchers.dart';
 import 'code_actions_abstract.dart';
 
 void main() {
@@ -19,6 +24,32 @@
 @reflectiveTest
 class ExtractMethodRefactorCodeActionsTest extends AbstractCodeActionsTest {
   final extractMethodTitle = 'Extract Method';
+
+  /// A stream of strings (CREATE, BEGIN, END) corresponding to progress requests
+  /// and notifications for convenience in testing.
+  Stream<String> get progressUpdates {
+    final controller = StreamController<String>();
+
+    requestsFromServer
+        .where((r) => r.method == Method.window_workDoneProgress_create)
+        .listen((request) async {
+      controller.add('CREATE');
+    }, onDone: controller.close);
+    notificationsFromServer
+        .where((n) => n.method == Method.progress)
+        .listen((notification) {
+      final params = ProgressParams.fromJson(notification.params);
+      if (WorkDoneProgressBegin.canParse(params.value, nullLspJsonReporter)) {
+        controller.add('BEGIN');
+      } else if (WorkDoneProgressEnd.canParse(
+          params.value, nullLspJsonReporter)) {
+        controller.add('END');
+      }
+    });
+
+    return controller.stream;
+  }
+
   Future<void> test_appliesCorrectEdits() async {
     const content = '''
 main() {
@@ -49,6 +80,85 @@
         codeAction, withoutMarkers(content), expectedContent);
   }
 
+  Future<void> test_cancelsInProgress() async {
+    const content = '''
+main() {
+  print('Test!');
+  [[print('Test!');]]
+}
+    ''';
+    const expectedContent = '''
+main() {
+  print('Test!');
+  newMethod();
+}
+
+void newMethod() {
+  print('Test!');
+}
+    ''';
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final codeAction =
+        findCommand(codeActions, Commands.performRefactor, extractMethodTitle);
+    expect(codeAction, isNotNull);
+
+    // Respond to any applyEdit requests from the server with successful responses
+    // and capturing the last edit.
+    WorkspaceEdit edit;
+    requestsFromServer.listen((request) async {
+      if (request.method == Method.workspace_applyEdit) {
+        final params = ApplyWorkspaceEditParams.fromJson(request.params);
+        edit = params.edit;
+        respondTo(request, ApplyWorkspaceEditResponse(applied: true));
+      }
+    });
+
+    // Send two requests together.
+    final req1 = executeCodeAction(codeAction);
+    final req2 = executeCodeAction(codeAction);
+
+    // Expect the first will have cancelled the second.
+    await expectLater(
+        req1, throwsA(isResponseError(ErrorCodes.RequestCancelled)));
+    await req2;
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyChanges(contents, edit.changes);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  Future<void> test_contentModified() async {
+    const content = '''
+main() {
+  print('Test!');
+  [[print('Test!');]]
+}
+    ''';
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final codeAction =
+        findCommand(codeActions, Commands.performRefactor, extractMethodTitle);
+    expect(codeAction, isNotNull);
+
+    // Send an edit request immediately after the refactor request.
+    final req1 = executeCodeAction(codeAction);
+    await replaceFile(100, mainFileUri, 'new test content');
+
+    // Expect the first to fail because of the modified content.
+    await expectLater(
+        req1, throwsA(isResponseError(ErrorCodes.ContentModified)));
+  }
+
   Future<void> test_invalidLocation() async {
     const content = '''
 import 'dart:convert';
@@ -63,6 +173,128 @@
         findCommand(codeActions, Commands.performRefactor, extractMethodTitle);
     expect(codeAction, isNull);
   }
+
+  Future<void> test_progress_clientProvided() async {
+    const content = '''
+main() {
+  print('Test!');
+  [[print('Test!');]]
+}
+    ''';
+    const expectedContent = '''
+main() {
+  print('Test!');
+  newMethod();
+}
+
+void newMethod() {
+  print('Test!');
+}
+    ''';
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+        windowCapabilities:
+            withWorkDoneProgressSupport(emptyWindowClientCapabilities));
+
+    // Expect begin/end progress updates without a create, since the
+    // token was supplied by us (the client).
+    expect(progressUpdates, emitsInOrder(['BEGIN', 'END']));
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final codeAction =
+        findCommand(codeActions, Commands.performRefactor, extractMethodTitle);
+    await verifyCodeActionEdits(
+        codeAction, withoutMarkers(content), expectedContent,
+        workDoneToken: testWorkDoneToken);
+  }
+
+  Future<void> test_progress_notSupported() async {
+    const content = '''
+main() {
+  print('Test!');
+  [[print('Test!');]]
+}
+    ''';
+    const expectedContent = '''
+main() {
+  print('Test!');
+  newMethod();
+}
+
+void newMethod() {
+  print('Test!');
+}
+    ''';
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    var didGetProgressNotifications = false;
+    notificationsFromServer
+        .where((n) => n.method == Method.progress)
+        .listen((_) => didGetProgressNotifications = true);
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final codeAction =
+        findCommand(codeActions, Commands.performRefactor, extractMethodTitle);
+    await verifyCodeActionEdits(
+        codeAction, withoutMarkers(content), expectedContent);
+
+    expect(didGetProgressNotifications, isFalse);
+  }
+
+  Future<void> test_progress_serverGenerated() async {
+    const content = '''
+main() {
+  print('Test!');
+  [[print('Test!');]]
+}
+    ''';
+    const expectedContent = '''
+main() {
+  print('Test!');
+  newMethod();
+}
+
+void newMethod() {
+  print('Test!');
+}
+    ''';
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+        windowCapabilities:
+            withWorkDoneProgressSupport(emptyWindowClientCapabilities));
+
+    // Capture progress-related messages in a list in the order they arrive.
+    final progressRequests = <String>[];
+    requestsFromServer
+        .where((r) => r.method == Method.window_workDoneProgress_create)
+        .listen((request) async {
+      progressRequests.add('CREATE');
+    });
+    notificationsFromServer
+        .where((n) => n.method == Method.progress)
+        .listen((notification) {
+      final params = ProgressParams.fromJson(notification.params);
+      if (WorkDoneProgressBegin.canParse(params.value, nullLspJsonReporter)) {
+        progressRequests.add('BEGIN');
+      } else if (WorkDoneProgressEnd.canParse(
+          params.value, nullLspJsonReporter)) {
+        progressRequests.add('END');
+      }
+    });
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final codeAction =
+        findCommand(codeActions, Commands.performRefactor, extractMethodTitle);
+    await verifyCodeActionEdits(
+        codeAction, withoutMarkers(content), expectedContent);
+
+    // Ensure the progress messages came through and in the correct order.
+    expect(progressRequests, equals(['CREATE', 'BEGIN', 'END']));
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analysis_server/test/lsp/configuration_test.dart b/pkg/analysis_server/test/lsp/configuration_test.dart
index 0a864ee..2c91650 100644
--- a/pkg/analysis_server/test/lsp/configuration_test.dart
+++ b/pkg/analysis_server/test/lsp/configuration_test.dart
@@ -86,12 +86,15 @@
   }
 
   Future<void> test_configurationRequest_notSupported() async {
-    final configRequest = requestsFromServer
-        .firstWhere((n) => n.method == Method.workspace_configuration);
-    expect(configRequest, doesNotComplete);
+    var didGetConfigRequest = false;
+    requestsFromServer
+        .where((n) => n.method == Method.workspace_configuration)
+        .listen((_) => didGetConfigRequest = true);
 
     await initialize();
     pumpEventQueue();
+
+    expect(didGetConfigRequest, isFalse);
   }
 
   Future<void> test_configurationRequest_supported() async {
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index 43e9db8..4caaecc 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -88,10 +88,8 @@
     // Set a flag if any registerCapability request comes through.
     var didGetRegisterCapabilityRequest = false;
     requestsFromServer
-        .firstWhere((n) => n.method == Method.client_registerCapability)
-        .then((params) {
-      didGetRegisterCapabilityRequest = true;
-    });
+        .where((n) => n.method == Method.client_registerCapability)
+        .listen((_) => didGetRegisterCapabilityRequest = true);
 
     // Initialize with no dynamic registrations advertised.
     final initResponse = await initialize();
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 3d2a1d0..4ec3477 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -48,6 +48,8 @@
   TestPluginManager pluginManager;
   LspAnalysisServer server;
 
+  final testWorkDoneToken = Either2<num, String>.t2('test');
+
   AnalysisServerOptions get serverOptions => AnalysisServerOptions();
 
   @override
@@ -380,6 +382,11 @@
       'synchronization': {'dynamicRegistration': true}
     });
   }
+
+  ClientCapabilitiesWindow withWorkDoneProgressSupport(
+      ClientCapabilitiesWindow source) {
+    return extendWindowCapabilities(source, {'workDoneProgress': true});
+  }
 }
 
 mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
@@ -585,12 +592,23 @@
     await sendNotificationToServer(notification);
   }
 
-  Future<Object> executeCommand(Command command) async {
+  Future<Object> executeCodeAction(
+      Either2<Command, CodeAction> codeAction) async {
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+    return executeCommand(command);
+  }
+
+  Future<Object> executeCommand(Command command,
+      {Either2<num, String> workDoneToken}) async {
     final request = makeRequest(
       Method.workspace_executeCommand,
       ExecuteCommandParams(
         command: command.command,
         arguments: command.arguments,
+        workDoneToken: workDoneToken,
       ),
     );
     return expectSuccessfulResponseTo(request, (result) => result);
@@ -939,13 +957,20 @@
     @required FutureOr<RR> Function(R) handler,
     Duration timeout = const Duration(seconds: 5),
   }) async {
-    FutureOr<T> outboundRequest;
+    Future<T> outboundRequest;
 
     // Run [f] and wait for the incoming request from the server.
     final incomingRequest = await expectRequest(method, () {
       // Don't return/await the response yet, as this may not complete until
       // after we have handled the request that comes from the server.
       outboundRequest = f();
+
+      // Because we don't await this future until "later", if it throws the
+      // error is treated as unhandled and will fail the test. Attaching an
+      // error handler prevents that, though since the Future completed with
+      // an error it will still be handled as such when the future is later
+      // awaited.
+      outboundRequest.catchError((_) {});
     });
 
     // Handle the request from the server and send the response back.
@@ -1370,8 +1395,8 @@
         return diagnosticParams.uri == uri.toString();
       }
       return false;
-    });
-    return diagnosticParams.diagnostics;
+    }, orElse: () => null);
+    return diagnosticParams?.diagnostics;
   }
 
   Future<FlutterOutline> waitForFlutterOutline(Uri uri) async {
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 56e583f..c166c2c 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -80,6 +80,12 @@
     if (!_closed.isCompleted) {
       _closed.complete();
     }
+    if (!_serverToClient.isClosed) {
+      _serverToClient.close();
+    }
+    if (!_clientToServer.isClosed) {
+      _clientToServer.close();
+    }
   }
 
   @override
@@ -180,7 +186,8 @@
         (throwOnError &&
             message is lsp.NotificationMessage &&
             message.method == Method.window_showMessage &&
-            message.params?.type == MessageType.Error));
+            lsp.ShowMessageParams.fromJson(message.params).type ==
+                MessageType.Error));
 
     if (response is lsp.ResponseMessage) {
       return response;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
index 6f65772..cc14f37 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
@@ -10,8 +10,24 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ExtendsNonClassTest);
+    defineReflectiveTests(ExtraPositionalArgumentsCouldBeNamedTest);
+    defineReflectiveTests(ExtraPositionalArgumentsTest);
     defineReflectiveTests(ImplementsNonClassTest);
+    defineReflectiveTests(InvalidOverrideTest);
     defineReflectiveTests(MixinOfNonClassTest);
+    defineReflectiveTests(NewWithUndefinedConstructorDefaultTest);
+    defineReflectiveTests(NotEnoughPositionalArgumentsTest);
+    defineReflectiveTests(OverrideOnNonOverridingMethodTest);
+    defineReflectiveTests(UndefinedClassTest);
+    defineReflectiveTests(UndefinedFunctionTest);
+    defineReflectiveTests(UndefinedGetterTest);
+    defineReflectiveTests(UndefinedIdentifierTest);
+    defineReflectiveTests(UndefinedMethodTest);
+    defineReflectiveTests(UndefinedSetterTest);
+    defineReflectiveTests(WrongNumberOfTypeArgumentsConstructorTest);
+    defineReflectiveTests(WrongNumberOfTypeArgumentsExtensionTest);
+    defineReflectiveTests(WrongNumberOfTypeArgumentsMethodTest);
+    defineReflectiveTests(WrongNumberOfTypeArgumentsTest);
   });
 }
 
@@ -47,6 +63,90 @@
 }
 
 @reflectiveTest
+class ExtraPositionalArgumentsCouldBeNamedTest extends _DataDrivenTest {
+  @failingTest
+  Future<void> test_replaceParameter() async {
+    // This fails because we grab the argument from the outer invocation before
+    // we modify it, but then we add the edits to modify it, which causes the
+    // wrong code to be put in the wrong places.
+    setPackageContent('''
+int f(int x, {int y = 0}) => x;
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Replace parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    function: 'f'
+  changes:
+    - kind: 'addParameter'
+      index: 1
+      name: 'y'
+      style: required_named
+      argumentValue:
+        expression: '{% old %}'
+        variables:
+          old:
+            kind: 'argument'
+            index: 1
+    - kind: 'removeParameter'
+      index: 1
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void g() {
+  f(0, f(1, 2));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void g() {
+  f(0, y: f(1, y: 2));
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ExtraPositionalArgumentsTest extends _DataDrivenTest {
+  @failingTest
+  Future<void> test_removeParameter() async {
+    // This fails because we delete the extra argument from the inner invocation
+    // (`, 2`) before deleting the argument from the outer invocation, which
+    // results in three characters too many being deleted.
+    setPackageContent('''
+int f(int x) => x;
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Remove parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    function: 'f'
+  changes:
+    - kind: 'removeParameter'
+      index: 1
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void g() {
+  f(0, f(1, 2));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void g() {
+  f(0);
+}
+''');
+  }
+}
+
+@reflectiveTest
 class ImplementsNonClassTest extends _DataDrivenTest {
   Future<void> test_rename() async {
     setPackageContent('''
@@ -78,6 +178,104 @@
 }
 
 @reflectiveTest
+class InvalidOverrideTest extends _DataDrivenTest {
+  @failingTest
+  Future<void> test_addParameter() async {
+    // This functionality hasn't been implemented yet.
+    setPackageContent('''
+class C {
+  void m(int x, int y) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'addParameter'
+      index: 1
+      name: 'y'
+      style: required_positional
+      argumentValue:
+        expression: '0'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+class A extends C {
+  @override
+  void m(int x) {}
+}
+class B extends C {
+  @override
+  void m(int x) {}
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+class A extends C {
+  @override
+  void m(int x, int y) {}
+}
+class B extends C {
+  @override
+  void m(int x, int y) {}
+}
+''');
+  }
+
+  Future<void> test_addTypeParameter() async {
+    setPackageContent('''
+class C {
+  void m<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add type parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 0
+      name: 'T'
+      argumentValue:
+        expression: 'int'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+class A extends C {
+  @override
+  void m() {}
+}
+class B extends C {
+  @override
+  void m() {}
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+class A extends C {
+  @override
+  void m<T>() {}
+}
+class B extends C {
+  @override
+  void m<T>() {}
+}
+''');
+  }
+}
+
+@reflectiveTest
 class MixinOfNonClassTest extends _DataDrivenTest {
   Future<void> test_rename() async {
     setPackageContent('''
@@ -108,6 +306,498 @@
   }
 }
 
+@reflectiveTest
+class NewWithUndefinedConstructorDefaultTest extends _DataDrivenTest {
+  Future<void> test_rename() async {
+    setPackageContent('''
+class C {
+  C.new([C c]);
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    constructor: ''
+    inClass: 'C'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+C c() => C(C());
+''');
+    await assertHasFix('''
+import '$importUri';
+C c() => C.new(C.new());
+''');
+  }
+}
+
+@reflectiveTest
+class NotEnoughPositionalArgumentsTest extends _DataDrivenTest {
+  Future<void> test_removeParameter() async {
+    setPackageContent('''
+int f(int x, int y) => x + y;
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    function: 'f'
+  changes:
+    - kind: 'addParameter'
+      index: 1
+      name: 'y'
+      style: required_positional
+      argumentValue:
+        expression: '0'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void g() {
+  f(f(0));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void g() {
+  f(f(0, 0), 0);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class OverrideOnNonOverridingMethodTest extends _DataDrivenTest {
+  Future<void> test_rename() async {
+    setPackageContent('''
+class C {
+  int new(int x) => x + 1;
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    method: 'old'
+    inClass: 'C'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+class D extends C {
+  @override
+  int old(int x) => x + 2;
+}
+class E extends C {
+  @override
+  int old(int x) => x + 3;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+class D extends C {
+  @override
+  int new(int x) => x + 2;
+}
+class E extends C {
+  @override
+  int new(int x) => x + 3;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UndefinedClassTest extends _DataDrivenTest {
+  Future<void> test_rename() async {
+    setPackageContent('''
+class New {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to New'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    class: 'Old'
+  changes:
+    - kind: 'rename'
+      newName: 'New'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f(Old a, Old b) {}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f(New a, New b) {}
+''');
+  }
+}
+
+@reflectiveTest
+class UndefinedFunctionTest extends _DataDrivenTest {
+  Future<void> test_rename() async {
+    setPackageContent('''
+int new(int x) => x + 1;
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    function: 'old'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f() {
+  old(old(0));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f() {
+  new(new(0));
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UndefinedGetterTest extends _DataDrivenTest {
+  Future<void> test_rename() async {
+    setPackageContent('''
+class C {
+  int get new => 0;
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    getter: 'old'
+    inClass: 'C'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f(C a, C b) {
+  a.old + b.old;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f(C a, C b) {
+  a.new + b.new;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UndefinedIdentifierTest extends _DataDrivenTest {
+  Future<void> test_rename_topLevelVariable() async {
+    setPackageContent('''
+int new = 0;
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    function: 'old'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f() {
+  old + old;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f() {
+  new + new;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UndefinedMethodTest extends _DataDrivenTest {
+  Future<void> test_rename() async {
+    setPackageContent('''
+class C {
+  int new(int x) => x + 1;
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    method: 'old'
+    inClass: 'C'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f(C a, C b) {
+  a.old(b.old(0));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f(C a, C b) {
+  a.new(b.new(0));
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UndefinedSetterTest extends _DataDrivenTest {
+  Future<void> test_rename() async {
+    setPackageContent('''
+class C {
+  set new(int x) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    setter: 'old'
+    inClass: 'C'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f(C a, C b) {
+  a.old = b.old = 1;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f(C a, C b) {
+  a.new = b.new = 1;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class WrongNumberOfTypeArgumentsConstructorTest extends _DataDrivenTest {
+  Future<void> test_addTypeParameter() async {
+    setPackageContent('''
+class C<S, T> {
+  C.c([C c]);
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add type parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    class: 'C'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 1
+      name: 'T'
+      argumentValue:
+        expression: 'int'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+C f() => C<String>.c(C<String>.c());
+''');
+    await assertHasFix('''
+import '$importUri';
+C f() => C<String, int>.c(C<String, int>.c());
+''');
+  }
+}
+
+@reflectiveTest
+class WrongNumberOfTypeArgumentsExtensionTest extends _DataDrivenTest {
+  Future<void> test_addTypeParameter() async {
+    setPackageContent('''
+extension E<S, T> on String {
+  int m(int x) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add type parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    extension: 'E'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 1
+      name: 'T'
+      argumentValue:
+        expression: 'int'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f(String s) {
+  E<String>(s).m(E<String>(s).m(0));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f(String s) {
+  E<String, int>(s).m(E<String, int>(s).m(0));
+}
+''');
+  }
+}
+
+@reflectiveTest
+class WrongNumberOfTypeArgumentsMethodTest extends _DataDrivenTest {
+  Future<void> test_addTypeParameter() async {
+    setPackageContent('''
+class C {
+  int m<S, T>(int x) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add type parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 1
+      name: 'T'
+      argumentValue:
+        expression: 'int'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f(C c) {
+  c.m<String>(c.m<String>(0));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f(C c) {
+  c.m<String, int>(c.m<String, int>(0));
+}
+''');
+  }
+}
+
+@reflectiveTest
+class WrongNumberOfTypeArgumentsTest extends _DataDrivenTest {
+  Future<void> test_addTypeParameter() async {
+    setPackageContent('''
+class C<S, T> {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add type parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    class: 'C'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 1
+      name: 'T'
+      argumentValue:
+        expression: 'int'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f(C<String> c) {}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f(C<String, int> c) {}
+''');
+  }
+
+  Future<void> test_addTypeParameter_unnamedConstructor() async {
+    setPackageContent('''
+class C<S, T> {
+  C([C c]);
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add type parameter'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    class: 'C'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 1
+      name: 'T'
+      argumentValue:
+        expression: 'int'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+C f() => C<String>(C<String>());
+''');
+    await assertHasFix('''
+import '$importUri';
+C f() => C<String, int>(C<String, int>());
+''');
+  }
+}
+
 class _DataDrivenTest extends BulkFixProcessorTest {
   /// Return the URI used to import the library created by [setPackageContent].
   String get importUri => 'package:p/lib.dart';
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 415f142..b911615 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -272,25 +272,42 @@
   buffer
     ..writeIndented('${interface.name}({')
     ..write(allFields.map((field) {
-      final annotation =
-          !field.allowsNull && !field.allowsUndefined ? '@required' : '';
-      return '$annotation this.${field.name}';
+      final isLiteral = field.type is LiteralType;
+      final isRequired =
+          !isLiteral && !field.allowsNull && !field.allowsUndefined;
+      final annotation = isRequired ? '@required' : '';
+      final valueCode =
+          isLiteral ? ' = ${(field.type as LiteralType).literal}' : '';
+      return '$annotation this.${field.name}$valueCode';
     }).join(', '))
     ..write('})');
-  final fieldsWithValidation =
-      allFields.where((f) => !f.allowsNull && !f.allowsUndefined).toList();
+  final fieldsWithValidation = allFields
+      .where(
+          (f) => (!f.allowsNull && !f.allowsUndefined) || f.type is LiteralType)
+      .toList();
   if (fieldsWithValidation.isNotEmpty) {
     buffer
       ..writeIndentedln(' {')
       ..indent();
     for (var field in fieldsWithValidation) {
-      buffer
-        ..writeIndentedln('if (${field.name} == null) {')
-        ..indent()
-        ..writeIndentedln(
-            "throw '${field.name} is required but was not provided';")
-        ..outdent()
-        ..writeIndentedln('}');
+      final type = field.type;
+      if (type is LiteralType) {
+        buffer
+          ..writeIndentedln('if (${field.name} != ${type.literal}) {')
+          ..indent()
+          ..writeIndentedln(
+              "throw '${field.name} may only be the literal ${type.literal.replaceAll("'", "\\'")}';")
+          ..outdent()
+          ..writeIndentedln('}');
+      } else if (!field.allowsNull && !field.allowsUndefined) {
+        buffer
+          ..writeIndentedln('if (${field.name} == null) {')
+          ..indent()
+          ..writeIndentedln(
+              "throw '${field.name} is required but was not provided';")
+          ..outdent()
+          ..writeIndentedln('}');
+      }
     }
     buffer
       ..outdent()
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 05b73cc..d94a231 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -48,6 +48,10 @@
   /// is deprecated.
   bool _inDeprecatedMember;
 
+  /// A flag indicating whether a surrounding member is annotated as
+  /// `@doNotStore`.
+  bool _inDoNotStoreMember;
+
   /// The error reporter by which errors will be reported.
   final ErrorReporter _errorReporter;
 
@@ -101,6 +105,7 @@
             _errorReporter, _currentLibrary, workspacePackage),
         _workspacePackage = workspacePackage {
     _inDeprecatedMember = _currentLibrary.hasDeprecated;
+    _inDoNotStoreMember = _currentLibrary.hasDoNotStore;
 
     _linterContext = LinterContextImpl(
       null /* allUnits */,
@@ -305,9 +310,13 @@
     _invalidAccessVerifier._enclosingClass = element;
 
     bool wasInDeprecatedMember = _inDeprecatedMember;
+    bool wasInDoNotStoreMember = _inDoNotStoreMember;
     if (element != null && element.hasDeprecated) {
       _inDeprecatedMember = true;
     }
+    if (element != null && element.hasDoNotStore) {
+      _inDoNotStoreMember = true;
+    }
 
     try {
       // Commented out until we decide that we want this hint in the analyzer
@@ -319,6 +328,7 @@
       _enclosingClass = null;
       _invalidAccessVerifier._enclosingClass = null;
       _inDeprecatedMember = wasInDeprecatedMember;
+      _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
 
@@ -433,10 +443,14 @@
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     bool wasInDeprecatedMember = _inDeprecatedMember;
+    bool wasInDoNotStoreMember = _inDoNotStoreMember;
     ExecutableElement element = node.declaredElement;
     if (element != null && element.hasDeprecated) {
       _inDeprecatedMember = true;
     }
+    if (element != null && element.hasDoNotStore) {
+      _inDoNotStoreMember = true;
+    }
     try {
       _checkForMissingReturn(
           node.returnType, node.functionExpression.body, element, node);
@@ -450,6 +464,7 @@
       super.visitFunctionDeclaration(node);
     } finally {
       _inDeprecatedMember = wasInDeprecatedMember;
+      _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
 
@@ -549,6 +564,7 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     bool wasInDeprecatedMember = _inDeprecatedMember;
+    bool wasInDoNotStoreMember = _inDoNotStoreMember;
     ExecutableElement element = node.declaredElement;
     Element enclosingElement = element?.enclosingElement;
 
@@ -572,6 +588,9 @@
     if (element != null && element.hasDeprecated) {
       _inDeprecatedMember = true;
     }
+    if (element != null && element.hasDoNotStore) {
+      _inDoNotStoreMember = true;
+    }
     try {
       // This was determined to not be a good hint, see: dartbug.com/16029
       //checkForOverridingPrivateMember(node);
@@ -598,6 +617,7 @@
       super.visitMethodDeclaration(node);
     } finally {
       _inDeprecatedMember = wasInDeprecatedMember;
+      _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
 
@@ -1359,17 +1379,18 @@
   }
 
   void _checkForReturnOfDoNotStore(Expression expression) {
+    if (_inDoNotStoreMember) {
+      return;
+    }
     var element = _getElement(expression);
     if (element != null && element.hasOrInheritsDoNotStore) {
-      var parent = expression.thisOrAncestorMatching(
+      Declaration parent = expression.thisOrAncestorMatching(
           (e) => e is FunctionDeclaration || e is MethodDeclaration);
-      if (parent is Declaration && !parent.declaredElement.hasDoNotStore) {
-        _errorReporter.reportErrorForNode(
-          HintCode.RETURN_OF_DO_NOT_STORE,
-          expression,
-          [element.name, parent.declaredElement.displayName],
-        );
-      }
+      _errorReporter.reportErrorForNode(
+        HintCode.RETURN_OF_DO_NOT_STORE,
+        expression,
+        [element.name, parent.declaredElement.displayName],
+      );
     }
   }
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 558ee7d..be96aee 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1994,12 +1994,17 @@
     }
 
     var initializer = node.initializer;
-    var parent = node.parent;
-    TypeAnnotation declaredType = (parent as VariableDeclarationList).type;
-    if (declaredType == null && initializer != null) {
+    var parent = node.parent as VariableDeclarationList;
+    TypeAnnotation declaredType = parent.type;
+    if (initializer != null) {
       var initializerStaticType = initializer.staticType;
-      if (initializerStaticType is TypeParameterType) {
-        _flowAnalysis?.flow?.promote(declaredElement, initializerStaticType);
+      if (declaredType == null) {
+        if (initializerStaticType is TypeParameterType) {
+          _flowAnalysis?.flow?.promote(declaredElement, initializerStaticType);
+        }
+      } else if (!parent.isFinal) {
+        _flowAnalysis?.flow?.write(declaredElement, initializerStaticType,
+            viaInitializer: true);
       }
     }
   }
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 6927bdd7..7be84f7 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -353,34 +353,34 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(String string, Constant _constant, DartType _type,
-            DartType _type2, bool isNonNullableByDefault)>
+        Message Function(String stringOKEmpty, Constant _constant,
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateConstEvalInvalidBinaryOperandType = const Template<
-            Message Function(String string, Constant _constant, DartType _type,
-                DartType _type2, bool isNonNullableByDefault)>(
+            Message Function(String stringOKEmpty, Constant _constant,
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
         messageTemplate:
-            r"""Binary operator '#string' on '#constant' requires operand of type '#type', but was of type '#type2'.""",
+            r"""Binary operator '#stringOKEmpty' on '#constant' requires operand of type '#type', but was of type '#type2'.""",
         withArguments: _withArgumentsConstEvalInvalidBinaryOperandType);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<
-        Message Function(String string, Constant _constant, DartType _type,
-            DartType _type2, bool isNonNullableByDefault)>
+        Message Function(String stringOKEmpty, Constant _constant,
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     codeConstEvalInvalidBinaryOperandType = const Code<
-        Message Function(String string, Constant _constant, DartType _type,
-            DartType _type2, bool isNonNullableByDefault)>(
+        Message Function(String stringOKEmpty, Constant _constant,
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
   "ConstEvalInvalidBinaryOperandType",
   templateConstEvalInvalidBinaryOperandType,
 );
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidBinaryOperandType(
-    String string,
+    String stringOKEmpty,
     Constant _constant,
     DartType _type,
     DartType _type2,
     bool isNonNullableByDefault) {
-  if (string.isEmpty) throw 'No string provided';
+  if (stringOKEmpty == null || stringOKEmpty.isEmpty) stringOKEmpty = '(empty)';
   TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
   List<Object> constantParts = labeler.labelConstant(_constant);
   List<Object> typeParts = labeler.labelType(_type);
@@ -390,10 +390,10 @@
   String type2 = type2Parts.join();
   return new Message(codeConstEvalInvalidBinaryOperandType,
       message:
-          """Binary operator '${string}' on '${constant}' requires operand of type '${type}', but was of type '${type2}'.""" +
+          """Binary operator '${stringOKEmpty}' on '${constant}' requires operand of type '${type}', but was of type '${type2}'.""" +
               labeler.originMessages,
       arguments: {
-        'string': string,
+        'stringOKEmpty': stringOKEmpty,
         'constant': _constant,
         'type': _type,
         'type2': _type2
@@ -439,21 +439,21 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(
-            String string, Constant _constant, bool isNonNullableByDefault)>
+        Message Function(String stringOKEmpty, Constant _constant,
+            bool isNonNullableByDefault)>
     templateConstEvalInvalidMethodInvocation = const Template<
-            Message Function(String string, Constant _constant,
+            Message Function(String stringOKEmpty, Constant _constant,
                 bool isNonNullableByDefault)>(
         messageTemplate:
-            r"""The method '#string' can't be invoked on '#constant' in a constant expression.""",
+            r"""The method '#stringOKEmpty' can't be invoked on '#constant' in a constant expression.""",
         withArguments: _withArgumentsConstEvalInvalidMethodInvocation);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<
-        Message Function(
-            String string, Constant _constant, bool isNonNullableByDefault)>
-    codeConstEvalInvalidMethodInvocation = const Code<
-            Message Function(String string, Constant _constant,
+        Message Function(String stringOKEmpty, Constant _constant,
+            bool isNonNullableByDefault)> codeConstEvalInvalidMethodInvocation =
+    const Code<
+            Message Function(String stringOKEmpty, Constant _constant,
                 bool isNonNullableByDefault)>(
         "ConstEvalInvalidMethodInvocation",
         templateConstEvalInvalidMethodInvocation,
@@ -461,51 +461,51 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidMethodInvocation(
-    String string, Constant _constant, bool isNonNullableByDefault) {
-  if (string.isEmpty) throw 'No string provided';
+    String stringOKEmpty, Constant _constant, bool isNonNullableByDefault) {
+  if (stringOKEmpty == null || stringOKEmpty.isEmpty) stringOKEmpty = '(empty)';
   TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalInvalidMethodInvocation,
       message:
-          """The method '${string}' can't be invoked on '${constant}' in a constant expression.""" +
+          """The method '${stringOKEmpty}' can't be invoked on '${constant}' in a constant expression.""" +
               labeler.originMessages,
-      arguments: {'string': string, 'constant': _constant});
+      arguments: {'stringOKEmpty': stringOKEmpty, 'constant': _constant});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(
-            String string, Constant _constant, bool isNonNullableByDefault)>
-    templateConstEvalInvalidPropertyGet = const Template<
-            Message Function(String string, Constant _constant,
+        Message Function(String stringOKEmpty, Constant _constant,
+            bool isNonNullableByDefault)> templateConstEvalInvalidPropertyGet =
+    const Template<
+            Message Function(String stringOKEmpty, Constant _constant,
                 bool isNonNullableByDefault)>(
         messageTemplate:
-            r"""The property '#string' can't be accessed on '#constant' in a constant expression.""",
+            r"""The property '#stringOKEmpty' can't be accessed on '#constant' in a constant expression.""",
         withArguments: _withArgumentsConstEvalInvalidPropertyGet);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<
-        Message Function(
-            String string, Constant _constant, bool isNonNullableByDefault)>
-    codeConstEvalInvalidPropertyGet = const Code<
-            Message Function(String string, Constant _constant,
+        Message Function(String stringOKEmpty, Constant _constant,
+            bool isNonNullableByDefault)> codeConstEvalInvalidPropertyGet =
+    const Code<
+            Message Function(String stringOKEmpty, Constant _constant,
                 bool isNonNullableByDefault)>(
         "ConstEvalInvalidPropertyGet", templateConstEvalInvalidPropertyGet,
         analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidPropertyGet(
-    String string, Constant _constant, bool isNonNullableByDefault) {
-  if (string.isEmpty) throw 'No string provided';
+    String stringOKEmpty, Constant _constant, bool isNonNullableByDefault) {
+  if (stringOKEmpty == null || stringOKEmpty.isEmpty) stringOKEmpty = '(empty)';
   TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalInvalidPropertyGet,
       message:
-          """The property '${string}' can't be accessed on '${constant}' in a constant expression.""" +
+          """The property '${stringOKEmpty}' can't be accessed on '${constant}' in a constant expression.""" +
               labeler.originMessages,
-      arguments: {'string': string, 'constant': _constant});
+      arguments: {'stringOKEmpty': stringOKEmpty, 'constant': _constant});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
index 28f549f..5fd43f5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
@@ -18,25 +18,34 @@
   L makeLiteral(List<Expression> elements);
 
   /// Add an element to the constant list being built by this builder.
-  void add(Expression element) {
+  ///
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant add(Expression element) {
     Constant constant = evaluator._evaluateSubexpression(element);
+    if (constant is AbortConstant) return constant;
     if (evaluator.shouldBeUnevaluated) {
       parts.add(evaluator.unevaluated(
           element, makeLiteral([evaluator.extract(constant)])));
+      return null;
     } else {
-      addConstant(constant, element);
+      return addConstant(constant, element);
     }
   }
 
-  void addSpread(Expression spreadExpression) {
-    Constant spread =
-        evaluator.unlower(evaluator._evaluateSubexpression(spreadExpression));
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant addSpread(Expression spreadExpression) {
+    Constant constant = evaluator._evaluateSubexpression(spreadExpression);
+    if (constant is AbortConstant) return constant;
+    Constant spread = evaluator.unlower(constant);
     if (evaluator.shouldBeUnevaluated) {
       // Unevaluated spread
       parts.add(spread);
     } else if (spread == evaluator.nullConstant) {
       // Null spread
-      evaluator.report(spreadExpression, messageConstEvalNullValue);
+      return evaluator.createErrorConstant(
+          spreadExpression, messageConstEvalNullValue);
     } else {
       // Fully evaluated spread
       List<Constant> entries;
@@ -46,16 +55,20 @@
         entries = spread.entries;
       } else {
         // Not list or set in spread
-        return evaluator.report(
+        return evaluator.createErrorConstant(
             spreadExpression, messageConstEvalNotListOrSetInSpread);
       }
       for (Constant entry in entries) {
-        addConstant(entry, spreadExpression);
+        AbortConstant error = addConstant(entry, spreadExpression);
+        if (error != null) return error;
       }
     }
+    return null;
   }
 
-  void addConstant(Constant constant, TreeNode context);
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant addConstant(Constant constant, TreeNode context);
 
   Constant build();
 }
@@ -70,14 +83,18 @@
       new ListLiteral(elements, isConst: true);
 
   @override
-  void addConstant(Constant constant, TreeNode context) {
+  AbortConstant addConstant(Constant constant, TreeNode context) {
     List<Constant> lastPart;
     if (parts.last is List<Constant>) {
       lastPart = parts.last;
     } else {
+      // Probably unreachable.
       parts.add(lastPart = <Constant>[]);
     }
-    lastPart.add(evaluator.ensureIsSubtype(constant, elementType, context));
+    Constant value = evaluator.ensureIsSubtype(constant, elementType, context);
+    if (value is AbortConstant) return value;
+    lastPart.add(value);
+    return null;
   }
 
   @override
@@ -115,16 +132,16 @@
       new SetLiteral(elements, isConst: true);
 
   @override
-  void addConstant(Constant constant, TreeNode context) {
+  AbortConstant addConstant(Constant constant, TreeNode context) {
     if (!evaluator.hasPrimitiveEqual(constant)) {
-      evaluator.report(
+      return evaluator.createErrorConstant(
           context,
           templateConstEvalElementImplementsEqual.withArguments(
               constant, evaluator.isNonNullableByDefault));
     }
     bool unseen = seen.add(constant);
     if (!unseen) {
-      evaluator.report(
+      return evaluator.createErrorConstant(
           context,
           templateConstEvalDuplicateElement.withArguments(
               constant, evaluator.isNonNullableByDefault));
@@ -134,7 +151,8 @@
           evaluator._weakener.visitConstant(constant) ?? constant;
       bool weakUnseen = weakSeen.add(weakConstant);
       if (unseen != weakUnseen) {
-        evaluator.report(context, messageNonAgnosticConstant);
+        return evaluator.createErrorConstant(
+            context, messageNonAgnosticConstant);
       }
     }
 
@@ -142,9 +160,13 @@
     if (parts.last is List<Constant>) {
       lastPart = parts.last;
     } else {
+      // Probably unreachable.
       parts.add(lastPart = <Constant>[]);
     }
-    lastPart.add(evaluator.ensureIsSubtype(constant, elementType, context));
+    Constant value = evaluator.ensureIsSubtype(constant, elementType, context);
+    if (value is AbortConstant) return value;
+    lastPart.add(value);
+    return null;
   }
 
   @override
@@ -206,61 +228,76 @@
       this.original, this.keyType, this.valueType, this.evaluator);
 
   /// Add a map entry to the constant map being built by this builder
-  void add(MapEntry element) {
+  ///
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant add(MapEntry element) {
     Constant key = evaluator._evaluateSubexpression(element.key);
+    if (key is AbortConstant) return key;
     Constant value = evaluator._evaluateSubexpression(element.value);
+    if (value is AbortConstant) return value;
     if (evaluator.shouldBeUnevaluated) {
       parts.add(evaluator.unevaluated(
           element.key,
           new MapLiteral(
               [new MapEntry(evaluator.extract(key), evaluator.extract(value))],
               isConst: true)));
+      return null;
     } else {
-      addConstant(key, value, element.key, element.value);
+      return addConstant(key, value, element.key, element.value);
     }
   }
 
-  void addSpread(Expression spreadExpression) {
-    Constant spread =
-        evaluator.unlower(evaluator._evaluateSubexpression(spreadExpression));
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant addSpread(Expression spreadExpression) {
+    Constant constant = evaluator._evaluateSubexpression(spreadExpression);
+    if (constant is AbortConstant) return constant;
+    Constant spread = evaluator.unlower(constant);
     if (evaluator.shouldBeUnevaluated) {
       // Unevaluated spread
       parts.add(spread);
     } else if (spread == evaluator.nullConstant) {
       // Null spread
-      evaluator.report(spreadExpression, messageConstEvalNullValue);
+      return evaluator.createErrorConstant(
+          spreadExpression, messageConstEvalNullValue);
     } else {
       // Fully evaluated spread
       if (spread is MapConstant) {
         for (ConstantMapEntry entry in spread.entries) {
-          addConstant(
+          AbortConstant error = addConstant(
               entry.key, entry.value, spreadExpression, spreadExpression);
+          if (error != null) return error;
         }
       } else {
         // Not map in spread
-        return evaluator.report(
+        return evaluator.createErrorConstant(
             spreadExpression, messageConstEvalNotMapInSpread);
       }
     }
+    return null;
   }
 
-  void addConstant(Constant key, Constant value, TreeNode keyContext,
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant addConstant(Constant key, Constant value, TreeNode keyContext,
       TreeNode valueContext) {
     List<ConstantMapEntry> lastPart;
     if (parts.last is List<ConstantMapEntry>) {
       lastPart = parts.last;
     } else {
+      // Probably unreachable.
       parts.add(lastPart = <ConstantMapEntry>[]);
     }
     if (!evaluator.hasPrimitiveEqual(key)) {
-      evaluator.report(
+      return evaluator.createErrorConstant(
           keyContext,
           templateConstEvalKeyImplementsEqual.withArguments(
               key, evaluator.isNonNullableByDefault));
     }
     bool unseenKey = seenKeys.add(key);
     if (!unseenKey) {
-      evaluator.report(
+      return evaluator.createErrorConstant(
           keyContext,
           templateConstEvalDuplicateKey.withArguments(
               key, evaluator.isNonNullableByDefault));
@@ -269,12 +306,16 @@
       Constant weakKey = evaluator._weakener.visitConstant(key) ?? key;
       bool weakUnseenKey = weakSeenKeys.add(weakKey);
       if (unseenKey != weakUnseenKey) {
-        evaluator.report(keyContext, messageNonAgnosticConstant);
+        return evaluator.createErrorConstant(
+            keyContext, messageNonAgnosticConstant);
       }
     }
-    lastPart.add(new ConstantMapEntry(
-        evaluator.ensureIsSubtype(key, keyType, keyContext),
-        evaluator.ensureIsSubtype(value, valueType, valueContext)));
+    Constant key2 = evaluator.ensureIsSubtype(key, keyType, keyContext);
+    if (key2 is AbortConstant) return key2;
+    Constant value2 = evaluator.ensureIsSubtype(value, valueType, valueContext);
+    if (value2 is AbortConstant) return value2;
+    lastPart.add(new ConstantMapEntry(key2, value2));
+    return null;
   }
 
   Constant build() {
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index bfcc759..a9808d6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -28,6 +28,7 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/printer.dart' show AstPrinter, AstTextStrategy;
 import 'package:kernel/type_algebra.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:kernel/target/targets.dart';
@@ -453,6 +454,8 @@
   @override
   RedirectingFactoryConstructor visitRedirectingFactoryConstructor(
       RedirectingFactoryConstructor node) {
+    // Currently unreachable as the compiler doesn't produce
+    // RedirectingFactoryConstructor.
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext(node, typeEnvironment);
     constantEvaluator.withNewEnvironment(() {
@@ -883,59 +886,66 @@
     _staticTypeContext = context;
     seenUnevaluatedChild = false;
     lazyDepth = 0;
-    try {
-      Constant result = _evaluateSubexpression(node);
-      if (result is UnevaluatedConstant) {
-        if (errorOnUnevaluatedConstant) {
-          return report(node, messageConstEvalUnevaluated);
+    Constant result = _evaluateSubexpression(node);
+    if (result is AbortConstant) {
+      if (result is _AbortDueToErrorConstant) {
+        final Uri uri = getFileUri(result.node);
+        final int fileOffset = getFileOffset(uri, result.node);
+        final LocatedMessage locatedMessageActualError =
+            result.message.withLocation(uri, fileOffset, noLength);
+
+        final List<LocatedMessage> contextMessages = <LocatedMessage>[
+          locatedMessageActualError
+        ];
+        if (result.context != null) contextMessages.addAll(result.context);
+        for (final TreeNode node in contextChain) {
+          if (node == result.node) continue;
+          final Uri uri = getFileUri(node);
+          final int fileOffset = getFileOffset(uri, node);
+          contextMessages.add(
+              messageConstEvalContext.withLocation(uri, fileOffset, noLength));
+        }
+
+        {
+          final Uri uri = getFileUri(node);
+          final int fileOffset = getFileOffset(uri, node);
+          final LocatedMessage locatedMessage = messageConstEvalStartingPoint
+              .withLocation(uri, fileOffset, noLength);
+          errorReporter.report(locatedMessage, contextMessages);
         }
         return new UnevaluatedConstant(
-            removeRedundantFileUriExpressions(result.expression));
+            new InvalidExpression(result.message.message));
       }
-      return result;
-    } on _AbortDueToError catch (e) {
-      final Uri uri = getFileUri(e.node);
-      final int fileOffset = getFileOffset(uri, e.node);
-      final LocatedMessage locatedMessageActualError =
-          e.message.withLocation(uri, fileOffset, noLength);
-
-      final List<LocatedMessage> contextMessages = <LocatedMessage>[
-        locatedMessageActualError
-      ];
-      if (e.context != null) contextMessages.addAll(e.context);
-      for (final TreeNode node in contextChain) {
-        if (node == e.node) continue;
-        final Uri uri = getFileUri(node);
-        final int fileOffset = getFileOffset(uri, node);
-        contextMessages.add(
-            messageConstEvalContext.withLocation(uri, fileOffset, noLength));
+      if (result is _AbortDueToInvalidExpressionConstant) {
+        InvalidExpression invalid = new InvalidExpression(result.message)
+          ..fileOffset = node.fileOffset;
+        errorReporter.reportInvalidExpression(invalid);
+        return new UnevaluatedConstant(invalid);
       }
-
-      {
-        final Uri uri = getFileUri(node);
-        final int fileOffset = getFileOffset(uri, node);
-        final LocatedMessage locatedMessage = messageConstEvalStartingPoint
-            .withLocation(uri, fileOffset, noLength);
-        errorReporter.report(locatedMessage, contextMessages);
-      }
-      return new UnevaluatedConstant(new InvalidExpression(e.message.message));
-    } on _AbortDueToInvalidExpression catch (e) {
-      InvalidExpression invalid = new InvalidExpression(e.message)
-        ..fileOffset = node.fileOffset;
-      errorReporter.reportInvalidExpression(invalid);
-      return new UnevaluatedConstant(invalid);
+      throw "Unexpected error constant";
     }
+    if (result is UnevaluatedConstant) {
+      if (errorOnUnevaluatedConstant) {
+        return createErrorConstant(node, messageConstEvalUnevaluated);
+      }
+      return new UnevaluatedConstant(
+          removeRedundantFileUriExpressions(result.expression));
+    }
+    return result;
   }
 
-  /// Report an error that has been detected during constant evaluation.
-  Null report(TreeNode node, Message message, {List<LocatedMessage> context}) {
-    throw new _AbortDueToError(node, message, context: context);
+  /// Create an error-constant indicating that an error has been detected during
+  /// constant evaluation.
+  AbortConstant createErrorConstant(TreeNode node, Message message,
+      {List<LocatedMessage> context}) {
+    return new _AbortDueToErrorConstant(node, message, context: context);
   }
 
-  /// Report a construct that should not occur inside a potentially constant
-  /// expression. It is assumed that an error has already been reported.
-  Null reportInvalid(TreeNode node, String message) {
-    throw new _AbortDueToInvalidExpression(node, message);
+  /// Create an error-constant indicating a construct that should not occur
+  /// inside a potentially constant expression.
+  /// It is assumed that an error has already been reported.
+  AbortConstant createInvalidExpressionConstant(TreeNode node, String message) {
+    return new _AbortDueToInvalidExpressionConstant(node, message);
   }
 
   /// Produce an unevaluated constant node for an expression.
@@ -1005,8 +1015,12 @@
   }
 
   /// Evaluate [node] and possibly cache the evaluation result.
-  /// @throws _AbortDueToError or _AbortDueToInvalidExpression if expression
-  /// can't be evaluated.
+  ///
+  /// Returns [_AbortDueToErrorConstant] or
+  /// [_AbortDueToInvalidExpressionConstant] (both of which is an
+  /// [AbortConstant]) if the expression can't be evaluated.
+  /// As such the return value should be checked (e.g. `is AbortConstant`)
+  /// before further use.
   Constant _evaluateSubexpression(Expression node) {
     bool wasUnevaluated = seenUnevaluatedChild;
     seenUnevaluatedChild = false;
@@ -1015,18 +1029,27 @@
       // We only try to evaluate the same [node] *once* within an empty
       // environment.
       if (nodeCache.containsKey(node)) {
-        result = nodeCache[node] ?? report(node, messageConstEvalCircularity);
+        result = nodeCache[node];
+        if (result == null) {
+          // [null] is a sentinel value only used when still evaluating the same
+          // node.
+          return createErrorConstant(node, messageConstEvalCircularity);
+        }
       } else {
         nodeCache[node] = null;
-        try {
-          result = nodeCache[node] = node.accept(this);
-        } catch (e) {
+        result = node.accept(this);
+        if (result is AbortConstant) {
           nodeCache.remove(node);
-          rethrow;
+          return result;
+        } else {
+          nodeCache[node] = result;
         }
       }
     } else {
       result = node.accept(this);
+      if (result is AbortConstant) {
+        return result;
+      }
     }
     seenUnevaluatedChild = wasUnevaluated || result is UnevaluatedConstant;
     return result;
@@ -1067,7 +1090,7 @@
   Constant defaultTreeNode(Node node) {
     // Only a subset of the expression language is valid for constant
     // evaluation.
-    return reportInvalid(
+    return createInvalidExpressionConstant(
         node, 'Constant evaluation has no support for ${node.runtimeType}!');
   }
 
@@ -1103,7 +1126,14 @@
 
   @override
   Constant visitTypeLiteral(TypeLiteral node) {
-    final DartType type = evaluateDartType(node, node.type);
+    final DartType type = _evaluateDartType(node, node.type);
+    if (type == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(type != null);
     return canonicalize(new TypeLiteralConstant(type));
   }
 
@@ -1115,6 +1145,7 @@
       result = runInsideContext(constant.expression, () {
         return _evaluateSubexpression(constant.expression);
       });
+      if (result is AbortConstant) return result;
     }
     // If there were already constants in the AST then we make sure we
     // re-canonicalize them.  After running the transformer we will therefore
@@ -1126,12 +1157,13 @@
   @override
   Constant visitListLiteral(ListLiteral node) {
     if (!node.isConst) {
-      return reportInvalid(node, "Non-constant list literal");
+      return createInvalidExpressionConstant(node, "Non-constant list literal");
     }
     final ListConstantBuilder builder =
         new ListConstantBuilder(node, convertType(node.typeArgument), this);
     for (Expression element in node.expressions) {
-      builder.add(element);
+      AbortConstant error = builder.add(element);
+      if (error != null) return error;
     }
     return builder.build();
   }
@@ -1141,7 +1173,8 @@
     final ListConstantBuilder builder =
         new ListConstantBuilder(node, convertType(node.typeArgument), this);
     for (Expression list in node.lists) {
-      builder.addSpread(list);
+      AbortConstant error = builder.addSpread(list);
+      if (error != null) return error;
     }
     return builder.build();
   }
@@ -1149,12 +1182,13 @@
   @override
   Constant visitSetLiteral(SetLiteral node) {
     if (!node.isConst) {
-      return reportInvalid(node, "Non-constant set literal");
+      return createInvalidExpressionConstant(node, "Non-constant set literal");
     }
     final SetConstantBuilder builder =
         new SetConstantBuilder(node, convertType(node.typeArgument), this);
     for (Expression element in node.expressions) {
-      builder.add(element);
+      AbortConstant error = builder.add(element);
+      if (error != null) return error;
     }
     return builder.build();
   }
@@ -1164,7 +1198,8 @@
     final SetConstantBuilder builder =
         new SetConstantBuilder(node, convertType(node.typeArgument), this);
     for (Expression set_ in node.sets) {
-      builder.addSpread(set_);
+      AbortConstant error = builder.addSpread(set_);
+      if (error != null) return error;
     }
     return builder.build();
   }
@@ -1172,12 +1207,13 @@
   @override
   Constant visitMapLiteral(MapLiteral node) {
     if (!node.isConst) {
-      return reportInvalid(node, "Non-constant map literal");
+      return createInvalidExpressionConstant(node, "Non-constant map literal");
     }
     final MapConstantBuilder builder = new MapConstantBuilder(
         node, convertType(node.keyType), convertType(node.valueType), this);
     for (MapEntry element in node.entries) {
-      builder.add(element);
+      AbortConstant error = builder.add(element);
+      if (error != null) return error;
     }
     return builder.build();
   }
@@ -1187,35 +1223,53 @@
     final MapConstantBuilder builder = new MapConstantBuilder(
         node, convertType(node.keyType), convertType(node.valueType), this);
     for (Expression map in node.maps) {
-      builder.addSpread(map);
+      AbortConstant error = builder.addSpread(map);
+      if (error != null) return error;
     }
     return builder.build();
   }
 
   @override
   Constant visitFunctionExpression(FunctionExpression node) {
-    return reportInvalid(node, "Function literal");
+    return createInvalidExpressionConstant(node, "Function literal");
   }
 
   @override
   Constant visitConstructorInvocation(ConstructorInvocation node) {
     if (!node.isConst) {
-      return reportInvalid(
+      return createInvalidExpressionConstant(
           node, 'Non-constant constructor invocation "$node".');
     }
 
     final Constructor constructor = node.target;
-    checkConstructorConst(node, constructor);
+    AbortConstant error = checkConstructorConst(node, constructor);
+    if (error != null) return error;
 
     final Class klass = constructor.enclosingClass;
     if (klass.isAbstract) {
-      return reportInvalid(
+      // Probably unreachable.
+      return createInvalidExpressionConstant(
           node, 'Constructor "$node" belongs to abstract class "${klass}".');
     }
 
     final List<Constant> positionals =
-        evaluatePositionalArguments(node.arguments);
-    final Map<String, Constant> named = evaluateNamedArguments(node.arguments);
+        _evaluatePositionalArguments(node.arguments);
+    if (positionals == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(positionals != null);
+
+    final Map<String, Constant> named = _evaluateNamedArguments(node.arguments);
+    if (named == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(named != null);
 
     bool isSymbol = klass == coreTypes.internalSymbolClass;
     if (isSymbol && shouldBeUnevaluated) {
@@ -1234,17 +1288,26 @@
       if (nameValue is StringConstant && isValidSymbolName(nameValue.value)) {
         return canonicalize(new SymbolConstant(nameValue.value, null));
       }
-      return report(
+      return createErrorConstant(
           node.arguments.positional.first,
           templateConstEvalInvalidSymbolName.withArguments(
               nameValue, isNonNullableByDefault));
     }
 
-    final List<DartType> typeArguments =
-        convertTypes(evaluateTypeArguments(node, node.arguments));
+    List<DartType> types = _evaluateTypeArguments(node, node.arguments);
+    if (types == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(types != null);
+
+    final List<DartType> typeArguments = convertTypes(types);
 
     // Fill in any missing type arguments with "dynamic".
     for (int i = typeArguments.length; i < klass.typeParameters.length; i++) {
+      // Probably unreachable.
       typeArguments.add(const DynamicType());
     }
 
@@ -1255,13 +1318,15 @@
         // initialize the fields of the new instance.
         if (shouldBeUnevaluated) {
           enterLazy();
-          handleConstructorInvocation(
+          AbortConstant error = handleConstructorInvocation(
               constructor, typeArguments, positionals, named);
+          if (error != null) return error;
           leaveLazy();
           return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
         }
-        handleConstructorInvocation(
+        AbortConstant error = handleConstructorInvocation(
             constructor, typeArguments, positionals, named);
+        if (error != null) return error;
         if (shouldBeUnevaluated) {
           return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
         }
@@ -1270,17 +1335,22 @@
     });
   }
 
-  void checkConstructorConst(TreeNode node, Constructor constructor) {
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant checkConstructorConst(TreeNode node, Constructor constructor) {
     if (!constructor.isConst) {
-      reportInvalid(node, 'Non-const constructor invocation.');
+      return createInvalidExpressionConstant(
+          node, 'Non-const constructor invocation.');
     }
     if (constructor.function.body != null &&
         constructor.function.body is! EmptyStatement) {
-      reportInvalid(
+      // Probably unreachable.
+      return createInvalidExpressionConstant(
           node,
           'Constructor "$node" has non-trivial body '
           '"${constructor.function.body.runtimeType}".');
     }
+    return null;
   }
 
   @override
@@ -1288,21 +1358,36 @@
     return withNewInstanceBuilder(
         node.classNode, convertTypes(node.typeArguments), () {
       for (AssertStatement statement in node.asserts) {
-        checkAssert(statement);
+        AbortConstant error = checkAssert(statement);
+        if (error != null) return error;
       }
+      AbortConstant error;
       node.fieldValues.forEach((Reference fieldRef, Expression value) {
-        instanceBuilder.setFieldValue(
-            fieldRef.asField, _evaluateSubexpression(value));
-      });
-      node.unusedArguments.forEach((Expression value) {
+        if (error != null) return;
         Constant constant = _evaluateSubexpression(value);
+        if (constant is AbortConstant) {
+          error ??= constant;
+          return;
+        }
+        instanceBuilder.setFieldValue(fieldRef.asField, constant);
+      });
+      if (error != null) return error;
+      node.unusedArguments.forEach((Expression value) {
+        if (error != null) return;
+        Constant constant = _evaluateSubexpression(value);
+        if (constant is AbortConstant) {
+          error ??= constant;
+          return;
+        }
         if (constant is UnevaluatedConstant) {
           instanceBuilder.unusedArguments.add(extract(constant));
         }
       });
+      if (error != null) return error;
       if (shouldBeUnevaluated) {
         return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
       }
+      // We can get here when re-evaluating a previously unevaluated constant.
       return canonicalize(instanceBuilder.buildInstance());
     });
   }
@@ -1432,7 +1517,9 @@
         !nonUsableKeywords.contains(name);
   }
 
-  void handleConstructorInvocation(
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant handleConstructorInvocation(
       Constructor constructor,
       List<DartType> typeArguments,
       List<Constant> positionalArguments,
@@ -1456,12 +1543,14 @@
               ? positionalArguments[i]
               // TODO(johnniwinther): This should call [_evaluateSubexpression].
               : _evaluateNullableSubexpression(parameter.initializer);
+          if (value is AbortConstant) return value;
           env.addVariableValue(parameter, value);
         }
         for (final VariableDeclaration parameter in function.namedParameters) {
           final Constant value = namedArguments[parameter.name] ??
               // TODO(johnniwinther): This should call [_evaluateSubexpression].
               _evaluateNullableSubexpression(parameter.initializer);
+          if (value is AbortConstant) return value;
           env.addVariableValue(parameter, value);
         }
 
@@ -1469,39 +1558,95 @@
         //         setup.
         for (final Field field in klass.fields) {
           if (!field.isStatic) {
-            instanceBuilder.setFieldValue(
-                field, _evaluateNullableSubexpression(field.initializer));
+            Constant constant =
+                _evaluateNullableSubexpression(field.initializer);
+            if (constant is AbortConstant) return constant;
+            instanceBuilder.setFieldValue(field, constant);
           }
         }
         for (final Initializer init in constructor.initializers) {
           if (init is FieldInitializer) {
-            instanceBuilder.setFieldValue(
-                init.field, _evaluateSubexpression(init.value));
+            Constant constant = _evaluateSubexpression(init.value);
+            if (constant is AbortConstant) return constant;
+            instanceBuilder.setFieldValue(init.field, constant);
           } else if (init is LocalInitializer) {
             final VariableDeclaration variable = init.variable;
-            env.addVariableValue(
-                variable, _evaluateSubexpression(variable.initializer));
+            Constant constant = _evaluateSubexpression(variable.initializer);
+            if (constant is AbortConstant) return constant;
+            env.addVariableValue(variable, constant);
           } else if (init is SuperInitializer) {
-            checkConstructorConst(init, constructor);
-            handleConstructorInvocation(
-                init.target,
-                evaluateSuperTypeArguments(
-                    init, constructor.enclosingClass.supertype),
-                evaluatePositionalArguments(init.arguments),
-                evaluateNamedArguments(init.arguments));
+            AbortConstant error = checkConstructorConst(init, constructor);
+            if (error != null) return error;
+            List<DartType> types = _evaluateSuperTypeArguments(
+                init, constructor.enclosingClass.supertype);
+            if (types == null && _gotError != null) {
+              AbortConstant error = _gotError;
+              _gotError = null;
+              return error;
+            }
+            assert(_gotError == null);
+            assert(types != null);
+
+            List<Constant> positionalArguments =
+                _evaluatePositionalArguments(init.arguments);
+            if (positionalArguments == null && _gotError != null) {
+              AbortConstant error = _gotError;
+              _gotError = null;
+              return error;
+            }
+            assert(_gotError == null);
+            assert(positionalArguments != null);
+            Map<String, Constant> namedArguments =
+                _evaluateNamedArguments(init.arguments);
+            if (namedArguments == null && _gotError != null) {
+              AbortConstant error = _gotError;
+              _gotError = null;
+              return error;
+            }
+            assert(_gotError == null);
+            assert(namedArguments != null);
+            error = handleConstructorInvocation(
+                init.target, types, positionalArguments, namedArguments);
+            if (error != null) return error;
           } else if (init is RedirectingInitializer) {
             // Since a redirecting constructor targets a constructor of the same
             // class, we pass the same [typeArguments].
-            checkConstructorConst(init, constructor);
-            handleConstructorInvocation(
-                init.target,
-                typeArguments,
-                evaluatePositionalArguments(init.arguments),
-                evaluateNamedArguments(init.arguments));
+            AbortConstant error = checkConstructorConst(init, constructor);
+            if (error != null) return error;
+            List<Constant> positionalArguments =
+                _evaluatePositionalArguments(init.arguments);
+            if (positionalArguments == null && _gotError != null) {
+              AbortConstant error = _gotError;
+              _gotError = null;
+              return error;
+            }
+            assert(_gotError == null);
+            assert(positionalArguments != null);
+
+            Map<String, Constant> namedArguments =
+                _evaluateNamedArguments(init.arguments);
+            if (namedArguments == null && _gotError != null) {
+              AbortConstant error = _gotError;
+              _gotError = null;
+              return error;
+            }
+            assert(_gotError == null);
+            assert(namedArguments != null);
+
+            error = handleConstructorInvocation(init.target, typeArguments,
+                positionalArguments, namedArguments);
+            if (error != null) return error;
           } else if (init is AssertInitializer) {
-            checkAssert(init.statement);
+            AbortConstant error = checkAssert(init.statement);
+            if (error != null) return error;
           } else {
-            return reportInvalid(
+            // InvalidInitializer or new Initializers.
+            // Probably unreachable. InvalidInitializer is (currently) only
+            // created for classes with no constructors that doesn't have a
+            // super that takes no arguments. It thus cannot be const.
+            // Explicit constructors with incorrect super calls will get a
+            // ShadowInvalidInitializer which is actually a LocalInitializer.
+            return createInvalidExpressionConstant(
                 constructor,
                 'No support for handling initializer of type '
                 '"${init.runtimeType}".');
@@ -1511,18 +1656,24 @@
         for (UnevaluatedConstant constant in env.unevaluatedUnreadConstants) {
           instanceBuilder.unusedArguments.add(extract(constant));
         }
+        return null;
       });
     });
   }
 
-  void checkAssert(AssertStatement statement) {
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant checkAssert(AssertStatement statement) {
     final Constant condition = _evaluateSubexpression(statement.condition);
+    if (condition is AbortConstant) return condition;
 
     if (shouldBeUnevaluated) {
       Expression message = null;
       if (statement.message != null) {
         enterLazy();
-        message = extract(_evaluateSubexpression(statement.message));
+        Constant constant = _evaluateSubexpression(statement.message);
+        if (constant is AbortConstant) return constant;
+        message = extract(constant);
         leaveLazy();
       }
       instanceBuilder.asserts.add(new AssertStatement(extract(condition),
@@ -1532,21 +1683,23 @@
     } else if (condition is BoolConstant) {
       if (!condition.value) {
         if (statement.message == null) {
-          report(statement.condition, messageConstEvalFailedAssertion);
+          return createErrorConstant(
+              statement.condition, messageConstEvalFailedAssertion);
         }
         final Constant message = _evaluateSubexpression(statement.message);
+        if (message is AbortConstant) return message;
         if (shouldBeUnevaluated) {
           instanceBuilder.asserts.add(new AssertStatement(extract(condition),
               message: extract(message),
               conditionStartOffset: statement.conditionStartOffset,
               conditionEndOffset: statement.conditionEndOffset));
         } else if (message is StringConstant) {
-          report(
+          return createErrorConstant(
               statement.condition,
               templateConstEvalFailedAssertionWithMessage
                   .withArguments(message.value));
         } else {
-          report(
+          return createErrorConstant(
               statement.message,
               templateConstEvalInvalidType.withArguments(
                   message,
@@ -1556,7 +1709,7 @@
         }
       }
     } else {
-      report(
+      return createErrorConstant(
           statement.condition,
           templateConstEvalInvalidType.withArguments(
               condition,
@@ -1564,21 +1717,34 @@
               condition.getType(_staticTypeContext),
               isNonNullableByDefault));
     }
+
+    return null;
   }
 
   @override
   Constant visitInvalidExpression(InvalidExpression node) {
-    return reportInvalid(node, node.message);
+    return createInvalidExpressionConstant(node, node.message);
   }
 
   @override
   Constant visitMethodInvocation(MethodInvocation node) {
     // We have no support for generic method invocation atm.
-    assert(node.arguments.named.isEmpty);
+    if (node.arguments.named.isNotEmpty) {
+      return createInvalidExpressionConstant(node, "generic method invocation");
+    }
 
     final Constant receiver = _evaluateSubexpression(node.receiver);
+    if (receiver is AbortConstant) return receiver;
     final List<Constant> arguments =
-        evaluatePositionalArguments(node.arguments);
+        _evaluatePositionalArguments(node.arguments);
+
+    if (arguments == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(arguments != null);
 
     if (shouldBeUnevaluated) {
       return unevaluated(
@@ -1605,7 +1771,7 @@
         return doubleSpecialCases(receiver, right) ??
             makeBoolConstant(receiver == right);
       } else {
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidEqualsOperandType.withArguments(receiver,
                 receiver.getType(_staticTypeContext), isNonNullableByDefault));
@@ -1622,7 +1788,7 @@
               return canonicalize(
                   new StringConstant(receiver.value + other.value));
             }
-            return report(
+            return createErrorConstant(
                 node,
                 templateConstEvalInvalidBinaryOperandType.withArguments(
                     '+',
@@ -1643,7 +1809,7 @@
         } else if (other is DoubleConstant) {
           if ((op == '|' || op == '&' || op == '^') ||
               (op == '<<' || op == '>>' || op == '>>>')) {
-            return report(
+            return createErrorConstant(
                 node,
                 templateConstEvalInvalidBinaryOperandType.withArguments(
                     op,
@@ -1656,7 +1822,7 @@
           return canonicalize(evaluateBinaryNumericOperation(
               op, receiverValue, other.value, node));
         }
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidBinaryOperandType.withArguments(
                 op,
@@ -1668,7 +1834,7 @@
     } else if (receiver is DoubleConstant) {
       if ((op == '|' || op == '&' || op == '^') ||
           (op == '<<' || op == '>>' || op == '>>>')) {
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidBinaryOperandType.withArguments(
                 op,
@@ -1690,7 +1856,7 @@
           return canonicalize(
               evaluateBinaryNumericOperation(op, receiver.value, value, node));
         }
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidBinaryOperandType.withArguments(
                 op,
@@ -1717,10 +1883,10 @@
         }
       }
     } else if (receiver is NullConstant) {
-      return report(node, messageConstEvalNullValue);
+      return createErrorConstant(node, messageConstEvalNullValue);
     }
 
-    return report(
+    return createErrorConstant(
         node,
         templateConstEvalInvalidMethodInvocation.withArguments(
             op, receiver, isNonNullableByDefault));
@@ -1729,9 +1895,11 @@
   @override
   Constant visitLogicalExpression(LogicalExpression node) {
     final Constant left = _evaluateSubexpression(node.left);
+    if (left is AbortConstant) return left;
     if (shouldBeUnevaluated) {
       enterLazy();
       Constant right = _evaluateSubexpression(node.right);
+      if (right is AbortConstant) return right;
       leaveLazy();
       return unevaluated(node,
           new LogicalExpression(extract(left), node.operator, extract(right)));
@@ -1742,11 +1910,12 @@
           if (left.value) return trueConstant;
 
           final Constant right = _evaluateSubexpression(node.right);
+          if (right is AbortConstant) return right;
           if (right is BoolConstant || right is UnevaluatedConstant) {
             return right;
           }
 
-          return report(
+          return createErrorConstant(
               node,
               templateConstEvalInvalidBinaryOperandType.withArguments(
                   node.operator,
@@ -1755,7 +1924,7 @@
                   right.getType(_staticTypeContext),
                   isNonNullableByDefault));
         }
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidMethodInvocation.withArguments(
                 node.operator, left, isNonNullableByDefault));
@@ -1764,11 +1933,12 @@
           if (!left.value) return falseConstant;
 
           final Constant right = _evaluateSubexpression(node.right);
+          if (right is AbortConstant) return right;
           if (right is BoolConstant || right is UnevaluatedConstant) {
             return right;
           }
 
-          return report(
+          return createErrorConstant(
               node,
               templateConstEvalInvalidBinaryOperandType.withArguments(
                   node.operator,
@@ -1777,16 +1947,18 @@
                   right.getType(_staticTypeContext),
                   isNonNullableByDefault));
         }
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidMethodInvocation.withArguments(
                 node.operator, left, isNonNullableByDefault));
       case '??':
+        // Unreachable. LogicalExpression never created with `??`.
         return (left is! NullConstant)
             ? left
             : _evaluateSubexpression(node.right);
       default:
-        return report(
+        // Probably unreachable.
+        return createErrorConstant(
             node,
             templateConstEvalInvalidMethodInvocation.withArguments(
                 node.operator, left, isNonNullableByDefault));
@@ -1796,6 +1968,7 @@
   @override
   Constant visitConditionalExpression(ConditionalExpression node) {
     final Constant condition = _evaluateSubexpression(node.condition);
+    if (condition is AbortConstant) return condition;
     if (condition == trueConstant) {
       return _evaluateSubexpression(node.then);
     } else if (condition == falseConstant) {
@@ -1803,14 +1976,16 @@
     } else if (shouldBeUnevaluated) {
       enterLazy();
       Constant then = _evaluateSubexpression(node.then);
+      if (then is AbortConstant) return then;
       Constant otherwise = _evaluateSubexpression(node.otherwise);
+      if (otherwise is AbortConstant) return otherwise;
       leaveLazy();
       return unevaluated(
           node,
           new ConditionalExpression(extract(condition), extract(then),
               extract(otherwise), node.staticType));
     } else {
-      return report(
+      return createErrorConstant(
           node.condition,
           templateConstEvalInvalidType.withArguments(
               condition,
@@ -1823,29 +1998,37 @@
   @override
   Constant visitPropertyGet(PropertyGet node) {
     if (node.receiver is ThisExpression) {
+      // Probably unreachable unless trying to evaluate non-const stuff as
+      // const.
       // Access "this" during instance creation.
       if (instanceBuilder == null) {
-        return report(node, messageNotAConstantExpression);
+        return createErrorConstant(node, messageNotAConstantExpression);
       }
+
       for (final Field field in instanceBuilder.fields.keys) {
         if (field.name == node.name) {
           return instanceBuilder.fields[field];
         }
       }
-      return reportInvalid(node,
+
+      // Meant as a "stable backstop for situations where Fasta fails to
+      // rewrite various erroneous constructs into invalid expressions".
+      // Probably unreachable.
+      return createInvalidExpressionConstant(node,
           'Could not evaluate field get ${node.name} on incomplete instance');
     }
 
     final Constant receiver = _evaluateSubexpression(node.receiver);
+    if (receiver is AbortConstant) return receiver;
     if (receiver is StringConstant && node.name.text == 'length') {
       return canonicalize(intFolder.makeIntConstant(receiver.value.length));
     } else if (shouldBeUnevaluated) {
       return unevaluated(node,
           new PropertyGet(extract(receiver), node.name, node.interfaceTarget));
     } else if (receiver is NullConstant) {
-      return report(node, messageConstEvalNullValue);
+      return createErrorConstant(node, messageConstEvalNullValue);
     }
-    return report(
+    return createErrorConstant(
         node,
         templateConstEvalInvalidPropertyGet.withArguments(
             node.name.text, receiver, isNonNullableByDefault));
@@ -1853,8 +2036,9 @@
 
   @override
   Constant visitLet(Let node) {
-    env.addVariableValue(
-        node.variable, _evaluateSubexpression(node.variable.initializer));
+    Constant value = _evaluateSubexpression(node.variable.initializer);
+    if (value is AbortConstant) return value;
+    env.addVariableValue(node.variable, value);
     return _evaluateSubexpression(node.body);
   }
 
@@ -1869,7 +2053,7 @@
     final VariableDeclaration variable = node.variable;
     if (variable.parent is Let || _isFormalParameter(variable)) {
       return env.lookupVariable(node.variable) ??
-          report(
+          createErrorConstant(
               node,
               templateConstEvalNonConstantVariableGet
                   .withArguments(variable.name));
@@ -1877,7 +2061,8 @@
     if (variable.isConst) {
       return _evaluateSubexpression(variable.initializer);
     }
-    return reportInvalid(node, 'Variable get of a non-const variable.');
+    return createInvalidExpressionConstant(
+        node, 'Variable get of a non-const variable.');
   }
 
   /// Computes the constant for [expression] defined in the context of [member].
@@ -1890,6 +2075,7 @@
     _staticTypeContext = new StaticTypeContext(member, typeEnvironment);
     Constant constant = runInsideContext(member, () {
       Constant constant = _evaluateSubexpression(expression);
+      if (constant is AbortConstant) return constant;
       if (_staticTypeContext.nonNullableByDefaultCompiledMode ==
               NonNullableByDefaultCompiledMode.Agnostic &&
           evaluationMode == EvaluationMode.weak) {
@@ -1909,7 +2095,7 @@
         if (target.isConst) {
           return _evaluateExpressionInContext(target, target.initializer);
         }
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidStaticInvocation
                 .withArguments(target.name.text));
@@ -1917,14 +2103,13 @@
         if (target.kind == ProcedureKind.Method) {
           return canonicalize(new TearOffConstant(target));
         }
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidStaticInvocation
                 .withArguments(target.name.text));
       } else {
-        reportInvalid(
+        return createInvalidExpressionConstant(
             node, 'No support for ${target.runtimeType} in a static-get.');
-        return null;
       }
     });
   }
@@ -1934,6 +2119,7 @@
     final List<Object> concatenated = <Object>[new StringBuffer()];
     for (int i = 0; i < node.expressions.length; i++) {
       Constant constant = _evaluateSubexpression(node.expressions[i]);
+      if (constant is AbortConstant) return constant;
       if (constant is PrimitiveConstant<Object>) {
         String value;
         if (constant is DoubleConstant && intFolder.isInt(constant)) {
@@ -1953,7 +2139,7 @@
         // error reporting till later.
         concatenated.add(constant);
       } else {
-        return report(
+        return createErrorConstant(
             node,
             templateConstEvalInvalidStringInterpolationOperand.withArguments(
                 constant, isNonNullableByDefault));
@@ -1983,7 +2169,10 @@
         .singleWhere((v) => v.name == 'defaultValue');
     return variable.initializer != null
         ? _evaluateExpressionInContext(target, variable.initializer)
-        : nullConstant;
+        :
+        // Not reachable unless a defaultValue in fromEnvironment in dart:core
+        // becomes null.
+        nullConstant;
   }
 
   Constant _handleFromEnvironment(
@@ -2002,6 +2191,7 @@
         } else if (defaultValue is NullConstant) {
           boolConstant = nullConstant;
         } else {
+          // Probably unreachable.
           boolConstant = falseConstant;
         }
       } else {
@@ -2039,6 +2229,8 @@
       }
       return stringConstant;
     }
+    // Unreachable until fromEnvironment is added to other classes in dart:core
+    // than bool, int and String.
     throw new UnsupportedError(
         'Unexpected fromEnvironment constructor: $target');
   }
@@ -2053,8 +2245,24 @@
   Constant visitStaticInvocation(StaticInvocation node) {
     final Procedure target = node.target;
     final Arguments arguments = node.arguments;
-    final List<Constant> positionals = evaluatePositionalArguments(arguments);
-    final Map<String, Constant> named = evaluateNamedArguments(arguments);
+    final List<Constant> positionals = _evaluatePositionalArguments(arguments);
+    if (positionals == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(positionals != null);
+
+    final Map<String, Constant> named = _evaluateNamedArguments(arguments);
+    if (named == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(named != null);
+
     if (shouldBeUnevaluated) {
       return unevaluated(
           node,
@@ -2078,7 +2286,7 @@
               return _handleHasEnvironment(name);
             }
           } else if (name is NullConstant) {
-            return report(node, messageConstEvalNullValue);
+            return createErrorConstant(node, messageConstEvalNullValue);
           }
         } else {
           // Leave environment constant unevaluated.
@@ -2107,7 +2315,7 @@
               Constant weakResult = makeBoolConstant(
                   identical(weakLeft ?? left, weakRight ?? right));
               if (!identical(result, weakResult)) {
-                report(node, messageNonAgnosticConstant);
+                return createErrorConstant(node, messageNonAgnosticConstant);
               }
             }
           }
@@ -2122,7 +2330,7 @@
         return evaluateIdentical();
       }
     } else if (target.isExtensionMember) {
-      return report(node, messageConstEvalExtension);
+      return createErrorConstant(node, messageConstEvalExtension);
     }
 
     String name = target.name.text;
@@ -2133,12 +2341,13 @@
         name = '${target.enclosingClass.name}.${name}';
       }
     }
-    return reportInvalid(node, "Invocation of $name");
+    return createInvalidExpressionConstant(node, "Invocation of $name");
   }
 
   @override
   Constant visitAsExpression(AsExpression node) {
     final Constant constant = _evaluateSubexpression(node.operand);
+    if (constant is AbortConstant) return constant;
     if (shouldBeUnevaluated) {
       return unevaluated(
           node,
@@ -2146,12 +2355,23 @@
             ..isForNonNullableByDefault =
                 _staticTypeContext.isNonNullableByDefault);
     }
-    return ensureIsSubtype(constant, evaluateDartType(node, node.type), node);
+    DartType type = _evaluateDartType(node, node.type);
+    if (type == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(type != null);
+    return ensureIsSubtype(constant, type, node);
   }
 
   @override
   Constant visitIsExpression(IsExpression node) {
+    // TODO(jensj): Why does this call .accept directly?
+    // (@askesc says it's probably an oversight)
     final Constant constant = node.operand.accept(this);
+    if (constant is AbortConstant) return constant;
     if (shouldBeUnevaluated) {
       return unevaluated(
           node,
@@ -2160,7 +2380,14 @@
             ..flags = node.flags);
     }
 
-    DartType type = evaluateDartType(node, node.type);
+    DartType type = _evaluateDartType(node, node.type);
+    if (type == null && _gotError != null) {
+      AbortConstant error = _gotError;
+      _gotError = null;
+      return error;
+    }
+    assert(_gotError == null);
+    assert(type != null);
 
     bool performIs(Constant constant, {bool strongMode}) {
       assert(strongMode != null);
@@ -2174,6 +2401,7 @@
         //    Otherwise return NNBD_SUBTYPE(S, T)
         if (constant is NullConstant &&
             type.nullability == Nullability.legacy) {
+          // Unreachable: Mixed strong mode is no longer supported.
           return typeEnvironment.isSubtypeOf(type, typeEnvironment.nullType,
                   SubtypeCheckMode.ignoringNullabilities) ||
               typeEnvironment.isSubtypeOf(typeEnvironment.objectLegacyRawType,
@@ -2215,7 +2443,7 @@
         Constant weakConstant = _weakener.visitConstant(constant) ?? constant;
         bool weakResult = performIs(weakConstant, strongMode: false);
         if (strongResult != weakResult) {
-          return report(node, messageNonAgnosticConstant);
+          return createErrorConstant(node, messageNonAgnosticConstant);
         }
         return makeBoolConstant(strongResult);
       case EvaluationMode.weak:
@@ -2227,13 +2455,14 @@
   @override
   Constant visitNot(Not node) {
     final Constant constant = _evaluateSubexpression(node.operand);
+    if (constant is AbortConstant) return constant;
     if (constant is BoolConstant) {
       return makeBoolConstant(constant != trueConstant);
     }
     if (shouldBeUnevaluated) {
       return unevaluated(node, new Not(extract(constant)));
     }
-    return report(
+    return createErrorConstant(
         node,
         templateConstEvalInvalidType.withArguments(
             constant,
@@ -2245,8 +2474,9 @@
   @override
   Constant visitNullCheck(NullCheck node) {
     final Constant constant = _evaluateSubexpression(node.operand);
+    if (constant is AbortConstant) return constant;
     if (constant is NullConstant) {
-      return report(node, messageConstEvalNonNull);
+      return createErrorConstant(node, messageConstEvalNonNull);
     }
     if (shouldBeUnevaluated) {
       return unevaluated(node, new NullCheck(extract(constant)));
@@ -2264,6 +2494,7 @@
   @override
   Constant visitInstantiation(Instantiation node) {
     final Constant constant = _evaluateSubexpression(node.expression);
+    if (constant is AbortConstant) return constant;
     if (shouldBeUnevaluated) {
       return unevaluated(
           node,
@@ -2273,25 +2504,35 @@
     if (constant is TearOffConstant) {
       if (node.typeArguments.length ==
           constant.procedure.function.typeParameters.length) {
-        final List<DartType> typeArguments =
-            convertTypes(evaluateDartTypes(node, node.typeArguments));
+        List<DartType> types = _evaluateDartTypes(node, node.typeArguments);
+        if (types == null && _gotError != null) {
+          AbortConstant error = _gotError;
+          _gotError = null;
+          return error;
+        }
+        assert(_gotError == null);
+        assert(types != null);
+
+        final List<DartType> typeArguments = convertTypes(types);
         return canonicalize(
             new PartialInstantiationConstant(constant, typeArguments));
       }
-      return reportInvalid(
+      // Probably unreachable.
+      return createInvalidExpressionConstant(
           node,
           'The number of type arguments supplied in the partial instantiation '
           'does not match the number of type arguments of the $constant.');
     }
     // The inner expression in an instantiation can never be null, since
     // instantiations are only inferred on direct references to declarations.
-    return reportInvalid(
+    // Probably unreachable.
+    return createInvalidExpressionConstant(
         node, 'Only tear-off constants can be partially instantiated.');
   }
 
   @override
   Constant visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
-    return report(
+    return createErrorConstant(
         node, templateConstEvalDeferredLibrary.withArguments(node.import.name));
   }
 
@@ -2347,6 +2588,7 @@
     if (targetingJavaScript && !result) {
       if (constantType is InterfaceType &&
           constantType.classNode == typeEnvironment.coreTypes.intClass) {
+        // Probably unreachable.
         // With JS semantics, an integer is also a double.
         result = typeEnvironment.isSubtypeOf(
             new InterfaceType(typeEnvironment.coreTypes.doubleClass,
@@ -2365,6 +2607,8 @@
     return result;
   }
 
+  /// Note that this returns an error-constant on error and as such the
+  /// return value should be checked.
   Constant ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
     bool result;
     switch (evaluationMode) {
@@ -2378,7 +2622,7 @@
         bool weakResult = isSubtype(
             weakConstant, type, SubtypeCheckMode.ignoringNullabilities);
         if (strongResult != weakResult) {
-          return report(node, messageNonAgnosticConstant);
+          return createErrorConstant(node, messageNonAgnosticConstant);
         }
         result = strongResult;
         break;
@@ -2388,7 +2632,7 @@
         break;
     }
     if (!result) {
-      return report(
+      return createErrorConstant(
           node,
           templateConstEvalInvalidType.withArguments(constant, type,
               constant.getType(_staticTypeContext), isNonNullableByDefault));
@@ -2396,47 +2640,93 @@
     return constant;
   }
 
-  List<DartType> evaluateTypeArguments(TreeNode node, Arguments arguments) {
-    return evaluateDartTypes(node, arguments.types);
+  /// Returns the types on success and null on failure.
+  /// Note that on failure an errorConstant is saved in [_gotError].
+  List<DartType> _evaluateTypeArguments(TreeNode node, Arguments arguments) {
+    return _evaluateDartTypes(node, arguments.types);
   }
 
-  List<DartType> evaluateSuperTypeArguments(TreeNode node, Supertype type) {
-    return evaluateDartTypes(node, type.typeArguments);
+  /// Returns the types on success and null on failure.
+  /// Note that on failure an errorConstant is saved in [_gotError].
+  List<DartType> _evaluateSuperTypeArguments(TreeNode node, Supertype type) {
+    return _evaluateDartTypes(node, type.typeArguments);
   }
 
-  List<DartType> evaluateDartTypes(TreeNode node, List<DartType> types) {
+  /// Upon failure in certain procedure calls (e.g. [_evaluateDartTypes]) the
+  /// "error"-constant is saved here. Normally this should be null.
+  /// Once a caller calls such a procedure and it gives an error here,
+  /// the caller should fetch it an null-out this variable.
+  AbortConstant _gotError;
+
+  /// Returns the types on success and null on failure.
+  /// Note that on failure an errorConstant is saved in [_gotError].
+  List<DartType> _evaluateDartTypes(TreeNode node, List<DartType> types) {
     // TODO: Once the frontend guarantees that there are no free type variables
     // left over after substitution, we can enable this shortcut again:
     // if (env.isEmpty) return types;
-    return types.map((t) => evaluateDartType(node, t)).toList();
+    List<DartType> result =
+        new List<DartType>.filled(types.length, null, growable: true);
+    for (int i = 0; i < types.length; i++) {
+      DartType type = _evaluateDartType(node, types[i]);
+      if (type == null && _gotError != null) {
+        return null;
+      }
+      assert(_gotError == null);
+      assert(type != null);
+      result[i] = type;
+    }
+    return result;
   }
 
-  DartType evaluateDartType(TreeNode node, DartType type) {
+  /// Returns the type on success and null on failure.
+  /// Note that on failure an errorConstant is saved in [_gotError].
+  DartType _evaluateDartType(TreeNode node, DartType type) {
     final DartType result = env.substituteType(type);
 
     if (!isInstantiated(result)) {
-      return report(
+      _gotError = createErrorConstant(
           node,
           templateConstEvalFreeTypeParameter.withArguments(
               type, isNonNullableByDefault));
+      return null;
     }
 
     return result;
   }
 
-  List<Constant> evaluatePositionalArguments(Arguments arguments) {
-    return arguments.positional.map((Expression node) {
-      return _evaluateSubexpression(node);
-    }).toList();
+  /// Returns the types on success and null on failure.
+  /// Note that on failure an errorConstant is saved in [_gotError].
+  List<Constant> _evaluatePositionalArguments(Arguments arguments) {
+    List<Constant> result = new List<Constant>.filled(
+        arguments.positional.length, null,
+        growable: true);
+    for (int i = 0; i < arguments.positional.length; i++) {
+      Constant constant = _evaluateSubexpression(arguments.positional[i]);
+      if (constant is AbortConstant) {
+        _gotError = constant;
+        return null;
+      }
+      result[i] = constant;
+    }
+    return result;
   }
 
-  Map<String, Constant> evaluateNamedArguments(Arguments arguments) {
+  /// Returns the arguments on success and null on failure.
+  /// Note that on failure an errorConstant is saved in [_gotError].
+  Map<String, Constant> _evaluateNamedArguments(Arguments arguments) {
     if (arguments.named.isEmpty) return const <String, Constant>{};
 
     final Map<String, Constant> named = {};
     arguments.named.forEach((NamedExpression pair) {
-      named[pair.name] = _evaluateSubexpression(pair.value);
+      if (_gotError != null) return null;
+      Constant constant = _evaluateSubexpression(pair.value);
+      if (constant is AbortConstant) {
+        _gotError = constant;
+        return null;
+      }
+      named[pair.name] = constant;
     });
+    if (_gotError != null) return null;
     return named;
   }
 
@@ -2495,7 +2785,7 @@
         return new DoubleConstant(a / b);
       case '~/':
         if (b == 0) {
-          return report(
+          return createErrorConstant(
               node, templateConstEvalZeroDivisor.withArguments(op, '$a'));
         }
         return intFolder.truncatingDivide(node, a, b);
@@ -2514,7 +2804,9 @@
         return makeBoolConstant(a > b);
     }
 
-    return reportInvalid(node, "Unexpected binary numeric operation '$op'.");
+    // Probably unreachable.
+    return createInvalidExpressionConstant(
+        node, "Unexpected binary numeric operation '$op'.");
   }
 
   Library libraryOf(TreeNode node) {
@@ -2651,20 +2943,121 @@
   }
 }
 
-// Used as control-flow to abort the current evaluation.
-class _AbortDueToError {
+abstract class AbortConstant implements Constant {}
+
+class _AbortDueToErrorConstant extends AbortConstant {
   final TreeNode node;
   final Message message;
   final List<LocatedMessage> context;
 
-  _AbortDueToError(this.node, this.message, {this.context});
+  _AbortDueToErrorConstant(this.node, this.message, {this.context});
+
+  @override
+  R accept<R>(ConstantVisitor<R> v) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  R acceptReference<R>(Visitor<R> v) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression asExpression() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  DartType getType(StaticTypeContext context) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String leakingDebugToString() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String toString() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String toStringInternal() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String toText(AstTextStrategy strategy) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  void visitChildren(Visitor<dynamic> v) {
+    throw new UnimplementedError();
+  }
 }
 
-class _AbortDueToInvalidExpression {
+class _AbortDueToInvalidExpressionConstant extends AbortConstant {
   final TreeNode node;
   final String message;
 
-  _AbortDueToInvalidExpression(this.node, this.message);
+  _AbortDueToInvalidExpressionConstant(this.node, this.message);
+
+  @override
+  R accept<R>(ConstantVisitor<R> v) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  R acceptReference<R>(Visitor<R> v) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression asExpression() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  DartType getType(StaticTypeContext context) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String leakingDebugToString() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String toString() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String toStringInternal() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  String toText(AstTextStrategy strategy) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  void visitChildren(Visitor<dynamic> v) {
+    throw new UnimplementedError();
+  }
 }
 
 abstract class ErrorReporter {
@@ -2710,6 +3103,7 @@
 
   @override
   bool defaultDartType(DartType node) {
+    // Probably unreachable.
     throw 'A visitor method seems to be unimplemented!';
   }
 
@@ -2754,6 +3148,7 @@
 
   @override
   bool visitTypedefType(TypedefType node) {
+    // Probably unreachable.
     return node.unalias.accept(this);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart b/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
index 337d61e..0d73f92 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_int_folder.dart
@@ -41,15 +41,19 @@
 
   Constant truncatingDivide(MethodInvocation node, num left, num right);
 
-  void _checkOperands(MethodInvocation node, String op, num left, num right) {
+  /// Returns [null] on success and an error-"constant" on failure, as such the
+  /// return value should be checked.
+  AbortConstant _checkOperands(
+      MethodInvocation node, String op, num left, num right) {
     if ((op == '<<' || op == '>>' || op == '>>>') && right < 0) {
-      evaluator.report(node,
+      return evaluator.createErrorConstant(node,
           templateConstEvalNegativeShift.withArguments(op, '$left', '$right'));
     }
     if ((op == '%' || op == '~/') && right == 0) {
-      evaluator.report(
+      return evaluator.createErrorConstant(
           node, templateConstEvalZeroDivisor.withArguments(op, '$left'));
     }
+    return null;
   }
 }
 
@@ -73,7 +77,9 @@
       case '~':
         return new IntConstant(~operand.value);
       default:
-        return evaluator.reportInvalid(node, "Invalid unary operator $op");
+        // Probably unreachable.
+        return evaluator.createInvalidExpressionConstant(
+            node, "Invalid unary operator $op");
     }
   }
 
@@ -82,7 +88,8 @@
       MethodInvocation node, String op, IntConstant left, IntConstant right) {
     int a = left.value;
     int b = right.value;
-    _checkOperands(node, op, a, b);
+    AbortConstant error = _checkOperands(node, op, a, b);
+    if (error != null) return error;
     switch (op) {
       case '+':
         return new IntConstant(a + b);
@@ -107,6 +114,7 @@
       case '>>':
         return new IntConstant(a >> b);
       case '>>>':
+        // Currently unreachable as int hasn't defined '>>>'.
         int result = b >= 64 ? 0 : (a >> b) & ((1 << (64 - b)) - 1);
         return new IntConstant(result);
       case '<':
@@ -118,7 +126,9 @@
       case '>':
         return evaluator.makeBoolConstant(a > b);
       default:
-        return evaluator.reportInvalid(node, "Invalid binary operator $op");
+        // Probably unreachable.
+        return evaluator.createInvalidExpressionConstant(
+            node, "Invalid binary operator $op");
     }
   }
 
@@ -127,7 +137,7 @@
     try {
       return new IntConstant(left ~/ right);
     } catch (e) {
-      return evaluator.report(node,
+      return evaluator.createErrorConstant(node,
           templateConstEvalTruncateError.withArguments('$left', '$right'));
     }
   }
@@ -154,7 +164,7 @@
   @override
   DoubleConstant makeIntConstant(int value, {bool unsigned: false}) {
     double doubleValue = value.toDouble();
-    assert(doubleValue.toInt() == value);
+    // Invalid assert: assert(doubleValue.toInt() == value);
     if (unsigned) {
       const double twoTo64 = 18446744073709551616.0;
       if (value < 0) doubleValue += twoTo64;
@@ -172,7 +182,9 @@
         int intValue = _toUint32(operand.value);
         return new DoubleConstant(_truncate32(~intValue).toDouble());
       default:
-        return evaluator.reportInvalid(node, "Invalid unary operator $op");
+        // Probably unreachable.
+        return evaluator.createInvalidExpressionConstant(
+            node, "Invalid unary operator $op");
     }
   }
 
@@ -181,7 +193,8 @@
       DoubleConstant left, DoubleConstant right) {
     double a = left.value;
     double b = right.value;
-    _checkOperands(node, op, a, b);
+    AbortConstant error = _checkOperands(node, op, a, b);
+    if (error != null) return error;
     switch (op) {
       case '+':
         return new DoubleConstant(a + b);
@@ -212,6 +225,7 @@
         }
         return new DoubleConstant(_truncate32(ai >> b.toInt()).toDouble());
       case '>>>':
+        // Currently unreachable as int hasn't defined '>>>'.
         int ai = _toUint32(a);
         return new DoubleConstant(_truncate32(ai >> b.toInt()).toDouble());
       case '<':
@@ -223,7 +237,9 @@
       case '>':
         return evaluator.makeBoolConstant(a > b);
       default:
-        return evaluator.reportInvalid(node, "Invalid binary operator $op");
+        // Probably unreachable.
+        return evaluator.createInvalidExpressionConstant(
+            node, "Invalid binary operator $op");
     }
   }
 
@@ -231,7 +247,7 @@
   Constant truncatingDivide(MethodInvocation node, num left, num right) {
     double division = (left / right);
     if (division.isNaN || division.isInfinite) {
-      return evaluator.report(node,
+      return evaluator.createErrorConstant(node,
           templateConstEvalTruncateError.withArguments('$left', '${right}'));
     }
     double result = division.truncateToDouble();
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 993b176..3fb157b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -5679,13 +5679,12 @@
           declaredOrInferredType is! InvalidType) {
         if ((variable.isLate && variable.isFinal) ||
             variable.isLateFinalWithoutInitializer) {
-          if (isDefinitelyAssigned &&
-              declaredOrInferredType.isPotentiallyNonNullable) {
+          if (isDefinitelyAssigned) {
             return new ExpressionInferenceResult(
                 resultType,
                 inferrer.helper.wrapInProblem(
                     resultExpression,
-                    templateNonNullableLateDefinitelyAssignedError
+                    templateLateDefinitelyAssignedError
                         .withArguments(node.variable.name),
                     node.fileOffset,
                     node.variable.name.length));
@@ -5741,8 +5740,17 @@
     }
     if (initializerResult != null) {
       DartType initializerType = initializerResult.inferredType;
-      if (node.isImplicitlyTyped && initializerType is TypeParameterType) {
-        inferrer.flowAnalysis.promote(node, initializerType);
+      if (node.isImplicitlyTyped) {
+        if (initializerType is TypeParameterType) {
+          inferrer.flowAnalysis.promote(node, initializerType);
+        }
+      } else if (!node.isFinal) {
+        // TODO(paulberry): `initializerType` is sometimes `null` during top
+        // level inference.  Figure out how to prevent this.
+        if (initializerType != null) {
+          inferrer.flowAnalysis
+              .write(node, initializerType, viaInitializer: true);
+        }
       }
       Expression initializer = inferrer.ensureAssignableResult(
           node.type, initializerResult,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index c4172c3..eef5d01 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -1190,6 +1190,9 @@
         logger: (String msg) => ticker.logMs(msg));
   }
 
+  constants.EvaluationMode getConstantEvaluationModeForTesting() =>
+      _getConstantEvaluationMode();
+
   constants.EvaluationMode _getConstantEvaluationMode() {
     constants.EvaluationMode evaluationMode;
     // If nnbd is not enabled we will use weak evaluation mode. This is needed
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index f028638..b2b3147 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -457,6 +457,7 @@
 LanguageVersionMismatchInPatch/example: Fail
 LanguageVersionTooHigh/analyzerCode: Fail
 LanguageVersionTooHigh/part_wrapped_script: Fail # Content comes after "part of [...]" meaning it's not actually a language version specification.
+LateDefinitelyAssignedError/analyzerCode: Fail
 LateDefinitelyUnassignedError/analyzerCode: Fail
 LibraryDirectiveNotFirst/part_wrapped_script1: Fail # Defining library name in the (now) part.
 LibraryDirectiveNotFirst/part_wrapped_script2: Fail
@@ -516,7 +517,6 @@
 NonInstanceTypeVariableUse/example: Fail
 NonNullableInNullAware/analyzerCode: Fail
 NonNullableInNullAware/example: Fail
-NonNullableLateDefinitelyAssignedError/analyzerCode: Fail
 NonNullableNotAssignedError/analyzerCode: Fail
 NonNullableNotAssignedWarning/analyzerCode: Fail
 NonNullableNotAssignedWarning/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 803c63f..64a47d6 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -61,7 +61,12 @@
 # `#unicode` a Unicode short identifier (U+xxxx). We use this to represent code
 #  units or code points.
 #
-# `#name`, `#name2`, `#name3`, `#name4`: names (as strings).
+# `#name`, `#name2`, `#name3`, `#name4`: names (as strings). Note that asserts
+#    check if these are empty. If they can be empty use an available `OKEmpty`
+#    version (or add the missing needed one(s)) to avoid triggering an assert.
+#
+# `#nameOKEmpty`: name (as string). Will use an "(unnamed)" default message if
+#    the string is null or empty. Otherwise see the describtion above.
 #
 # `#names`: A list of names (strings).
 #
@@ -71,6 +76,13 @@
 #    Note: as a rule of thumb, avoid using the `#string` keys. In particular,
 #    do not use them for composing error messages, see [diagnostics.md](
 #    lib/src/fasta/diagnostics.md#avoid-composing-messages-programmatically).
+#    Note that asserts check if these are empty. If they can be empty use an
+#    available `OKEmpty` version (or add the missing needed one(s)) to avoid
+#    triggering an assert.
+#
+# `#stringOKEmpty`: string (that isn't a name). Will use an "(empty)" default
+#    message if the string is null or empty.
+#    Otherwise see the describtion above.
 #
 # `#type`, #type2`, `#type3`: Kernel types.
 #
@@ -117,7 +129,7 @@
   template: "Expected constant '#constant' to be of type '#type', but was of type '#type2'."
 
 ConstEvalInvalidBinaryOperandType:
-  template: "Binary operator '#string' on '#constant' requires operand of type '#type', but was of type '#type2'."
+  template: "Binary operator '#stringOKEmpty' on '#constant' requires operand of type '#type', but was of type '#type2'."
 
 ConstEvalInvalidEqualsOperandType:
   template: "Binary operator '==' requires receiver constant '#constant' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type '#type'."
@@ -136,11 +148,11 @@
   template: "Constant expression must be non-null."
 
 ConstEvalInvalidMethodInvocation:
-  template: "The method '#string' can't be invoked on '#constant' in a constant expression."
+  template: "The method '#stringOKEmpty' can't be invoked on '#constant' in a constant expression."
   analyzerCode: UNDEFINED_OPERATOR
 
 ConstEvalInvalidPropertyGet:
-  template: "The property '#string' can't be accessed on '#constant' in a constant expression."
+  template: "The property '#stringOKEmpty' can't be accessed on '#constant' in a constant expression."
   analyzerCode: CONST_EVAL_THROWS_EXCEPTION
 
 ConstEvalInvalidStringInterpolationOperand:
@@ -150,7 +162,7 @@
   analyzerCode: CONST_EVAL_TYPE_BOOL_NUM_STRING
 
 ConstEvalInvalidStaticInvocation:
-  template: "The invocation of '#name' is not allowed in a constant expression."
+  template: "The invocation of '#nameOKEmpty' is not allowed in a constant expression."
   analyzerCode: CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
 
 ConstEvalInvalidSymbolName:
@@ -162,16 +174,16 @@
   analyzerCode: CONST_EVAL_THROWS_EXCEPTION
 
 ConstEvalFailedAssertionWithMessage:
-  template: "This assertion failed with message: #string"
+  template: "This assertion failed with message: #stringOKEmpty"
   analyzerCode: CONST_EVAL_THROWS_EXCEPTION
 
 ConstEvalNonConstantVariableGet:
-  template: "The variable '#string' is not a constant, only constant expressions are allowed."
+  template: "The variable '#nameOKEmpty' is not a constant, only constant expressions are allowed."
   analyzerCode: NON_CONSTANT_VALUE_IN_INITIALIZER
 
 ConstEvalDeferredLibrary:
   template: >
-    '#name' can't be used in a constant expression because it's marked as
+    '#nameOKEmpty' can't be used in a constant expression because it's marked as
     'deferred' which means it isn't available until loaded.
   tip: >
     Try moving the constant from the deferred library, or removing 'deferred'
@@ -4220,8 +4232,8 @@
       late T t; t;
     }
 
-NonNullableLateDefinitelyAssignedError:
-  template: "Non-nullable late final variable '#name' definitely assigned."
+LateDefinitelyAssignedError:
+  template: "Late final variable '#name' definitely assigned."
   configuration: nnbd-strong
   script: |
     method() {
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index b18d9c2..af9f637 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -22,6 +22,9 @@
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 
+import 'package:front_end/src/api_prototype/constant_evaluator.dart'
+    show ConstantEvaluator, ErrorReporter, EvaluationMode;
+
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
     show
         AllowedExperimentalFlags,
@@ -59,18 +62,39 @@
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
 
+import 'package:front_end/src/fasta/messages.dart' show LocatedMessage;
+
 import 'package:front_end/src/fasta/ticker.dart' show Ticker;
 
 import 'package:front_end/src/fasta/uri_translator.dart' show UriTranslator;
 
+import 'package:front_end/src/fasta/kernel/verifier.dart' show verifyComponent;
+
 import 'package:kernel/ast.dart'
-    show AwaitExpression, Component, Library, Node, Version, Visitor;
+    show
+        AwaitExpression,
+        BasicLiteral,
+        Component,
+        Constant,
+        ConstantExpression,
+        Expression,
+        FileUriExpression,
+        FileUriNode,
+        InvalidExpression,
+        Library,
+        Member,
+        Node,
+        TreeNode,
+        UnevaluatedConstant,
+        Version,
+        Visitor;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
-import 'package:kernel/kernel.dart' show loadComponentFromBytes;
+import 'package:kernel/kernel.dart'
+    show RecursiveVisitor, loadComponentFromBytes;
 
 import 'package:kernel/reference_from_index.dart' show ReferenceFromIndex;
 
@@ -78,7 +102,26 @@
     show ChangedStructureNotifier;
 
 import 'package:kernel/target/targets.dart'
-    show NoneTarget, Target, TargetFlags, DiagnosticReporter;
+    show
+        ConstantsBackend,
+        DiagnosticReporter,
+        NoneConstantsBackend,
+        NoneTarget,
+        Target,
+        TargetFlags;
+
+import 'package:kernel/target/targets.dart'
+    show
+        ConstantsBackend,
+        DiagnosticReporter,
+        NoneConstantsBackend,
+        NoneTarget,
+        NumberSemantics,
+        Target,
+        TargetFlags;
+
+import 'package:kernel/type_environment.dart'
+    show StaticTypeContext, TypeEnvironment;
 
 import 'package:testing/testing.dart'
     show
@@ -101,7 +144,6 @@
         MatchExpectation,
         Print,
         TypeCheck,
-        Verify,
         WriteDill;
 
 import '../../utils/validating_instrumentation.dart'
@@ -154,6 +196,7 @@
 
 const String experimentalFlagOptions = '--enable-experiment=';
 const String overwriteCurrentSdkVersion = '--overwrite-current-sdk-version=';
+const String noVerifyCmd = '--no-verify';
 
 /// Options used for all tests within a given folder.
 ///
@@ -166,6 +209,8 @@
   final bool forceStaticFieldLowering;
   final bool forceNoExplicitGetterCalls;
   final bool nnbdAgnosticMode;
+  final Map<String, String> defines;
+  final bool noVerify;
   final String target;
   final String overwriteCurrentSdkVersion;
 
@@ -175,6 +220,8 @@
       this.forceStaticFieldLowering: false,
       this.forceNoExplicitGetterCalls: false,
       this.nnbdAgnosticMode: false,
+      this.defines: const {},
+      this.noVerify: false,
       this.target: "vm",
       // can be null
       this.overwriteCurrentSdkVersion})
@@ -183,6 +230,11 @@
         assert(forceStaticFieldLowering != null),
         assert(forceNoExplicitGetterCalls != null),
         assert(nnbdAgnosticMode != null),
+        assert(
+            // no this doesn't make any sense but left to underline
+            // that this is allowed to be null!
+            defines != null || defines == null),
+        assert(noVerify != null),
         assert(target != null);
 
   Map<ExperimentalFlag, bool> computeExperimentalFlags(
@@ -273,6 +325,14 @@
       fullPrefix = '.strong';
       outlinePrefix = '.outline';
     }
+
+    if (!fullCompile) {
+      // If not doing a full compile this is the only expect file so we run the
+      // extra constant evaluation now. If we do a full compilation, we'll do
+      // if after the transformation. That also ensures we don't get the same
+      // 'extra constant evaluation' output twice (in .transformed and not).
+      steps.add(const StressConstantEvaluatorStep());
+    }
     if (!ignoreExpectations) {
       steps.add(new MatchExpectation(
           fullCompile ? "$fullPrefix.expect" : "$outlinePrefix.expect",
@@ -292,20 +352,13 @@
     }
     if (fullCompile) {
       steps.add(const Transform());
+      steps.add(const StressConstantEvaluatorStep());
       if (!ignoreExpectations) {
-        steps.add(new MatchExpectation(
-            fullCompile
-                ? "$fullPrefix.transformed.expect"
-                : "$outlinePrefix.transformed.expect",
-            serializeFirst: false,
-            isLastMatchStep: updateExpectations));
+        steps.add(new MatchExpectation("$fullPrefix.transformed.expect",
+            serializeFirst: false, isLastMatchStep: updateExpectations));
         if (!updateExpectations) {
-          steps.add(new MatchExpectation(
-              fullCompile
-                  ? "$fullPrefix.transformed.expect"
-                  : "$outlinePrefix.transformed.expect",
-              serializeFirst: true,
-              isLastMatchStep: true));
+          steps.add(new MatchExpectation("$fullPrefix.transformed.expect",
+              serializeFirst: true, isLastMatchStep: true));
         }
       }
       steps.add(const EnsureNoErrors());
@@ -324,6 +377,8 @@
       bool forceStaticFieldLowering = false;
       bool forceNoExplicitGetterCalls = false;
       bool nnbdAgnosticMode = false;
+      bool noVerify = false;
+      Map<String, String> defines = {};
       String target = "vm";
       if (directory.uri == baseUri) {
         folderOptions = new FolderOptions({},
@@ -332,6 +387,8 @@
             forceStaticFieldLowering: forceStaticFieldLowering,
             forceNoExplicitGetterCalls: forceNoExplicitGetterCalls,
             nnbdAgnosticMode: nnbdAgnosticMode,
+            defines: defines,
+            noVerify: noVerify,
             target: target);
       } else {
         File optionsFile =
@@ -359,6 +416,38 @@
               forceNoExplicitGetterCalls = true;
             } else if (line.startsWith(Flags.nnbdAgnosticMode)) {
               nnbdAgnosticMode = true;
+            } else if (line.startsWith(Flags.noDefines)) {
+              if (defines == null) {
+                throw "Specifying ${Flags.noDefines} several times "
+                    "is unsupported.";
+              }
+              if (defines.isNotEmpty) {
+                throw "Can't have no defines and specific defines "
+                    "at the same time.";
+              }
+              defines = null;
+            } else if (line.startsWith("-D")) {
+              if (defines == null) {
+                throw "Can't have no defines and specific defines "
+                    "at the same time.";
+              }
+              String define = line.substring(2); // removes "-D".
+              int index = define.indexOf('=');
+              String name;
+              String expression;
+              if (index != -1) {
+                name = define.substring(0, index);
+                expression = define.substring(index + 1);
+              } else {
+                name = define;
+                expression = define;
+              }
+              if (defines.containsKey(name)) {
+                throw "Defining '$name' several times is unsupported.";
+              }
+              defines[name] = expression;
+            } else if (line.startsWith(noVerifyCmd)) {
+              noVerify = true;
             } else if (line.startsWith(Flags.target) &&
                 line.indexOf('=') == Flags.target.length) {
               target = line.substring(Flags.target.length + 1);
@@ -378,6 +467,8 @@
               forceStaticFieldLowering: forceStaticFieldLowering,
               forceNoExplicitGetterCalls: forceNoExplicitGetterCalls,
               nnbdAgnosticMode: nnbdAgnosticMode,
+              defines: defines,
+              noVerify: noVerify,
               target: target,
               overwriteCurrentSdkVersion: overwriteCurrentSdkVersionArgument);
         } else {
@@ -412,7 +503,7 @@
         }
         ..sdkRoot = sdk
         ..packagesFileUri = uriConfiguration.packageConfigUri ?? packages
-        ..environmentDefines = {}
+        ..environmentDefines = folderOptions.defines
         ..experimentalFlags =
             folderOptions.computeExperimentalFlags(experimentalFlags)
         ..nnbdMode = weak
@@ -662,6 +753,7 @@
         }
         return process.toResult();
       case "none":
+      case "noneWithJs":
         return pass(0);
       default:
         throw new ArgumentError(
@@ -670,6 +762,182 @@
   }
 }
 
+class StressConstantEvaluatorStep
+    extends Step<ComponentResult, ComponentResult, FastaContext> {
+  const StressConstantEvaluatorStep();
+
+  String get name => "stress constant evaluator";
+
+  Future<Result<ComponentResult>> run(
+      ComponentResult result, FastaContext context) async {
+    KernelTarget target = result.sourceTarget;
+    ConstantsBackend constantsBackend =
+        target.backendTarget.constantsBackend(target.loader.coreTypes);
+    TypeEnvironment environment =
+        new TypeEnvironment(target.loader.coreTypes, target.loader.hierarchy);
+    StressConstantEvaluatorVisitor stressConstantEvaluatorVisitor =
+        new StressConstantEvaluatorVisitor(
+      constantsBackend,
+      result.options.environmentDefines,
+      target.isExperimentEnabledGlobally(ExperimentalFlag.tripleShift),
+      environment,
+      !target.backendTarget.supportsSetLiterals,
+      result.options.errorOnUnevaluatedConstant,
+      target.getConstantEvaluationModeForTesting(),
+    );
+    for (Library lib in result.component.libraries) {
+      if (!result.isUserLibrary(lib)) continue;
+      lib.accept(stressConstantEvaluatorVisitor);
+    }
+    if (stressConstantEvaluatorVisitor.success > 0) {
+      result.extraConstantStrings.addAll(stressConstantEvaluatorVisitor.output);
+      result.extraConstantStrings.add("Extra constant evaluation: "
+          "tries: ${stressConstantEvaluatorVisitor.tries}, "
+          "successes: ${stressConstantEvaluatorVisitor.success}");
+    }
+    return pass(result);
+  }
+}
+
+class StressConstantEvaluatorVisitor extends RecursiveVisitor<Node>
+    implements ErrorReporter {
+  ConstantEvaluator constantEvaluator;
+  ConstantEvaluator constantEvaluatorWithEmptyEnvironment;
+  int tries = 0;
+  int success = 0;
+  List<String> output = [];
+
+  StressConstantEvaluatorVisitor(
+      ConstantsBackend backend,
+      Map<String, String> environmentDefines,
+      bool enableTripleShift,
+      TypeEnvironment typeEnvironment,
+      bool desugarSets,
+      bool errorOnUnevaluatedConstant,
+      EvaluationMode evaluationMode) {
+    constantEvaluator = new ConstantEvaluator(
+        backend, environmentDefines, typeEnvironment, this,
+        desugarSets: desugarSets,
+        enableTripleShift: enableTripleShift,
+        errorOnUnevaluatedConstant: errorOnUnevaluatedConstant,
+        evaluationMode: evaluationMode);
+    constantEvaluatorWithEmptyEnvironment = new ConstantEvaluator(
+        backend, {}, typeEnvironment, this,
+        desugarSets: desugarSets,
+        enableTripleShift: enableTripleShift,
+        errorOnUnevaluatedConstant: errorOnUnevaluatedConstant,
+        evaluationMode: evaluationMode);
+  }
+
+  Library currentLibrary;
+  Library visitLibrary(Library node) {
+    currentLibrary = node;
+    node.visitChildren(this);
+    currentLibrary = null;
+    return node;
+  }
+
+  Member currentMember;
+
+  Node defaultMember(Member node) {
+    Member prevCurrentMember = currentMember;
+    currentMember = node;
+    node.visitChildren(this);
+    currentMember = prevCurrentMember;
+    return node;
+  }
+
+  Node defaultExpression(Expression node) {
+    if (node is BasicLiteral) return node;
+    if (node is InvalidExpression) return node;
+    if (node is ConstantExpression) {
+      bool evaluate = false;
+      if (node.constant is UnevaluatedConstant) {
+        UnevaluatedConstant unevaluatedConstant = node.constant;
+        if (unevaluatedConstant.expression is! InvalidExpression) {
+          evaluate = true;
+        }
+      }
+      if (!evaluate) return node;
+      if (constantEvaluator.environmentDefines != null) {
+        throw "Unexpected UnevaluatedConstant "
+            "when the environment is not null.";
+      }
+    }
+
+    // Try to evaluate it as a constant.
+    tries++;
+    StaticTypeContext staticTypeContext;
+    if (currentMember == null) {
+      staticTypeContext = new StaticTypeContext.forAnnotations(
+          currentLibrary, constantEvaluator.typeEnvironment);
+    } else {
+      staticTypeContext = new StaticTypeContext(
+          currentMember, constantEvaluator.typeEnvironment);
+    }
+    Constant x = constantEvaluator.evaluate(staticTypeContext, node);
+    bool evaluatedWithEmptyEnvironment = false;
+    if (x is UnevaluatedConstant && x.expression is! InvalidExpression) {
+      // try with an environment
+      if (constantEvaluator.environmentDefines != null) {
+        throw "Unexpected UnevaluatedConstant (with an InvalidExpression in "
+            "it) when the environment is not null.";
+      }
+      x = constantEvaluatorWithEmptyEnvironment.evaluate(
+          new StaticTypeContext(
+              currentMember, constantEvaluator.typeEnvironment),
+          new ConstantExpression(x));
+      evaluatedWithEmptyEnvironment = true;
+    }
+    if (x is UnevaluatedConstant) {
+      if (x.expression is! InvalidExpression &&
+          x.expression is! FileUriExpression) {
+        throw "Unexpected ${x.runtimeType} with "
+            "${x.expression.runtimeType} inside.";
+      }
+      node.visitChildren(this);
+    } else {
+      success++;
+      if (!evaluatedWithEmptyEnvironment) {
+        output
+            .add("Evaluated: ${node.runtimeType} @ ${getLocation(node)} -> $x");
+        // Don't recurse into children - theoretically we could replace this
+        // node with a constant expression.
+      } else {
+        output.add("Evaluated with empty environment: "
+            "${node.runtimeType} @ ${getLocation(node)} -> $x");
+        // Here we (for now) recurse into children.
+        node.visitChildren(this);
+      }
+    }
+    return node;
+  }
+
+  String getLocation(TreeNode node) {
+    try {
+      return node.location.toString();
+    } catch (e) {
+      TreeNode n = node;
+      while (n != null && n is! FileUriNode) {
+        n = n.parent;
+      }
+      if (n == null) return "(unknown location)";
+      FileUriNode fileUriNode = n;
+      return ("(unknown position in ${fileUriNode.fileUri})");
+    }
+  }
+
+  @override
+  void report(LocatedMessage message, List<LocatedMessage> context) {
+    // ignored.
+  }
+
+  @override
+  void reportInvalidExpression(InvalidExpression node) {
+    // ignored.
+  }
+}
+
 class Outline extends Step<TestDescription, ComponentResult, FastaContext> {
   final bool fullCompile;
 
@@ -711,7 +979,7 @@
         ..onDiagnostic = (DiagnosticMessage message) {
           errors.add(message.plainTextFormatted);
         }
-        ..environmentDefines = {}
+        ..environmentDefines = folderOptions.defines
         ..experimentalFlags = experimentalFlags
         ..nnbdMode = nnbdMode
         ..librariesSpecificationUri = librariesSpecificationUri
@@ -754,7 +1022,8 @@
         }
         Component p = await sourceTarget.buildOutlines();
         if (fullCompile) {
-          p = await sourceTarget.buildComponent(verify: context.verify);
+          p = await sourceTarget.buildComponent(
+              verify: folderOptions.noVerify ? false : context.verify);
         }
 
         // To avoid possible crash in mixin transformation in the transformation
@@ -817,21 +1086,24 @@
       userLibraries.addAll(uriTranslator.dartLibraries.allLibraries
           .map((LibraryInfo info) => info.importUri));
       if (fullCompile) {
-        p = await sourceTarget.buildComponent(verify: context.verify);
+        p = await sourceTarget.buildComponent(
+            verify: folderOptions.noVerify ? false : context.verify);
         instrumentation.finish();
         if (instrumentation.hasProblems) {
           if (updateComments) {
             await instrumentation.fixSource(description.uri, false);
           } else {
             return new Result<ComponentResult>(
-                new ComponentResult(description, p, userLibraries),
+                new ComponentResult(
+                    description, p, userLibraries, options, sourceTarget),
                 context.expectationSet["InstrumentationMismatch"],
                 instrumentation.problemsAsString,
                 null);
           }
         }
       }
-      return pass(new ComponentResult(description, p, userLibraries));
+      return pass(new ComponentResult(
+          description, p, userLibraries, options, sourceTarget));
     });
   }
 
@@ -862,6 +1134,9 @@
       case "none":
         target = new NoneTarget(targetFlags);
         break;
+      case "noneWithJs":
+        target = new NoneWithJsTarget(targetFlags);
+        break;
       default:
         throw new ArgumentError(
             "Unsupported test target '${testOptions.target}'.");
@@ -919,6 +1194,48 @@
   }
 }
 
+class Verify extends Step<ComponentResult, ComponentResult, FastaContext> {
+  final bool fullCompile;
+
+  const Verify(this.fullCompile);
+
+  String get name => "verify";
+
+  Future<Result<ComponentResult>> run(
+      ComponentResult result, FastaContext context) async {
+    FolderOptions folderOptions =
+        context.computeFolderOptions(result.description);
+
+    if (folderOptions.noVerify) {
+      return pass(result);
+    }
+
+    Component component = result.component;
+    StringBuffer messages = new StringBuffer();
+    ProcessedOptions options = new ProcessedOptions(
+        options: new CompilerOptions()
+          ..onDiagnostic = (DiagnosticMessage message) {
+            if (messages.isNotEmpty) {
+              messages.write("\n");
+            }
+            messages.writeAll(message.plainTextFormatted, "\n");
+          });
+    return await CompilerContext.runWithOptions(options,
+        (compilerContext) async {
+      compilerContext.uriToSource.addAll(component.uriToSource);
+      List<LocatedMessage> verificationErrors = verifyComponent(component,
+          isOutline: !fullCompile, skipPlatform: true);
+      assert(verificationErrors.isEmpty || messages.isNotEmpty);
+      if (messages.isEmpty) {
+        return pass(result);
+      } else {
+        return new Result<ComponentResult>(null,
+            context.expectationSet["VerificationError"], "$messages", null);
+      }
+    }, errorOnMissingInput: false);
+  }
+}
+
 /// Visitor that checks that the component has been transformed properly.
 // TODO(johnniwinther): Add checks for all nodes that are unsupported after
 // transformation.
@@ -1033,3 +1350,19 @@
         packageConfigUri == other.packageConfigUri;
   }
 }
+
+class NoneWithJsTarget extends NoneTarget {
+  NoneWithJsTarget(TargetFlags flags) : super(flags);
+
+  @override
+  ConstantsBackend constantsBackend(CoreTypes coreTypes) =>
+      const NoneConstantsBackendWithJs(supportsUnevaluatedConstants: true);
+}
+
+class NoneConstantsBackendWithJs extends NoneConstantsBackend {
+  const NoneConstantsBackendWithJs({bool supportsUnevaluatedConstants})
+      : super(supportsUnevaluatedConstants: supportsUnevaluatedConstants);
+
+  @override
+  NumberSemantics get numberSemantics => NumberSemantics.js;
+}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 13b507d..17ed18c 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -82,6 +82,7 @@
 b2m
 b2n
 backping
+backstop
 badly
 bang
 bar
@@ -756,6 +757,7 @@
 overloader
 overlooked
 overshadowed
+oversight
 overwrite
 overwriting
 ownership
@@ -1036,6 +1038,7 @@
 stdio
 stdlib
 stdout
+sticky
 stmt
 str
 strategies
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 72b3b50..3b6c56f 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -2358,6 +2358,7 @@
 real
 realigned
 realized
+realizing
 really
 reason
 reasonable
diff --git a/pkg/front_end/test/spell_checking_list_messages.txt b/pkg/front_end/test/spell_checking_list_messages.txt
index 963e938..a0c8cae 100644
--- a/pkg/front_end/test/spell_checking_list_messages.txt
+++ b/pkg/front_end/test/spell_checking_list_messages.txt
@@ -36,6 +36,7 @@
 loadlibrary
 name.#name
 name.stack
+nameokempty
 native('native
 nativetype
 nnbd
@@ -51,6 +52,7 @@
 re
 sdksummary
 stacktrace
+stringokempty
 struct<#name
 structs
 super.namedconstructor
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index cf6a8b1..eaf2af5 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -55,6 +55,7 @@
 beta
 bigger
 bkonyi
+bla
 blah
 blindly
 blocked
@@ -70,9 +71,11 @@
 brand
 brave
 brown
+btw
 builddir
 bulk2
 bulkcompile
+bye
 c's
 c59cdee365b94ce066344840f9e3412d642019b
 ca
@@ -101,6 +104,7 @@
 class5c
 class5d
 cloneable
+cmd
 cmp
 cnn
 coded
@@ -184,6 +188,7 @@
 dispatcher
 dispose
 dist
+div
 divergent
 doctype
 doesnt
@@ -262,6 +267,7 @@
 forces
 foreground
 forrest
+forty
 foundation
 fox
 fulfill
@@ -311,7 +317,9 @@
 increments
 indents
 initializer2
+instance2
 insufficient
+intdiv
 interactive
 internet
 interpolate
@@ -366,6 +374,7 @@
 lints
 linux
 listening
+literal2
 ln
 local1a
 local1b
@@ -485,6 +494,7 @@
 quit
 quot
 quux
+quuz
 qux
 r"
 r"\s
@@ -518,9 +528,11 @@
 retains
 rev
 risky
+rk
 row
 rows
 runtimes
+rv
 scans
 scheduler
 screen
@@ -564,6 +576,8 @@
 stats
 stay
 std
+stress
+string2
 strip
 strongest
 stub's
@@ -577,6 +591,7 @@
 subtyping1b
 subtyping2a
 subtyping2b
+successes
 suite
 summarization
 summarized
@@ -591,6 +606,7 @@
 templates
 test3a
 test3b
+theoretically
 thereof
 timed
 timeout
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index 9e0988a..d530ed8 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -26,9 +26,10 @@
 
 import 'package:front_end/src/fasta/fasta_codes.dart' show templateUnspecified;
 
-import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
+import 'package:front_end/src/fasta/kernel/kernel_target.dart'
+    show KernelTarget;
 
-import 'package:front_end/src/fasta/kernel/verifier.dart' show verifyComponent;
+import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
 
 import 'package:front_end/src/fasta/messages.dart'
     show DiagnosticMessageFromJson, LocatedMessage;
@@ -152,41 +153,6 @@
   }
 }
 
-class Verify extends Step<ComponentResult, ComponentResult, ChainContext> {
-  final bool fullCompile;
-
-  const Verify(this.fullCompile);
-
-  String get name => "verify";
-
-  Future<Result<ComponentResult>> run(
-      ComponentResult result, ChainContext context) async {
-    Component component = result.component;
-    StringBuffer messages = new StringBuffer();
-    ProcessedOptions options = new ProcessedOptions(
-        options: new CompilerOptions()
-          ..onDiagnostic = (DiagnosticMessage message) {
-            if (messages.isNotEmpty) {
-              messages.write("\n");
-            }
-            messages.writeAll(message.plainTextFormatted, "\n");
-          });
-    return await CompilerContext.runWithOptions(options,
-        (compilerContext) async {
-      compilerContext.uriToSource.addAll(component.uriToSource);
-      List<LocatedMessage> verificationErrors = verifyComponent(component,
-          isOutline: !fullCompile, skipPlatform: true);
-      assert(verificationErrors.isEmpty || messages.isNotEmpty);
-      if (messages.isEmpty) {
-        return pass(result);
-      } else {
-        return new Result<ComponentResult>(null,
-            context.expectationSet["VerificationError"], "$messages", null);
-      }
-    }, errorOnMissingInput: false);
-  }
-}
-
 class TypeCheck extends Step<ComponentResult, ComponentResult, ChainContext> {
   const TypeCheck();
 
@@ -316,6 +282,15 @@
       printer.endLine();
     });
     printer.writeConstantTable(componentToText);
+
+    if (result.extraConstantStrings.isNotEmpty) {
+      buffer.writeln("");
+      buffer.writeln("Extra constant evaluation status:");
+      for (String extraConstantString in result.extraConstantStrings) {
+        buffer.writeln(extraConstantString);
+      }
+    }
+
     String actual = "$buffer";
     String binariesPath =
         relativizeUri(Uri.base, platformBinariesLocation, isWindows);
@@ -418,8 +393,8 @@
     Uri uri = tmp.uri.resolve("generated.dill");
     File generated = new File.fromUri(uri);
     IOSink sink = generated.openWrite();
-    result = new ComponentResult(
-        result.description, result.component, result.userLibraries, uri);
+    result = new ComponentResult(result.description, result.component,
+        result.userLibraries, result.options, result.sourceTarget, uri);
     try {
       new BinaryPrinter(sink).writeComponentFile(component);
     } catch (e, s) {
@@ -515,8 +490,12 @@
   final Component component;
   final Set<Uri> userLibraries;
   final Uri outputUri;
+  final ProcessedOptions options;
+  final KernelTarget sourceTarget;
+  final List<String> extraConstantStrings = [];
 
   ComponentResult(this.description, this.component, this.userLibraries,
+      this.options, this.sourceTarget,
       [this.outputUri]);
 
   bool isUserLibrary(Library library) {
diff --git a/pkg/front_end/testcases/agnostic/as.dart.outline.expect b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
index 46f9ad3..e6f3b0e 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
@@ -6,3 +6,9 @@
 static const field core::List<core::int> b = const <core::int?>[] as{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:5:17 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:6:17 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 4, successes: 2
diff --git a/pkg/front_end/testcases/agnostic/identical.dart.outline.expect b/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
index 3163945..999e3a1 100644
--- a/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
@@ -7,3 +7,11 @@
 static const field core::bool c = core::identical(self::a, self::b);
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///identical.dart:5:16 -> ListConstant(const <int>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///identical.dart:6:17 -> ListConstant(const <int?>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///identical.dart:7:21 -> ListConstant(const <int>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///identical.dart:7:24 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 5, successes: 4
diff --git a/pkg/front_end/testcases/agnostic/is.dart.outline.expect b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
index d8d8870..daa025c 100644
--- a/pkg/front_end/testcases/agnostic/is.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
@@ -6,3 +6,9 @@
 static const field core::bool b = const <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:5:17 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:6:17 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 4, successes: 2
diff --git a/pkg/front_end/testcases/agnostic/map.dart.outline.expect b/pkg/front_end/testcases/agnostic/map.dart.outline.expect
index 958bfdc..c93a348 100644
--- a/pkg/front_end/testcases/agnostic/map.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/map.dart.outline.expect
@@ -7,3 +7,11 @@
 static const field core::Map<core::List<core::int?>, core::int> c = const <core::List<core::int?>, core::int>{self::a: 0, self::b: 1};
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///map.dart:5:16 -> ListConstant(const <int>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///map.dart:6:17 -> ListConstant(const <int?>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///map.dart:7:12 -> ListConstant(const <int>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///map.dart:7:18 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 5, successes: 4
diff --git a/pkg/front_end/testcases/agnostic/set.dart.outline.expect b/pkg/front_end/testcases/agnostic/set.dart.outline.expect
index da68e96..4e2d66b 100644
--- a/pkg/front_end/testcases/agnostic/set.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/set.dart.outline.expect
@@ -7,3 +7,11 @@
 static const field core::Set<core::List<core::int?>> c = const <core::List<core::int?>>{self::a, self::b};
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///set.dart:5:16 -> ListConstant(const <int>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///set.dart:6:17 -> ListConstant(const <int?>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///set.dart:7:12 -> ListConstant(const <int>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///set.dart:7:15 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 5, successes: 4
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.outline.expect b/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
index 5d1e201..4b30ee1 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
@@ -40,3 +40,12 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:6:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:14:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:17:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:21:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Extra constant evaluation: tries: 8, successes: 5
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
index 891feb9..b5ae761 100644
--- a/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
@@ -89,3 +89,8 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///conflict_with_object.dart:21:19 -> BoolConstant(true)
+Extra constant evaluation: tries: 37, successes: 1
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
index 641de72..8b2c087 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
@@ -94,3 +94,10 @@
 }
 static method topLevelMethod() → dynamic
   return def::Extension|staticField;
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:31 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:45 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:45 -> IntConstant(42)
+Extra constant evaluation: tries: 95, successes: 3
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
index 1de117d..4cbf136 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.strong.transformed.expect
@@ -91,3 +91,11 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:48:36 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:48:36 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_extension_access.dart:49:36 -> IntConstant(67)
+Extra constant evaluation: tries: 121, successes: 4
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect
index adc49e4..d52f3d6 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.strong.transformed.expect
@@ -132,3 +132,13 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:91:41 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:91:41 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:93:41 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:93:41 -> IntConstant(23)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:95:41 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///explicit_generic_extension_access.dart:95:41 -> IntConstant(67)
+Extra constant evaluation: tries: 217, successes: 6
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
index 98f08d2..c3ec8472 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
@@ -221,3 +221,107 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:47:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:47:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:51:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:51:32 -> IntConstant(2)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:56:24 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:58:34 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:58:34 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:60:12 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:60:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:60:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:60:35 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:65:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:67:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:67:35 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:69:12 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:69:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:69:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:69:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:86:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:86:30 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:89:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:89:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:93:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:93:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:97:43 -> IntConstant(6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:97:43 -> IntConstant(6)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:102:24 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:104:34 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:104:34 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:106:10 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:106:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:106:35 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:106:35 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:110:35 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:112:45 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:112:45 -> IntConstant(7)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:114:10 -> IntConstant(-8)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:114:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:114:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:114:46 -> IntConstant(-8)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:119:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:121:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:121:35 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:123:10 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:123:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:123:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:123:36 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:127:36 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:129:46 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:129:46 -> IntConstant(7)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:131:10 -> IntConstant(-8)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:131:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:131:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:131:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:136:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:136:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:139:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:139:41 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:143:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:143:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:147:43 -> IntConstant(6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:147:43 -> IntConstant(6)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:152:25 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:154:35 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:154:35 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:156:10 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:156:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:156:36 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:156:36 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:160:35 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:162:45 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:162:45 -> IntConstant(7)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:164:10 -> IntConstant(-8)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:164:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:164:46 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:164:46 -> IntConstant(-8)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:169:26 -> IntConstant(-2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:171:36 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:171:36 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:173:10 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:173:37 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:173:37 -> IntConstant(-4)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:173:37 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:177:36 -> IntConstant(-6)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:179:46 -> IntConstant(7)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:179:46 -> IntConstant(7)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:181:10 -> IntConstant(-8)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///extension_setter.dart:181:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:181:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:181:47 -> IntConstant(-8)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:187:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:187:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:189:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:189:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:194:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:194:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:196:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:196:33 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:201:53 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///extension_setter.dart:201:53 -> IntConstant(1)
+Extra constant evaluation: tries: 836, successes: 100
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
index 4a04ad0..15d3500 100644
--- a/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
@@ -47,3 +47,13 @@
   let final core::int* #t21 = self::Extension|get#property(c) in #t21.{core::num::==}(null) ?{core::int*} 0 : #t21;
   let final core::int* #t22 = self::Extension|get#property(c) in #t22.{core::num::==}(null) ?{core::int*} 0 : #t22;
 }
+
+
+Extra constant evaluation status:
+Evaluated: Let @ org-dartlang-testcase:///if_null.dart:21:20 -> IntConstant(42)
+Evaluated: Let @ org-dartlang-testcase:///if_null.dart:22:31 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:23:18 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:23:18 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:24:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///if_null.dart:24:29 -> IntConstant(42)
+Extra constant evaluation: tries: 122, successes: 6
diff --git a/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
index 67d8909..ec864e9 100644
--- a/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
@@ -121,3 +121,85 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:31:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:31:25 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:31:25 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:33:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:33:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:20 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:27 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:35:27 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:8 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:37:8 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:20 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:20 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:27 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:39:27 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:43:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:43:23 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:43:23 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:44:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:44:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:45:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:45:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:46:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:46:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:48:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:48:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:60:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:60:49 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:60:49 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:62:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:62:32 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:51 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:64:51 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:66:32 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:44 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:44 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:51 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:68:51 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:72:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:72:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:72:44 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:73:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:73:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:74:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:74:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:75:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:75:39 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:77:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:77:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:89:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:89:36 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:89:36 -> StringConstant("2")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:91:19 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:91:19 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:31 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:38 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:93:38 -> StringConstant("4")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:95:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:38 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:97:38 -> StringConstant("3")
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:101:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:101:34 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:101:34 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:102:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:102:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:103:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:103:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:104:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:104:29 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:31 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///index.dart:106:31 -> IntConstant(0)
+Extra constant evaluation: tries: 579, successes: 78
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect
index ca462d0..f1cf6c6 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.strong.transformed.expect
@@ -145,3 +145,23 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:79:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:79:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:81:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:81:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:82:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:82:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:83:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:83:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:84:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:84:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:85:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:85:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:100:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:100:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:103:28 -> IntConstant(43)
+Evaluated: VariableGet @ org-dartlang-testcase:///instance_access.dart:103:28 -> IntConstant(43)
+Extra constant evaluation: tries: 325, successes: 16
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect
index 9508bad..45e1923 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.strong.transformed.expect
@@ -117,3 +117,11 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///instance_tearoff.dart:54:19 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///instance_tearoff.dart:58:19 -> IntConstant(-7)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///instance_tearoff.dart:73:19 -> IntConstant(-4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///instance_tearoff.dart:77:19 -> IntConstant(-7)
+Extra constant evaluation: tries: 144, successes: 4
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect
index dadb2db..f28f4cc 100644
--- a/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.strong.transformed.expect
@@ -48,3 +48,11 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:23:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:23:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:25:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:25:28 -> IntConstant(87)
+Extra constant evaluation: tries: 49, successes: 4
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
index 32a70a4..fac7d9e 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
@@ -37,3 +37,11 @@
   let final self::C* #t8 = c in let final core::int* #t9 = 42 in self::Extension1|[]=(#t8, #t9, self::Extension1|-(self::Extension1|[](#t8, #t9), 1));
   self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:19:19 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:19:19 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:22:17 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue39527.dart:22:17 -> IntConstant(42)
+Extra constant evaluation: tries: 56, successes: 4
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
index 6609124..2b2a32d 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
@@ -85,3 +85,31 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:18:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:18:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:19:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:19:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:28:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:28:30 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:29:43 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:29:43 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:36:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:36:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:39:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:39:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:40:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:40:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:44:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:44:29 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:45:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:45:29 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:47:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:47:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:55:40 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:55:40 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:56:40 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware.dart:56:40 -> IntConstant(87)
+Extra constant evaluation: tries: 368, successes: 24
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect
index aa753cc..e7577c2 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.strong.transformed.expect
@@ -145,3 +145,23 @@
     throw "Mismatch: expected=${expected}, actual=${actual}";
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:79:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:79:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:81:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:81:28 -> IntConstant(87)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:82:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:82:42 -> IntConstant(27)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:83:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:83:42 -> IntConstant(37)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:84:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:84:56 -> IntConstant(77)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:85:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:85:56 -> IntConstant(67)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:100:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:100:28 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:103:28 -> IntConstant(43)
+Evaluated: VariableGet @ org-dartlang-testcase:///unnamed_extensions.dart:103:28 -> IntConstant(43)
+Extra constant evaluation: tries: 325, successes: 16
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
index aa76a9c..273a7fe 100644
--- a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
@@ -262,3 +262,14 @@
   ;
 static method change(self::Variable* v, core::int* newValue) → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:88:24 -> InstanceConstant(const Strength{Strength.value: 0, Strength.name: "required"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:89:32 -> InstanceConstant(const Strength{Strength.value: 1, Strength.name: "strongPreferred"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:90:25 -> InstanceConstant(const Strength{Strength.value: 2, Strength.name: "preferred"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:91:30 -> InstanceConstant(const Strength{Strength.value: 3, Strength.name: "strongDefault"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:92:22 -> InstanceConstant(const Strength{Strength.value: 4, Strength.name: "normal"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:93:28 -> InstanceConstant(const Strength{Strength.value: 5, Strength.name: "weakDefault"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:94:23 -> InstanceConstant(const Strength{Strength.value: 6, Strength.name: "weakest"})
+Extra constant evaluation: tries: 10, successes: 7
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
index eeda548..14f6467 100644
--- a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
@@ -372,3 +372,35 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:10:8 -> SymbolConstant(#interfaceMethod2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:10:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:10:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:10:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:21:3 -> SymbolConstant(#abstractMethod)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:21:3 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:21:3 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:21:3 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:6:8 -> SymbolConstant(#interfaceMethod1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:6:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:6:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:6:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:16:8 -> SymbolConstant(#interfaceMethod3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:16:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:16:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:16:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:24:12 -> SymbolConstant(#property3=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:24:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:24:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:12:7 -> SymbolConstant(#interfaceMethod1=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:12:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:12:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:22:12 -> SymbolConstant(#property1=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:22:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:22:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_members.dart:23:12 -> SymbolConstant(#property2=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:23:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_members.dart:23:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 73, successes: 28
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
index fa0fc05..86ada81 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
@@ -46,3 +46,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_overrides_concrete_with_no_such_method.dart:10:5 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_overrides_concrete_with_no_such_method.dart:10:5 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_overrides_concrete_with_no_such_method.dart:10:5 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_overrides_concrete_with_no_such_method.dart:10:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 9, successes: 4
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
index aaea247..74e9e52 100644
--- a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
@@ -45,3 +45,13 @@
 static const field core::int* hest = 42;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///annotation_on_enum_values.dart:15:6 -> ListConstant(const <Foo*>[const Foo{Foo.index: 0, Foo._name: "Foo.bar"}, const Foo{Foo.index: 1, Foo._name: "Foo.baz"}, const Foo{Foo.index: 2, Foo._name: "Foo.cafebabe"}])
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_on_enum_values.dart:16:4 -> IntConstant(42)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_on_enum_values.dart:17:3 -> InstanceConstant(const Foo{Foo.index: 0, Foo._name: "Foo.bar"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_on_enum_values.dart:18:4 -> InstanceConstant(const Fisk<int*>{Fisk.x: 42})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_on_enum_values.dart:19:3 -> InstanceConstant(const Foo{Foo.index: 1, Foo._name: "Foo.baz"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_on_enum_values.dart:20:3 -> InstanceConstant(const Foo{Foo.index: 2, Foo._name: "Foo.cafebabe"})
+Extra constant evaluation: tries: 11, successes: 6
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.outline.expect b/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
index b213fc1..a2c0119 100644
--- a/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
@@ -48,3 +48,18 @@
 @self::A::•(4)
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:5:2 -> InstanceConstant(const Object{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:6:2 -> InstanceConstant(const A{})
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:15:2 -> InstanceConstant(const Object{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:16:2 -> InstanceConstant(const A{})
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:31:2 -> InstanceConstant(const Object{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:32:2 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:9:24 -> InstanceConstant(const Object{})
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:27:2 -> InstanceConstant(const Object{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:28:2 -> InstanceConstant(const A{})
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:27:2 -> InstanceConstant(const Object{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:28:2 -> InstanceConstant(const A{})
+Extra constant evaluation: tries: 11, successes: 11
diff --git a/pkg/front_end/testcases/general/bug33099.dart.outline.expect b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
index fb764b2..ce6b8f1 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
@@ -63,3 +63,9 @@
   ;
 static method _hasAnnotationInstance(mir::DeclarationMirror* declaration, dynamic instance) → core::bool*
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///bug33099.dart:14:4 -> InstanceConstant(const _FailingTest{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bug33099.dart:7:40 -> InstanceConstant(const _FailingTest{})
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
index e7f6876..6ab71cc 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
@@ -84,3 +84,7 @@
   #C1 = self::_FailingTest {}
   #C2 = #foo
 }
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///bug33099.dart:21:42 -> TypeLiteralConstant(MyTest2*)
+Extra constant evaluation: tries: 33, successes: 1
diff --git a/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
index 4ea32aa..857760f 100644
--- a/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
@@ -16,3 +16,16 @@
   core::print(1.0 is core::int*);
   core::print(1.0 is core::double*);
 }
+
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:10:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:11:12 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:12:12 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:14:11 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:15:11 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:16:11 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:18:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:19:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:20:13 -> BoolConstant(true)
+Extra constant evaluation: tries: 21, successes: 9
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
index 992e106..8ee35ad 100644
--- a/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
@@ -35,3 +35,8 @@
 static field core::int* x = 0;
 static method m(dynamic x) → dynamic
   return null;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///check_deferred_read_type.dart:9:13 -> TypeLiteralConstant(C*)
+Extra constant evaluation: tries: 4, successes: 1
diff --git a/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect b/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect
index c425212..a73d318 100644
--- a/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.strong.transformed.expect
@@ -38,3 +38,9 @@
   on dynamic catch(final dynamic _) {
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:16:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:16:9 -> IntConstant(0)
+Extra constant evaluation: tries: 16, successes: 2
diff --git a/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect b/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
index 579ea4a..da2fefe 100644
--- a/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
@@ -46,3 +46,53 @@
   ;
 static method throws(() →* core::num* f) → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:7:12 -> DoubleConstant(-0.0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:8:19 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:9:19 -> DoubleConstant(Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:10:19 -> DoubleConstant(-Infinity)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:14:12 -> DoubleConstant(-0.0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:15:19 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:16:19 -> DoubleConstant(Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:17:19 -> DoubleConstant(-Infinity)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:19:17 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:20:19 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:21:12 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:21:20 -> DoubleConstant(-0.0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:22:19 -> DoubleConstant(NaN)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:22:26 -> DoubleConstant(-0.0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:23:19 -> DoubleConstant(Infinity)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:23:31 -> DoubleConstant(-0.0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:24:19 -> DoubleConstant(-Infinity)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:24:39 -> DoubleConstant(-0.0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:26:24 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:27:26 -> DoubleConstant(NaN)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:28:12 -> DoubleConstant(-0.0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:28:27 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:29:19 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:29:33 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:30:19 -> DoubleConstant(Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:30:38 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:31:19 -> DoubleConstant(-Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:31:46 -> DoubleConstant(NaN)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:33:14 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:34:16 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:35:17 -> IntConstant(0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:36:19 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:36:33 -> DoubleConstant(Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:37:19 -> DoubleConstant(Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:37:38 -> DoubleConstant(Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:38:19 -> DoubleConstant(-Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:38:46 -> DoubleConstant(Infinity)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:40:14 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:41:16 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:42:17 -> IntConstant(0)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:43:19 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:43:33 -> DoubleConstant(-Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:44:19 -> DoubleConstant(Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:44:38 -> DoubleConstant(-Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:45:19 -> DoubleConstant(-Infinity)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_truncate.dart:45:46 -> DoubleConstant(-Infinity)
+Extra constant evaluation: tries: 76, successes: 46
diff --git a/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect
index 5e6673e..3d56c16 100644
--- a/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constant_truncate.dart.strong.transformed.expect
@@ -413,3 +413,18 @@
   #C3 = Infinity
   #C4 = -Infinity
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:50:8 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:57:8 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:62:11 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:63:13 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:64:8 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:64:14 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:65:20 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:66:25 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:67:33 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:71:8 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:78:8 -> DoubleConstant(-0.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///constant_truncate.dart:85:8 -> DoubleConstant(-0.0)
+Extra constant evaluation: tries: 115, successes: 12
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart b/pkg/front_end/testcases/general/constants/const_asserts.dart
new file mode 100644
index 0000000..ddb02c6
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, 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 Foo {
+  final int x;
+  const Foo(this.x)
+      : assert(x > 0, "x is not positive"),
+        assert(x > 0),
+        assert(x > 0, ""),
+        assert(const bool.fromEnvironment("foo") == false,
+            "foo was ${const bool.fromEnvironment("foo")}"),
+        assert(const bool.fromEnvironment("foo") == false);
+  const Foo.withMessage(this.x)
+      : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+  const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+  const Foo.withInvalidCondition(this.x) : assert(x);
+  const Foo.withNullConditionFromEnv1(this.x)
+      : assert(bool.fromEnvironment("foo", defaultValue: null));
+  const Foo.withNullConditionFromEnv2(this.x)
+      : assert(const bool.fromEnvironment("foo", defaultValue: null));
+}
+
+class Bar {
+  final int x;
+  const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+  const Bar.withoutMessage(this.x) : assert(x < 0);
+  const Bar.withEmptyMessage(this.x) : assert(x < 0);
+}
+
+const Foo foo1 = const Foo(1);
+const Foo foo2 = const Foo(0);
+const Foo foo3 = const Foo.withMessage(42);
+const Foo foo4 = const Foo.withInvalidMessage(42);
+const Foo foo5 = const Foo.withInvalidCondition(42);
+const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+const Bar bar1 = const Bar.withMessage(1);
+const Bar bar2 = const Bar.withMessage(0);
+const Bar bar3 = const Bar.withoutMessage(1);
+const Bar bar4 = const Bar.withoutMessage(0);
+const Bar bar5 = const Bar.withEmptyMessage(1);
+const Bar bar6 = const Bar.withEmptyMessage(0);
+
+main() {
+  print(foo1);
+}
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect
new file mode 100644
index 0000000..a9222e8
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect
@@ -0,0 +1,97 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:19:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//       : assert(bool.fromEnvironment("foo", defaultValue: null));
+//                     ^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::>}(0), "x is not positive"), assert(x.{core::num::>}(0)), assert(x.{core::num::>}(0), ""), assert(const core::bool::fromEnvironment("foo").{core::Object::==}(false), "foo was ${const core::bool::fromEnvironment("foo")}"), assert(const core::bool::fromEnvironment("foo").{core::Object::==}(false)), super core::Object::•()
+    ;
+  const constructor withMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0), "btw foo was ${const core::bool::fromEnvironment("foo")}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0), x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError} core::bool*), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv1(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(const core::bool::fromEnvironment("foo", defaultValue: null)), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv2(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(const core::bool::fromEnvironment("foo", defaultValue: null)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor withMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0), "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+  const constructor withEmptyMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field self::Foo* foo1 = const self::Foo::•(1);
+static const field self::Foo* foo2 = const self::Foo::•(0);
+static const field self::Foo* foo3 = const self::Foo::withMessage(42);
+static const field self::Foo* foo4 = const self::Foo::withInvalidMessage(42);
+static const field self::Foo* foo5 = const self::Foo::withInvalidCondition(42);
+static const field self::Foo* foo6 = const self::Foo::withNullConditionFromEnv1(42);
+static const field self::Foo* foo7 = const self::Foo::withNullConditionFromEnv2(42);
+static const field self::Bar* bar1 = const self::Bar::withMessage(1);
+static const field self::Bar* bar2 = const self::Bar::withMessage(0);
+static const field self::Bar* bar3 = const self::Bar::withoutMessage(1);
+static const field self::Bar* bar4 = const self::Bar::withoutMessage(0);
+static const field self::Bar* bar5 = const self::Bar::withEmptyMessage(1);
+static const field self::Bar* bar6 = const self::Bar::withEmptyMessage(0);
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:11:50 -> BoolConstant(true)
+Evaluated: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:12:59 -> StringConstant("foo was false")
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:13:50 -> BoolConstant(true)
+Evaluated: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:15:73 -> StringConstant("btw foo was false")
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:19:21 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:21:22 -> NullConstant(null)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_asserts.dart:31:24 -> InstanceConstant(const Foo{Foo.x: 1})
+Extra constant evaluation: tries: 48, successes: 7
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.expect
new file mode 100644
index 0000000..5d77622
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.expect
@@ -0,0 +1,209 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:32:24: Error: Constant evaluation error:
+// const Foo foo2 = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:8:18: Context: This assertion failed with message: x is not positive
+//       : assert(x > 0, "x is not positive"),
+//                  ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:32:11: Context: While analyzing:
+// const Foo foo2 = const Foo(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:33:24: Error: Constant evaluation error:
+// const Foo foo3 = const Foo.withMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:15:18: Context: This assertion failed with message: btw foo was false
+//       : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+//                  ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:33:11: Context: While analyzing:
+// const Foo foo3 = const Foo.withMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:34:24: Error: Constant evaluation error:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+//   const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+//                                                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:34:11: Context: While analyzing:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:36:24: Error: Constant evaluation error:
+// const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:19:21: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+//       : assert(bool.fromEnvironment("foo", defaultValue: null));
+//                     ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:36:11: Context: While analyzing:
+// const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:37:24: Error: Constant evaluation error:
+// const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:21:22: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+//       : assert(const bool.fromEnvironment("foo", defaultValue: null));
+//                      ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:37:11: Context: While analyzing:
+// const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:38:24: Error: Constant evaluation error:
+// const Bar bar1 = const Bar.withMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:26:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:38:11: Context: While analyzing:
+// const Bar bar1 = const Bar.withMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:39:24: Error: Constant evaluation error:
+// const Bar bar2 = const Bar.withMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:26:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:39:11: Context: While analyzing:
+// const Bar bar2 = const Bar.withMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:40:24: Error: Constant evaluation error:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:27:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:40:11: Context: While analyzing:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:41:24: Error: Constant evaluation error:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:27:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:41:11: Context: While analyzing:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:42:24: Error: Constant evaluation error:
+// const Bar bar5 = const Bar.withEmptyMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:28:49: Context: This assertion failed.
+//   const Bar.withEmptyMessage(this.x) : assert(x < 0);
+//                                                 ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:42:11: Context: While analyzing:
+// const Bar bar5 = const Bar.withEmptyMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:43:24: Error: Constant evaluation error:
+// const Bar bar6 = const Bar.withEmptyMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:28:49: Context: This assertion failed.
+//   const Bar.withEmptyMessage(this.x) : assert(x < 0);
+//                                                 ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:43:11: Context: While analyzing:
+// const Bar bar6 = const Bar.withEmptyMessage(0);
+//           ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:19:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//       : assert(bool.fromEnvironment("foo", defaultValue: null));
+//                     ^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::>}(0), "x is not positive"), assert(x.{core::num::>}(0)), assert(x.{core::num::>}(0), ""), assert((#C1).{core::Object::==}(false), "foo was ${#C1}"), assert((#C1).{core::Object::==}(false)), super core::Object::•()
+    ;
+  const constructor withMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0), "btw foo was ${#C1}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0), x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError} core::bool*), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv1(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(#C2), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv2(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(#C2), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor withMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0), "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+  const constructor withEmptyMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field self::Foo* foo1 = #C4;
+static const field self::Foo* foo2 = invalid-expression "This assertion failed with message: x is not positive";
+static const field self::Foo* foo3 = invalid-expression "This assertion failed with message: btw foo was false";
+static const field self::Foo* foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo* foo5 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^";
+static const field self::Foo* foo6 = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field self::Foo* foo7 = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field self::Bar* bar1 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar* bar2 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar* bar3 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar4 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar5 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar6 = invalid-expression "This assertion failed.";
+static method main() → dynamic {
+  core::print(#C4);
+}
+
+constants  {
+  #C1 = false
+  #C2 = null
+  #C3 = 1
+  #C4 = self::Foo {x:#C3}
+}
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.transformed.expect
new file mode 100644
index 0000000..acaf574
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.strong.transformed.expect
@@ -0,0 +1,216 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:32:24: Error: Constant evaluation error:
+// const Foo foo2 = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:8:18: Context: This assertion failed with message: x is not positive
+//       : assert(x > 0, "x is not positive"),
+//                  ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:32:11: Context: While analyzing:
+// const Foo foo2 = const Foo(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:33:24: Error: Constant evaluation error:
+// const Foo foo3 = const Foo.withMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:15:18: Context: This assertion failed with message: btw foo was false
+//       : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+//                  ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:33:11: Context: While analyzing:
+// const Foo foo3 = const Foo.withMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:34:24: Error: Constant evaluation error:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+//   const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+//                                                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:34:11: Context: While analyzing:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:36:24: Error: Constant evaluation error:
+// const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:19:21: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+//       : assert(bool.fromEnvironment("foo", defaultValue: null));
+//                     ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:36:11: Context: While analyzing:
+// const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:37:24: Error: Constant evaluation error:
+// const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:21:22: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+//       : assert(const bool.fromEnvironment("foo", defaultValue: null));
+//                      ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:37:11: Context: While analyzing:
+// const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:38:24: Error: Constant evaluation error:
+// const Bar bar1 = const Bar.withMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:26:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:38:11: Context: While analyzing:
+// const Bar bar1 = const Bar.withMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:39:24: Error: Constant evaluation error:
+// const Bar bar2 = const Bar.withMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:26:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:39:11: Context: While analyzing:
+// const Bar bar2 = const Bar.withMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:40:24: Error: Constant evaluation error:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:27:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:40:11: Context: While analyzing:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:41:24: Error: Constant evaluation error:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:27:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:41:11: Context: While analyzing:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:42:24: Error: Constant evaluation error:
+// const Bar bar5 = const Bar.withEmptyMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:28:49: Context: This assertion failed.
+//   const Bar.withEmptyMessage(this.x) : assert(x < 0);
+//                                                 ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:42:11: Context: While analyzing:
+// const Bar bar5 = const Bar.withEmptyMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:43:24: Error: Constant evaluation error:
+// const Bar bar6 = const Bar.withEmptyMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:28:49: Context: This assertion failed.
+//   const Bar.withEmptyMessage(this.x) : assert(x < 0);
+//                                                 ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:43:11: Context: While analyzing:
+// const Bar bar6 = const Bar.withEmptyMessage(0);
+//           ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:19:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//       : assert(bool.fromEnvironment("foo", defaultValue: null));
+//                     ^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::>}(0), "x is not positive"), assert(x.{core::num::>}(0)), assert(x.{core::num::>}(0), ""), assert((#C1).{core::Object::==}(false), "foo was ${#C1}"), assert((#C1).{core::Object::==}(false)), super core::Object::•()
+    ;
+  const constructor withMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0), "btw foo was ${#C1}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0), x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError} core::bool*), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv1(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(#C2), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv2(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(#C2), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor withMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0), "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+  const constructor withEmptyMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field self::Foo* foo1 = #C4;
+static const field self::Foo* foo2 = invalid-expression "This assertion failed with message: x is not positive";
+static const field self::Foo* foo3 = invalid-expression "This assertion failed with message: btw foo was false";
+static const field self::Foo* foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo* foo5 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^";
+static const field self::Foo* foo6 = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field self::Foo* foo7 = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field self::Bar* bar1 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar* bar2 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar* bar3 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar4 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar5 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar6 = invalid-expression "This assertion failed.";
+static method main() → dynamic {
+  core::print(#C4);
+}
+
+constants  {
+  #C1 = false
+  #C2 = null
+  #C3 = 1
+  #C4 = self::Foo {x:#C3}
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:11:50 -> BoolConstant(true)
+Evaluated: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:12:59 -> StringConstant("foo was false")
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:13:50 -> BoolConstant(true)
+Evaluated: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:15:73 -> StringConstant("btw foo was false")
+Extra constant evaluation: tries: 34, successes: 4
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.textual_outline.expect
new file mode 100644
index 0000000..35c0fd4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.textual_outline.expect
@@ -0,0 +1,40 @@
+class Foo {
+  final int x;
+  const Foo(this.x)
+      : assert(x > 0, "x is not positive"),
+        assert(x > 0),
+        assert(x > 0, ""),
+        assert(const bool.fromEnvironment("foo") == false,
+            "foo was ${const bool.fromEnvironment("foo")}"),
+        assert(const bool.fromEnvironment("foo") == false);
+  const Foo.withMessage(this.x)
+      : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+  const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+  const Foo.withInvalidCondition(this.x) : assert(x);
+  const Foo.withNullConditionFromEnv1(this.x)
+      : assert(bool.fromEnvironment("foo", defaultValue: null));
+  const Foo.withNullConditionFromEnv2(this.x)
+      : assert(const bool.fromEnvironment("foo", defaultValue: null));
+}
+
+class Bar {
+  final int x;
+  const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+  const Bar.withoutMessage(this.x) : assert(x < 0);
+  const Bar.withEmptyMessage(this.x) : assert(x < 0);
+}
+
+const Foo foo1 = const Foo(1);
+const Foo foo2 = const Foo(0);
+const Foo foo3 = const Foo.withMessage(42);
+const Foo foo4 = const Foo.withInvalidMessage(42);
+const Foo foo5 = const Foo.withInvalidCondition(42);
+const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+const Bar bar1 = const Bar.withMessage(1);
+const Bar bar2 = const Bar.withMessage(0);
+const Bar bar3 = const Bar.withoutMessage(1);
+const Bar bar4 = const Bar.withoutMessage(0);
+const Bar bar5 = const Bar.withEmptyMessage(1);
+const Bar bar6 = const Bar.withEmptyMessage(0);
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..951c20d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.textual_outline_modelled.expect
@@ -0,0 +1,40 @@
+class Bar {
+  const Bar.withEmptyMessage(this.x) : assert(x < 0);
+  const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+  const Bar.withoutMessage(this.x) : assert(x < 0);
+  final int x;
+}
+
+class Foo {
+  const Foo(this.x)
+      : assert(x > 0, "x is not positive"),
+        assert(x > 0),
+        assert(x > 0, ""),
+        assert(const bool.fromEnvironment("foo") == false,
+            "foo was ${const bool.fromEnvironment("foo")}"),
+        assert(const bool.fromEnvironment("foo") == false);
+  const Foo.withInvalidCondition(this.x) : assert(x);
+  const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+  const Foo.withMessage(this.x)
+      : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+  const Foo.withNullConditionFromEnv1(this.x)
+      : assert(bool.fromEnvironment("foo", defaultValue: null));
+  const Foo.withNullConditionFromEnv2(this.x)
+      : assert(const bool.fromEnvironment("foo", defaultValue: null));
+  final int x;
+}
+
+const Bar bar1 = const Bar.withMessage(1);
+const Bar bar2 = const Bar.withMessage(0);
+const Bar bar3 = const Bar.withoutMessage(1);
+const Bar bar4 = const Bar.withoutMessage(0);
+const Bar bar5 = const Bar.withEmptyMessage(1);
+const Bar bar6 = const Bar.withEmptyMessage(0);
+const Foo foo1 = const Foo(1);
+const Foo foo2 = const Foo(0);
+const Foo foo3 = const Foo.withMessage(42);
+const Foo foo4 = const Foo.withInvalidMessage(42);
+const Foo foo5 = const Foo.withInvalidCondition(42);
+const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart b/pkg/front_end/testcases/general/constants/const_collections.dart
new file mode 100644
index 0000000..90a8445
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2020, 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.
+
+import 'dart:collection';
+
+class ConstIterable extends IterableBase<int> {
+  const ConstIterable();
+
+  Iterator<int> get iterator => <int>[].iterator;
+}
+
+const int fortyTwo = 42;
+const dynamic fortyTwoAsDynamic = ((fortyTwo as dynamic) * 2) ~/ 2;
+
+const List<String> nullList = null;
+const List<String> foo = ["hello", "world"];
+List<String> get fooAsGetter => const ["hello", "world"];
+const List<String> bar = [...foo, "!"];
+var barAsVar = [...foo, "!"];
+List<String> get barAsGetter => const [...foo, "!"];
+const List<String> barWithNullSpread = [...foo, ...nullList];
+const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+const List<String> barWithMapSpread = [...foo, ...quux];
+const List<String> barWithCustomIterableSpread1 = [
+  ...bar,
+  ...const CustomIterable()
+];
+const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+const customIterable = const CustomIterable();
+const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+const List<String> listConcat = ["Hello"] + ["World"];
+
+const Set<String> nullSet = null;
+const Set<String> baz = {"hello", "world"};
+Set<String> get bazAsGetter => const {"hello", "world"};
+const Set<String> qux = {...baz, "!"};
+Set<String> get quxAsGetter => const {...baz, "!"};
+const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+const Set<String> quxWithMapSpread = {...baz, ...quux};
+const Set<String> quxWithCustomIterableSpread1 = {
+  ...baz,
+  ...const CustomIterable()
+};
+const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+const Set<dynamic> setWithDuplicates = {42, 42};
+
+const Map<String, String> nullMap = null;
+const Map<String, String> quux = {"hello": "world"};
+Map<String, String> get quuxAsGetter => const {"hello": "world"};
+const Map<String, String> quuz = {...quux, "!": "bye!"};
+Map<String, String> get quuzAsGetter => const {...quux, "!": "bye!"};
+const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+const Map<String, String> mapWithSetSpread = {...baz};
+const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+const Map<String, String> customMap = const CustomMap();
+const Map<String, String> mapWithCustomMap3 = {...customMap};
+const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+  const WithEquals(42): 42
+};
+const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+
+class WithEquals {
+  final int i;
+  const WithEquals(this.i);
+  operator ==(Object o) {
+    return o is WithEquals && (o as WithEquals).i == i;
+  }
+}
+
+class CustomIterable extends IterableBase<String> {
+  const CustomIterable();
+  Iterator<String> get iterator => <String>[].iterator;
+}
+
+class CustomMap implements Map<String, String> {
+  const CustomMap();
+
+  @override
+  Iterable<MapEntry<String, String>> get entries => [];
+
+  @override
+  String operator [](Object key) => throw new UnimplementedError();
+
+  @override
+  void operator []=(String key, String value) => throw new UnimplementedError();
+
+  @override
+  Map<RK, RV> cast<RK, RV>() => throw new UnimplementedError();
+
+  @override
+  void clear() => throw new UnimplementedError();
+
+  @override
+  bool containsKey(Object key) => throw new UnimplementedError();
+
+  @override
+  bool containsValue(Object value) => throw new UnimplementedError();
+
+  @override
+  bool get isEmpty => throw new UnimplementedError();
+
+  @override
+  bool get isNotEmpty => throw new UnimplementedError();
+
+  @override
+  Iterable<String> get keys => throw new UnimplementedError();
+
+  @override
+  int get length => throw new UnimplementedError();
+
+  @override
+  String remove(Object key) => throw new UnimplementedError();
+
+  @override
+  Iterable<String> get values => throw new UnimplementedError();
+
+  @override
+  void addAll(Map<String, String> other) => throw new UnimplementedError();
+
+  @override
+  void addEntries(Iterable<MapEntry<String, String>> newEntries) =>
+      throw new UnimplementedError();
+
+  @override
+  void forEach(void f(String key, String value)) =>
+      throw new UnimplementedError();
+
+  @override
+  String putIfAbsent(String key, String ifAbsent()) =>
+      throw new UnimplementedError();
+
+  @override
+  void updateAll(String update(String key, String value)) =>
+      throw new UnimplementedError();
+
+  @override
+  void removeWhere(bool predicate(String key, String value)) =>
+      throw new UnimplementedError();
+
+  String update(String key, String update(String value), {String ifAbsent()}) =>
+      throw new UnimplementedError();
+
+  Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> f(String key, String value)) =>
+      throw new UnimplementedError();
+}
+
+main() {
+  print(bar);
+  print(qux);
+  print(quuz);
+  print({"hello"});
+  print(const {"hello"});
+}
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
new file mode 100644
index 0000000..59c28c6
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
@@ -0,0 +1,361 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+// const List<String> barWithMapSpread = [...foo, ...quux];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Expected ',' before this.
+// const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Set<String> quxWithMapSpread = {...baz, ...quux};
+//                                      ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+//  - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+// const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+//                                                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+//                                                            ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+//                                               ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> mapWithSetSpread = {...baz};
+//                                              ^
+//
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+import "dart:collection";
+
+class ConstIterable extends col::IterableBase<core::int*> /*hasConstConstructor*/  {
+  const constructor •() → self::ConstIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::int*>*
+    ;
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::int*>* other) → core::Iterable<core::int*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::int*) →* self::ConstIterable::map::T* f) → core::Iterable<self::ConstIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::int*) →* core::Iterable<self::ConstIterable::expand::T*>* f) → core::Iterable<self::ConstIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::int*) →* void f) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(generic-covariant-impl (core::int*, core::int*) →* core::int* combine) → core::int*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::ConstIterable::fold::T* initialValue, (self::ConstIterable::fold::T*, core::int*) →* self::ConstIterable::fold::T* combine) → self::ConstIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable}) → core::List<core::int*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::int*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse}) → core::int*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse}) → core::int*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse}) → core::int*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::int*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class WithEquals extends core::Object /*hasConstConstructor*/  {
+  final field core::int* i;
+  const constructor •(core::int* i) → self::WithEquals*
+    : self::WithEquals::i = i, super core::Object::•()
+    ;
+  operator ==(core::Object* o) → core::bool*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomIterable extends col::IterableBase<core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::String*>*
+    ;
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::String*>* other) → core::Iterable<core::String*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::String*) →* self::CustomIterable::map::T* f) → core::Iterable<self::CustomIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::String*) →* core::Iterable<self::CustomIterable::expand::T*>* f) → core::Iterable<self::CustomIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::String*) →* void f) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(generic-covariant-impl (core::String*, core::String*) →* core::String* combine) → core::String*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::CustomIterable::fold::T* initialValue, (self::CustomIterable::fold::T*, core::String*) →* self::CustomIterable::fold::T* combine) → self::CustomIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable}) → core::List<core::String*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::String*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse}) → core::String*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse}) → core::String*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse}) → core::String*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::String*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomMap extends core::Object implements core::Map<core::String*, core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomMap*
+    : super core::Object::•()
+    ;
+  @core::override
+  get entries() → core::Iterable<core::MapEntry<core::String*, core::String*>*>*
+    ;
+  @core::override
+  operator [](core::Object* key) → core::String*
+    ;
+  @core::override
+  operator []=(generic-covariant-impl core::String* key, generic-covariant-impl core::String* value) → void
+    ;
+  @core::override
+  method cast<RK extends core::Object* = dynamic, RV extends core::Object* = dynamic>() → core::Map<self::CustomMap::cast::RK*, self::CustomMap::cast::RV*>*
+    ;
+  @core::override
+  method clear() → void
+    ;
+  @core::override
+  method containsKey(core::Object* key) → core::bool*
+    ;
+  @core::override
+  method containsValue(core::Object* value) → core::bool*
+    ;
+  @core::override
+  get isEmpty() → core::bool*
+    ;
+  @core::override
+  get isNotEmpty() → core::bool*
+    ;
+  @core::override
+  get keys() → core::Iterable<core::String*>*
+    ;
+  @core::override
+  get length() → core::int*
+    ;
+  @core::override
+  method remove(core::Object* key) → core::String*
+    ;
+  @core::override
+  get values() → core::Iterable<core::String*>*
+    ;
+  @core::override
+  method addAll(generic-covariant-impl core::Map<core::String*, core::String*>* other) → void
+    ;
+  @core::override
+  method addEntries(generic-covariant-impl core::Iterable<core::MapEntry<core::String*, core::String*>*>* newEntries) → void
+    ;
+  @core::override
+  method forEach((core::String*, core::String*) →* void f) → void
+    ;
+  @core::override
+  method putIfAbsent(generic-covariant-impl core::String* key, generic-covariant-impl () →* core::String* ifAbsent) → core::String*
+    ;
+  @core::override
+  method updateAll(generic-covariant-impl (core::String*, core::String*) →* core::String* update) → void
+    ;
+  @core::override
+  method removeWhere((core::String*, core::String*) →* core::bool* predicate) → void
+    ;
+  method update(generic-covariant-impl core::String* key, generic-covariant-impl (core::String*) →* core::String* update, {generic-covariant-impl () →* core::String* ifAbsent}) → core::String*
+    ;
+  method map<K2 extends core::Object* = dynamic, V2 extends core::Object* = dynamic>((core::String*, core::String*) →* core::MapEntry<self::CustomMap::map::K2*, self::CustomMap::map::V2*>* f) → core::Map<self::CustomMap::map::K2*, self::CustomMap::map::V2*>*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* fortyTwo = 42;
+static const field dynamic fortyTwoAsDynamic = (self::fortyTwo as dynamic).*(2).~/(2);
+static const field core::List<core::String*>* nullList = null;
+static const field core::List<core::String*>* foo = const <core::String*>["hello", "world"];
+static const field core::List<core::String*>* bar = self::foo + const <core::String*>["!"];
+static field core::List<core::String*>* barAsVar;
+static const field core::List<core::String*>* barWithNullSpread = self::foo + self::nullList;
+static const field core::List<core::String*>* barWithIntSpread = self::foo + const <core::String*>[invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+                                                  ^"];
+static const field core::List<core::String*>* barWithIntDynamicSpread = self::foo + self::fortyTwoAsDynamic as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+static const field core::List<core::String*>* barWithMapSpread = self::foo + const <core::String*>[invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+const List<String> barWithMapSpread = [...foo, ...quux];
+                                                  ^"];
+static const field core::List<core::String*>* barWithCustomIterableSpread1 = self::bar + const self::CustomIterable::•();
+static const field core::List<core::String*>* barWithCustomIterableSpread2 = self::bar + const self::CustomIterable::•();
+static const field self::CustomIterable* customIterable = const self::CustomIterable::•();
+static const field core::List<core::String*>* barWithCustomIterableSpread3 = self::bar + self::customIterable;
+static const field core::List<core::String*>* listConcat = const <core::String*>["Hello"].{core::List::+}(const <core::String*>["World"]);
+static const field core::Set<core::String*>* nullSet = null;
+static const field core::Set<core::String*>* baz = const <core::String*>{"hello", "world"};
+static const field core::Set<core::String*>* qux = self::baz + const <core::String*>{"!"};
+static const field core::Set<core::String*>* quxWithNullSpread = self::baz + self::nullSet;
+static const field core::Set<core::String*>* quxWithIntSpread = self::baz + const <core::String*>{invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Expected ',' before this.
+const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+                                                 ^"};
+static const field core::Set<core::String*>* quxWithMapSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Set<String> quxWithMapSpread = {...baz, ...quux};
+                                     ^";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread1 = self::baz + const self::CustomIterable::•();
+static const field core::Set<core::String*>* quxWithCustomIterableSpread2 = self::baz + const self::CustomIterable::•();
+static const field core::Set<core::String*>* quxWithCustomIterableSpread3 = self::baz + const <core::String*>{let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+ - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+                                                          ^" in self::customIterable as{TypeError} core::String*};
+static const field core::Set<dynamic>* setWithNonPrimitiveEquals = const <dynamic>{const self::WithEquals::•(42)};
+static const field core::Set<dynamic>* setWithDuplicates = const <dynamic>{42, 42};
+static const field core::Map<core::String*, core::String*>* nullMap = null;
+static const field core::Map<core::String*, core::String*>* quux = const <core::String*, core::String*>{"hello": "world"};
+static const field core::Map<core::String*, core::String*>* quuz = self::quux + const <core::String*, core::String*>{"!": "bye!"};
+static const field core::Map<core::String*, core::String*>* quuzWithNullSpread = self::quux + self::nullMap;
+static const field core::Map<core::String*, core::String*>* quuzWithIntSpread = self::quux + const <core::String*, core::String*>{invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+                                                           ^": null};
+static const field core::Map<core::String*, core::String*>* quuzWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+                                              ^";
+static const field core::Map<core::String*, core::String*>* mapWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> mapWithSetSpread = {...baz};
+                                             ^";
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap1 = const self::CustomMap::•();
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap2 = const self::CustomMap::•();
+static const field core::Map<core::String*, core::String*>* customMap = const self::CustomMap::•();
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap3 = self::customMap;
+static const field core::Map<dynamic, core::int*>* mapWithNonPrimitiveEqualsKey = const <dynamic, core::int*>{const self::WithEquals::•(42): 42};
+static const field core::Map<core::int*, core::int*>* mapWithDuplicates = const <core::int*, core::int*>{42: 42, 42: 42};
+static get fooAsGetter() → core::List<core::String*>*
+  ;
+static get barAsGetter() → core::List<core::String*>*
+  ;
+static get bazAsGetter() → core::Set<core::String*>*
+  ;
+static get quxAsGetter() → core::Set<core::String*>*
+  ;
+static get quuxAsGetter() → core::Map<core::String*, core::String*>*
+  ;
+static get quuzAsGetter() → core::Map<core::String*, core::String*>*
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:86:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:89:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:92:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:95:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:98:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:101:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:104:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:107:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:110:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:113:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:116:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:119:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:122:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:125:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:128:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:132:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:136:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:140:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:144:4 -> InstanceConstant(const _Override{})
+Evaluated: MethodInvocation @ org-dartlang-testcase:///const_collections.dart:14:63 -> IntConstant(42)
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:17:26 -> ListConstant(const <String*>["hello", "world"])
+Evaluated: ListConcatenation @ org-dartlang-testcase:///const_collections.dart:19:26 -> ListConstant(const <String*>["hello", "world", "!"])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:22:44 -> ListConstant(const <String*>["hello", "world"])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:22:52 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:23:43 -> ListConstant(const <String*>["hello", "world"])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:24:50 -> ListConstant(const <String*>["hello", "world"])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:24:58 -> IntConstant(42)
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:25:43 -> ListConstant(const <String*>["hello", "world"])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:27:6 -> ListConstant(const <String*>["hello", "world", "!"])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:28:12 -> InstanceConstant(const CustomIterable{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:30:55 -> ListConstant(const <String*>["hello", "world", "!"])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:30:63 -> InstanceConstant(const CustomIterable{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:31:30 -> InstanceConstant(const CustomIterable{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:32:55 -> ListConstant(const <String*>["hello", "world", "!"])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:32:63 -> InstanceConstant(const CustomIterable{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:33:33 -> ListConstant(const <String*>["Hello"])
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:33:45 -> ListConstant(const <String*>["World"])
+Evaluated: SetLiteral @ org-dartlang-testcase:///const_collections.dart:36:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: SetConcatenation @ org-dartlang-testcase:///const_collections.dart:38:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null, "!", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:43 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:51 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:41:42 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:44:6 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:45:12 -> InstanceConstant(const CustomIterable{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:47:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:47:62 -> InstanceConstant(const CustomIterable{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:59 -> InstanceConstant(const CustomIterable{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:49:55 -> InstanceConstant(const WithEquals{WithEquals.i: 42})
+Evaluated: MapLiteral @ org-dartlang-testcase:///const_collections.dart:53:34 -> InstanceConstant(const _ImmutableMap<String*, String*>{_ImmutableMap._kvPairs: const <dynamic>["hello", "world"]})
+Evaluated: MapConcatenation @ org-dartlang-testcase:///const_collections.dart:55:27 -> InstanceConstant(const _ImmutableMap<String*, String*>{_ImmutableMap._kvPairs: const <dynamic>["hello", "world", "!", "bye!"]})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:57:52 -> InstanceConstant(const _ImmutableMap<String*, String*>{_ImmutableMap._kvPairs: const <dynamic>["hello", "world"]})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:57:61 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:58:51 -> InstanceConstant(const _ImmutableMap<String*, String*>{_ImmutableMap._kvPairs: const <dynamic>["hello", "world"]})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:61:57 -> InstanceConstant(const CustomMap{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:62:51 -> InstanceConstant(const CustomMap{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:63:45 -> InstanceConstant(const CustomMap{})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:64:51 -> InstanceConstant(const CustomMap{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:66:9 -> InstanceConstant(const WithEquals{WithEquals.i: 42})
+Extra constant evaluation: tries: 90, successes: 59
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
new file mode 100644
index 0000000..c6c94c1
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
@@ -0,0 +1,517 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:40: Error: Constant evaluation error:
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:52: Context: Null value during constant evaluation.
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                                                    ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:20: Context: While analyzing:
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:46: Error: Constant evaluation error:
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                                              ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:58: Context: Expected constant '42' to be of type 'Iterable<dynamic>', but was of type 'int'.
+//  - 'Iterable' is from 'dart:core'.
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                                                          ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:20: Context: While analyzing:
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:26:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread1 = [
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:28:12: Context: Only lists and sets can be used in spreads in constant lists and sets.
+//   ...const CustomIterable()
+//            ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:26:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread1 = [
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:63: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                                                               ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:63: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                                                               ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:43: Error: Constant evaluation error:
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:43: Context: The method '+' can't be invoked on '<String>["Hello"]' in a constant expression.
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:20: Context: While analyzing:
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:39: Error: Constant evaluation error:
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                                       ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:51: Context: Null value during constant evaluation.
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:19: Context: While analyzing:
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:43:50: Error: Constant evaluation error:
+// const Set<String> quxWithCustomIterableSpread1 = {
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:45:12: Context: Only lists and sets can be used in spreads in constant lists and sets.
+//   ...const CustomIterable()
+//            ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:43:19: Context: While analyzing:
+// const Set<String> quxWithCustomIterableSpread1 = {
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:50: Error: Constant evaluation error:
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:62: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                                                              ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:19: Context: While analyzing:
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:48: Error: Constant evaluation error:
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                                                ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:55: Context: The element 'WithEquals {i: 42}' does not have a primitive operator '=='.
+//  - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                                                       ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:20: Context: While analyzing:
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:40: Error: Constant evaluation error:
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:45: Context: The element '42' conflicts with another existing element in the set.
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                                             ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:20: Context: While analyzing:
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:27: Error: Constant evaluation error:
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:61: Context: Null value during constant evaluation.
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                                                             ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:27: Context: While analyzing:
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:57: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                                                         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:51: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:51: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:65:56: Error: Constant evaluation error:
+// const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+//                                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:66:9: Context: The key 'WithEquals {i: 42}' does not have a primitive operator '=='.
+//  - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+//   const WithEquals(42): 42
+//         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:65:25: Context: While analyzing:
+// const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:41: Error: Constant evaluation error:
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                                         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:50: Context: The key '42' conflicts with another existing key in the map.
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:21: Context: While analyzing:
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                     ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+// const List<String> barWithMapSpread = [...foo, ...quux];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Expected ',' before this.
+// const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Set<String> quxWithMapSpread = {...baz, ...quux};
+//                                      ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+//  - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+// const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+//                                                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+//                                                            ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+//                                               ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> mapWithSetSpread = {...baz};
+//                                              ^
+//
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+import "dart:collection";
+
+class ConstIterable extends col::IterableBase<core::int*> /*hasConstConstructor*/  {
+  const constructor •() → self::ConstIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::int*>*
+    return <core::int*>[].{core::Iterable::iterator};
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::int*>* other) → core::Iterable<core::int*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::int*) →* self::ConstIterable::map::T* f) → core::Iterable<self::ConstIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::int*) →* core::Iterable<self::ConstIterable::expand::T*>* f) → core::Iterable<self::ConstIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::int*) →* void f) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(generic-covariant-impl (core::int*, core::int*) →* core::int* combine) → core::int*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::ConstIterable::fold::T* initialValue, (self::ConstIterable::fold::T*, core::int*) →* self::ConstIterable::fold::T* combine) → self::ConstIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator = #C1]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable = #C2}) → core::List<core::int*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::int*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::int*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class WithEquals extends core::Object /*hasConstConstructor*/  {
+  final field core::int* i;
+  const constructor •(core::int* i) → self::WithEquals*
+    : self::WithEquals::i = i, super core::Object::•()
+    ;
+  operator ==(core::Object* o) → core::bool* {
+    return o is self::WithEquals* && (o{self::WithEquals*} as self::WithEquals*).{self::WithEquals::i}.{core::num::==}(this.{self::WithEquals::i});
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomIterable extends col::IterableBase<core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::String*>*
+    return <core::String*>[].{core::Iterable::iterator};
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::String*>* other) → core::Iterable<core::String*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::String*) →* self::CustomIterable::map::T* f) → core::Iterable<self::CustomIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::String*) →* core::Iterable<self::CustomIterable::expand::T*>* f) → core::Iterable<self::CustomIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::String*) →* void f) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(generic-covariant-impl (core::String*, core::String*) →* core::String* combine) → core::String*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::CustomIterable::fold::T* initialValue, (self::CustomIterable::fold::T*, core::String*) →* self::CustomIterable::fold::T* combine) → self::CustomIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator = #C1]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable = #C2}) → core::List<core::String*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::String*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::String*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomMap extends core::Object implements core::Map<core::String*, core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomMap*
+    : super core::Object::•()
+    ;
+  @#C4
+  get entries() → core::Iterable<core::MapEntry<core::String*, core::String*>*>*
+    return <core::MapEntry<core::String*, core::String*>*>[];
+  @#C4
+  operator [](core::Object* key) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  operator []=(generic-covariant-impl core::String* key, generic-covariant-impl core::String* value) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method cast<RK extends core::Object* = dynamic, RV extends core::Object* = dynamic>() → core::Map<self::CustomMap::cast::RK*, self::CustomMap::cast::RV*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method clear() → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method containsKey(core::Object* key) → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method containsValue(core::Object* value) → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get isEmpty() → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get isNotEmpty() → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get keys() → core::Iterable<core::String*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get length() → core::int*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method remove(core::Object* key) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get values() → core::Iterable<core::String*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method addAll(generic-covariant-impl core::Map<core::String*, core::String*>* other) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method addEntries(generic-covariant-impl core::Iterable<core::MapEntry<core::String*, core::String*>*>* newEntries) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method forEach((core::String*, core::String*) →* void f) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method putIfAbsent(generic-covariant-impl core::String* key, generic-covariant-impl () →* core::String* ifAbsent) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method updateAll(generic-covariant-impl (core::String*, core::String*) →* core::String* update) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method removeWhere((core::String*, core::String*) →* core::bool* predicate) → void
+    return throw new core::UnimplementedError::•();
+  method update(generic-covariant-impl core::String* key, generic-covariant-impl (core::String*) →* core::String* update, {generic-covariant-impl () →* core::String* ifAbsent = #C3}) → core::String*
+    return throw new core::UnimplementedError::•();
+  method map<K2 extends core::Object* = dynamic, V2 extends core::Object* = dynamic>((core::String*, core::String*) →* core::MapEntry<self::CustomMap::map::K2*, self::CustomMap::map::V2*>* f) → core::Map<self::CustomMap::map::K2*, self::CustomMap::map::V2*>*
+    return throw new core::UnimplementedError::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* fortyTwo = #C5;
+static const field dynamic fortyTwoAsDynamic = #C5;
+static const field core::List<core::String*>* nullList = #C3;
+static const field core::List<core::String*>* foo = #C8;
+static const field core::List<core::String*>* bar = #C10;
+static field core::List<core::String*>* barAsVar = block {
+  final core::List<core::String*>* #t1 = <core::String*>[];
+  for (final core::String* #t2 in #C8)
+    #t1.{core::List::add}(#t2);
+  #t1.{core::List::add}("!");
+} =>#t1;
+static const field core::List<core::String*>* barWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::List<core::String*>* barWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+                                                  ^";
+static const field core::List<core::String*>* barWithIntDynamicSpread = invalid-expression "Expected constant '42' to be of type 'Iterable<dynamic>', but was of type 'int'.
+ - 'Iterable' is from 'dart:core'.";
+static const field core::List<core::String*>* barWithMapSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+const List<String> barWithMapSpread = [...foo, ...quux];
+                                                  ^";
+static const field core::List<core::String*>* barWithCustomIterableSpread1 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::List<core::String*>* barWithCustomIterableSpread2 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field self::CustomIterable* customIterable = #C11;
+static const field core::List<core::String*>* barWithCustomIterableSpread3 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::List<core::String*>* listConcat = invalid-expression "The method '+' can't be invoked on '<String>[\"Hello\"]' in a constant expression.";
+static const field core::Set<core::String*>* nullSet = #C3;
+static const field core::Set<core::String*>* baz = #C14;
+static const field core::Set<core::String*>* qux = #C17;
+static const field core::Set<core::String*>* quxWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::Set<core::String*>* quxWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Expected ',' before this.
+const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+                                                 ^";
+static const field core::Set<core::String*>* quxWithMapSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Set<String> quxWithMapSpread = {...baz, ...quux};
+                                     ^";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread1 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread2 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread3 = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+ - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+                                                          ^";
+static const field core::Set<dynamic>* setWithNonPrimitiveEquals = invalid-expression "The element 'WithEquals {i: 42}' does not have a primitive operator '=='.
+ - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.";
+static const field core::Set<dynamic>* setWithDuplicates = invalid-expression "The element '42' conflicts with another existing element in the set.";
+static const field core::Map<core::String*, core::String*>* nullMap = #C3;
+static const field core::Map<core::String*, core::String*>* quux = #C19;
+static const field core::Map<core::String*, core::String*>* quuz = #C22;
+static const field core::Map<core::String*, core::String*>* quuzWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::Map<core::String*, core::String*>* quuzWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+                                                           ^";
+static const field core::Map<core::String*, core::String*>* quuzWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+                                              ^";
+static const field core::Map<core::String*, core::String*>* mapWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> mapWithSetSpread = {...baz};
+                                             ^";
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap1 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap2 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<core::String*, core::String*>* customMap = #C23;
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap3 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<dynamic, core::int*>* mapWithNonPrimitiveEqualsKey = invalid-expression "The key 'WithEquals {i: 42}' does not have a primitive operator '=='.
+ - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.";
+static const field core::Map<core::int*, core::int*>* mapWithDuplicates = invalid-expression "The key '42' conflicts with another existing key in the map.";
+static get fooAsGetter() → core::List<core::String*>*
+  return #C8;
+static get barAsGetter() → core::List<core::String*>*
+  return #C10;
+static get bazAsGetter() → core::Set<core::String*>*
+  return #C14;
+static get quxAsGetter() → core::Set<core::String*>*
+  return #C17;
+static get quuxAsGetter() → core::Map<core::String*, core::String*>*
+  return #C19;
+static get quuzAsGetter() → core::Map<core::String*, core::String*>*
+  return #C22;
+static method main() → dynamic {
+  core::print(#C10);
+  core::print(#C17);
+  core::print(#C22);
+  core::print(let final core::Set<core::String*>* #t3 = col::LinkedHashSet::•<core::String*>() in let final dynamic #t4 = #t3.{core::Set::add}("hello") in #t3);
+  core::print(#C26);
+}
+
+constants  {
+  #C1 = ""
+  #C2 = true
+  #C3 = null
+  #C4 = core::_Override {}
+  #C5 = 42
+  #C6 = "hello"
+  #C7 = "world"
+  #C8 = <core::String*>[#C6, #C7]
+  #C9 = "!"
+  #C10 = <core::String*>[#C6, #C7, #C9]
+  #C11 = self::CustomIterable {}
+  #C12 = <dynamic>[#C6, #C3, #C7, #C3]
+  #C13 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C12}
+  #C14 = col::_UnmodifiableSet<core::String*> {_map:#C13}
+  #C15 = <dynamic>[#C6, #C3, #C7, #C3, #C9, #C3]
+  #C16 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C15}
+  #C17 = col::_UnmodifiableSet<core::String*> {_map:#C16}
+  #C18 = <dynamic>[#C6, #C7]
+  #C19 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C18}
+  #C20 = "bye!"
+  #C21 = <dynamic>[#C6, #C7, #C9, #C20]
+  #C22 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C21}
+  #C23 = self::CustomMap {}
+  #C24 = <dynamic>[#C6, #C3]
+  #C25 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C24}
+  #C26 = col::_UnmodifiableSet<core::String*> {_map:#C25}
+}
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
new file mode 100644
index 0000000..0bbe0da
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
@@ -0,0 +1,522 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:40: Error: Constant evaluation error:
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:52: Context: Null value during constant evaluation.
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                                                    ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:20: Context: While analyzing:
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:46: Error: Constant evaluation error:
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                                              ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:58: Context: Expected constant '42' to be of type 'Iterable<dynamic>', but was of type 'int'.
+//  - 'Iterable' is from 'dart:core'.
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                                                          ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:20: Context: While analyzing:
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:26:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread1 = [
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:28:12: Context: Only lists and sets can be used in spreads in constant lists and sets.
+//   ...const CustomIterable()
+//            ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:26:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread1 = [
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:63: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                                                               ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:63: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                                                               ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:43: Error: Constant evaluation error:
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:43: Context: The method '+' can't be invoked on '<String>["Hello"]' in a constant expression.
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:20: Context: While analyzing:
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:39: Error: Constant evaluation error:
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                                       ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:51: Context: Null value during constant evaluation.
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:19: Context: While analyzing:
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:43:50: Error: Constant evaluation error:
+// const Set<String> quxWithCustomIterableSpread1 = {
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:45:12: Context: Only lists and sets can be used in spreads in constant lists and sets.
+//   ...const CustomIterable()
+//            ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:43:19: Context: While analyzing:
+// const Set<String> quxWithCustomIterableSpread1 = {
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:50: Error: Constant evaluation error:
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:62: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                                                              ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:19: Context: While analyzing:
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:48: Error: Constant evaluation error:
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                                                ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:55: Context: The element 'WithEquals {i: 42}' does not have a primitive operator '=='.
+//  - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                                                       ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:20: Context: While analyzing:
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:40: Error: Constant evaluation error:
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:45: Context: The element '42' conflicts with another existing element in the set.
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                                             ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:20: Context: While analyzing:
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:27: Error: Constant evaluation error:
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:61: Context: Null value during constant evaluation.
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                                                             ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:27: Context: While analyzing:
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:57: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                                                         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:51: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:51: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:65:56: Error: Constant evaluation error:
+// const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+//                                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:66:9: Context: The key 'WithEquals {i: 42}' does not have a primitive operator '=='.
+//  - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+//   const WithEquals(42): 42
+//         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:65:25: Context: While analyzing:
+// const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:41: Error: Constant evaluation error:
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                                         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:50: Context: The key '42' conflicts with another existing key in the map.
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:21: Context: While analyzing:
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                     ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+// const List<String> barWithMapSpread = [...foo, ...quux];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Expected ',' before this.
+// const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Set<String> quxWithMapSpread = {...baz, ...quux};
+//                                      ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+//  - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+// const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+//                                                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+//                                                            ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+//                                               ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> mapWithSetSpread = {...baz};
+//                                              ^
+//
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+import "dart:collection";
+
+class ConstIterable extends col::IterableBase<core::int*> /*hasConstConstructor*/  {
+  const constructor •() → self::ConstIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::int*>*
+    return <core::int*>[].{core::Iterable::iterator};
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::int*>* other) → core::Iterable<core::int*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::int*) →* self::ConstIterable::map::T* f) → core::Iterable<self::ConstIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::int*) →* core::Iterable<self::ConstIterable::expand::T*>* f) → core::Iterable<self::ConstIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::int*) →* void f) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(generic-covariant-impl (core::int*, core::int*) →* core::int* combine) → core::int*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::ConstIterable::fold::T* initialValue, (self::ConstIterable::fold::T*, core::int*) →* self::ConstIterable::fold::T* combine) → self::ConstIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator = #C1]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable = #C2}) → core::List<core::int*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::int*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::int*) →* core::bool* test, {generic-covariant-impl () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::int*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class WithEquals extends core::Object /*hasConstConstructor*/  {
+  final field core::int* i;
+  const constructor •(core::int* i) → self::WithEquals*
+    : self::WithEquals::i = i, super core::Object::•()
+    ;
+  operator ==(core::Object* o) → core::bool* {
+    return o is self::WithEquals* && o{self::WithEquals*}.{self::WithEquals::i}.{core::num::==}(this.{self::WithEquals::i});
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomIterable extends col::IterableBase<core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::String*>*
+    return <core::String*>[].{core::Iterable::iterator};
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(generic-covariant-impl core::Iterable<core::String*>* other) → core::Iterable<core::String*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::String*) →* self::CustomIterable::map::T* f) → core::Iterable<self::CustomIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::String*) →* core::Iterable<self::CustomIterable::expand::T*>* f) → core::Iterable<self::CustomIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::String*) →* void f) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(generic-covariant-impl (core::String*, core::String*) →* core::String* combine) → core::String*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::CustomIterable::fold::T* initialValue, (self::CustomIterable::fold::T*, core::String*) →* self::CustomIterable::fold::T* combine) → self::CustomIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator = #C1]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable = #C2}) → core::List<core::String*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::String*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::String*) →* core::bool* test, {generic-covariant-impl () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::String*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomMap extends core::Object implements core::Map<core::String*, core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomMap*
+    : super core::Object::•()
+    ;
+  @#C4
+  get entries() → core::Iterable<core::MapEntry<core::String*, core::String*>*>*
+    return <core::MapEntry<core::String*, core::String*>*>[];
+  @#C4
+  operator [](core::Object* key) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  operator []=(generic-covariant-impl core::String* key, generic-covariant-impl core::String* value) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method cast<RK extends core::Object* = dynamic, RV extends core::Object* = dynamic>() → core::Map<self::CustomMap::cast::RK*, self::CustomMap::cast::RV*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method clear() → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method containsKey(core::Object* key) → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method containsValue(core::Object* value) → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get isEmpty() → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get isNotEmpty() → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get keys() → core::Iterable<core::String*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get length() → core::int*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method remove(core::Object* key) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get values() → core::Iterable<core::String*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method addAll(generic-covariant-impl core::Map<core::String*, core::String*>* other) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method addEntries(generic-covariant-impl core::Iterable<core::MapEntry<core::String*, core::String*>*>* newEntries) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method forEach((core::String*, core::String*) →* void f) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method putIfAbsent(generic-covariant-impl core::String* key, generic-covariant-impl () →* core::String* ifAbsent) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method updateAll(generic-covariant-impl (core::String*, core::String*) →* core::String* update) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method removeWhere((core::String*, core::String*) →* core::bool* predicate) → void
+    return throw new core::UnimplementedError::•();
+  method update(generic-covariant-impl core::String* key, generic-covariant-impl (core::String*) →* core::String* update, {generic-covariant-impl () →* core::String* ifAbsent = #C3}) → core::String*
+    return throw new core::UnimplementedError::•();
+  method map<K2 extends core::Object* = dynamic, V2 extends core::Object* = dynamic>((core::String*, core::String*) →* core::MapEntry<self::CustomMap::map::K2*, self::CustomMap::map::V2*>* f) → core::Map<self::CustomMap::map::K2*, self::CustomMap::map::V2*>*
+    return throw new core::UnimplementedError::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* fortyTwo = #C5;
+static const field dynamic fortyTwoAsDynamic = #C5;
+static const field core::List<core::String*>* nullList = #C3;
+static const field core::List<core::String*>* foo = #C8;
+static const field core::List<core::String*>* bar = #C10;
+static field core::List<core::String*>* barAsVar = block {
+  final core::List<core::String*>* #t1 = <core::String*>[];
+  {
+    core::Iterator<core::String*>* :sync-for-iterator = (#C8).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::String* #t2 = :sync-for-iterator.{core::Iterator::current};
+      #t1.{core::List::add}(#t2);
+    }
+  }
+  #t1.{core::List::add}("!");
+} =>#t1;
+static const field core::List<core::String*>* barWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::List<core::String*>* barWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+                                                  ^";
+static const field core::List<core::String*>* barWithIntDynamicSpread = invalid-expression "Expected constant '42' to be of type 'Iterable<dynamic>', but was of type 'int'.
+ - 'Iterable' is from 'dart:core'.";
+static const field core::List<core::String*>* barWithMapSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+const List<String> barWithMapSpread = [...foo, ...quux];
+                                                  ^";
+static const field core::List<core::String*>* barWithCustomIterableSpread1 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::List<core::String*>* barWithCustomIterableSpread2 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field self::CustomIterable* customIterable = #C11;
+static const field core::List<core::String*>* barWithCustomIterableSpread3 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::List<core::String*>* listConcat = invalid-expression "The method '+' can't be invoked on '<String>[\"Hello\"]' in a constant expression.";
+static const field core::Set<core::String*>* nullSet = #C3;
+static const field core::Set<core::String*>* baz = #C14;
+static const field core::Set<core::String*>* qux = #C17;
+static const field core::Set<core::String*>* quxWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::Set<core::String*>* quxWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Expected ',' before this.
+const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+                                                 ^";
+static const field core::Set<core::String*>* quxWithMapSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Set<String> quxWithMapSpread = {...baz, ...quux};
+                                     ^";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread1 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread2 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread3 = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+ - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+                                                          ^";
+static const field core::Set<dynamic>* setWithNonPrimitiveEquals = invalid-expression "The element 'WithEquals {i: 42}' does not have a primitive operator '=='.
+ - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.";
+static const field core::Set<dynamic>* setWithDuplicates = invalid-expression "The element '42' conflicts with another existing element in the set.";
+static const field core::Map<core::String*, core::String*>* nullMap = #C3;
+static const field core::Map<core::String*, core::String*>* quux = #C19;
+static const field core::Map<core::String*, core::String*>* quuz = #C22;
+static const field core::Map<core::String*, core::String*>* quuzWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::Map<core::String*, core::String*>* quuzWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+                                                           ^";
+static const field core::Map<core::String*, core::String*>* quuzWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+                                              ^";
+static const field core::Map<core::String*, core::String*>* mapWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> mapWithSetSpread = {...baz};
+                                             ^";
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap1 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap2 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<core::String*, core::String*>* customMap = #C23;
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap3 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<dynamic, core::int*>* mapWithNonPrimitiveEqualsKey = invalid-expression "The key 'WithEquals {i: 42}' does not have a primitive operator '=='.
+ - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.";
+static const field core::Map<core::int*, core::int*>* mapWithDuplicates = invalid-expression "The key '42' conflicts with another existing key in the map.";
+static get fooAsGetter() → core::List<core::String*>*
+  return #C8;
+static get barAsGetter() → core::List<core::String*>*
+  return #C10;
+static get bazAsGetter() → core::Set<core::String*>*
+  return #C14;
+static get quxAsGetter() → core::Set<core::String*>*
+  return #C17;
+static get quuxAsGetter() → core::Map<core::String*, core::String*>*
+  return #C19;
+static get quuzAsGetter() → core::Map<core::String*, core::String*>*
+  return #C22;
+static method main() → dynamic {
+  core::print(#C10);
+  core::print(#C17);
+  core::print(#C22);
+  core::print(let final core::Set<core::String*>* #t3 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t4 = #t3.{core::Set::add}("hello") in #t3);
+  core::print(#C26);
+}
+
+constants  {
+  #C1 = ""
+  #C2 = true
+  #C3 = null
+  #C4 = core::_Override {}
+  #C5 = 42
+  #C6 = "hello"
+  #C7 = "world"
+  #C8 = <core::String*>[#C6, #C7]
+  #C9 = "!"
+  #C10 = <core::String*>[#C6, #C7, #C9]
+  #C11 = self::CustomIterable {}
+  #C12 = <dynamic>[#C6, #C3, #C7, #C3]
+  #C13 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C12}
+  #C14 = col::_UnmodifiableSet<core::String*> {_map:#C13}
+  #C15 = <dynamic>[#C6, #C3, #C7, #C3, #C9, #C3]
+  #C16 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C15}
+  #C17 = col::_UnmodifiableSet<core::String*> {_map:#C16}
+  #C18 = <dynamic>[#C6, #C7]
+  #C19 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C18}
+  #C20 = "bye!"
+  #C21 = <dynamic>[#C6, #C7, #C9, #C20]
+  #C22 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C21}
+  #C23 = self::CustomMap {}
+  #C24 = <dynamic>[#C6, #C3]
+  #C25 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C24}
+  #C26 = col::_UnmodifiableSet<core::String*> {_map:#C25}
+}
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.textual_outline.expect
new file mode 100644
index 0000000..1b2ee83
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.textual_outline.expect
@@ -0,0 +1,124 @@
+import 'dart:collection';
+
+class ConstIterable extends IterableBase<int> {
+  const ConstIterable();
+  Iterator<int> get iterator => <int>[].iterator;
+}
+
+const int fortyTwo = 42;
+const dynamic fortyTwoAsDynamic = ((fortyTwo as dynamic) * 2) ~/ 2;
+const List<String> nullList = null;
+const List<String> foo = ["hello", "world"];
+List<String> get fooAsGetter => const ["hello", "world"];
+const List<String> bar = [...foo, "!"];
+var barAsVar = [...foo, "!"];
+List<String> get barAsGetter => const [...foo, "!"];
+const List<String> barWithNullSpread = [...foo, ...nullList];
+const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+const List<String> barWithMapSpread = [...foo, ...quux];
+const List<String> barWithCustomIterableSpread1 = [
+  ...bar,
+  ...const CustomIterable()
+];
+const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+const customIterable = const CustomIterable();
+const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+const List<String> listConcat = ["Hello"] + ["World"];
+const Set<String> nullSet = null;
+const Set<String> baz = {"hello", "world"};
+Set<String> get bazAsGetter => const {"hello", "world"};
+const Set<String> qux = {...baz, "!"};
+Set<String> get quxAsGetter => const {...baz, "!"};
+const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+const Set<String> quxWithMapSpread = {...baz, ...quux};
+const Set<String> quxWithCustomIterableSpread1 = {
+  ...baz,
+  ...const CustomIterable()
+};
+const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+const Set<dynamic> setWithDuplicates = {42, 42};
+const Map<String, String> nullMap = null;
+const Map<String, String> quux = {"hello": "world"};
+Map<String, String> get quuxAsGetter => const {"hello": "world"};
+const Map<String, String> quuz = {...quux, "!": "bye!"};
+Map<String, String> get quuzAsGetter => const {...quux, "!": "bye!"};
+const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+const Map<String, String> mapWithSetSpread = {...baz};
+const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+const Map<String, String> customMap = const CustomMap();
+const Map<String, String> mapWithCustomMap3 = {...customMap};
+const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+  const WithEquals(42): 42
+};
+const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+
+class WithEquals {
+  final int i;
+  const WithEquals(this.i);
+  operator ==(Object o) {}
+}
+
+class CustomIterable extends IterableBase<String> {
+  const CustomIterable();
+  Iterator<String> get iterator => <String>[].iterator;
+}
+
+class CustomMap implements Map<String, String> {
+  const CustomMap();
+  @override
+  Iterable<MapEntry<String, String>> get entries => [];
+  @override
+  String operator [](Object key) => throw new UnimplementedError();
+  @override
+  void operator []=(String key, String value) => throw new UnimplementedError();
+  @override
+  Map<RK, RV> cast<RK, RV>() => throw new UnimplementedError();
+  @override
+  void clear() => throw new UnimplementedError();
+  @override
+  bool containsKey(Object key) => throw new UnimplementedError();
+  @override
+  bool containsValue(Object value) => throw new UnimplementedError();
+  @override
+  bool get isEmpty => throw new UnimplementedError();
+  @override
+  bool get isNotEmpty => throw new UnimplementedError();
+  @override
+  Iterable<String> get keys => throw new UnimplementedError();
+  @override
+  int get length => throw new UnimplementedError();
+  @override
+  String remove(Object key) => throw new UnimplementedError();
+  @override
+  Iterable<String> get values => throw new UnimplementedError();
+  @override
+  void addAll(Map<String, String> other) => throw new UnimplementedError();
+  @override
+  void addEntries(Iterable<MapEntry<String, String>> newEntries) =>
+      throw new UnimplementedError();
+  @override
+  void forEach(void f(String key, String value)) =>
+      throw new UnimplementedError();
+  @override
+  String putIfAbsent(String key, String ifAbsent()) =>
+      throw new UnimplementedError();
+  @override
+  void updateAll(String update(String key, String value)) =>
+      throw new UnimplementedError();
+  @override
+  void removeWhere(bool predicate(String key, String value)) =>
+      throw new UnimplementedError();
+  String update(String key, String update(String value), {String ifAbsent()}) =>
+      throw new UnimplementedError();
+  Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> f(String key, String value)) =>
+      throw new UnimplementedError();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..97ae580
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.textual_outline_modelled.expect
@@ -0,0 +1,124 @@
+import 'dart:collection';
+
+List<String> get barAsGetter => const [...foo, "!"];
+List<String> get fooAsGetter => const ["hello", "world"];
+Map<String, String> get quuxAsGetter => const {"hello": "world"};
+Map<String, String> get quuzAsGetter => const {...quux, "!": "bye!"};
+Set<String> get bazAsGetter => const {"hello", "world"};
+Set<String> get quxAsGetter => const {...baz, "!"};
+
+class ConstIterable extends IterableBase<int> {
+  Iterator<int> get iterator => <int>[].iterator;
+  const ConstIterable();
+}
+
+class CustomIterable extends IterableBase<String> {
+  Iterator<String> get iterator => <String>[].iterator;
+  const CustomIterable();
+}
+
+class CustomMap implements Map<String, String> {
+  @override
+  Iterable<MapEntry<String, String>> get entries => [];
+  @override
+  Iterable<String> get keys => throw new UnimplementedError();
+  @override
+  Iterable<String> get values => throw new UnimplementedError();
+  Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> f(String key, String value)) =>
+      throw new UnimplementedError();
+  @override
+  Map<RK, RV> cast<RK, RV>() => throw new UnimplementedError();
+  @override
+  String operator [](Object key) => throw new UnimplementedError();
+  @override
+  String putIfAbsent(String key, String ifAbsent()) =>
+      throw new UnimplementedError();
+  @override
+  String remove(Object key) => throw new UnimplementedError();
+  String update(String key, String update(String value), {String ifAbsent()}) =>
+      throw new UnimplementedError();
+  @override
+  bool containsKey(Object key) => throw new UnimplementedError();
+  @override
+  bool containsValue(Object value) => throw new UnimplementedError();
+  @override
+  bool get isEmpty => throw new UnimplementedError();
+  @override
+  bool get isNotEmpty => throw new UnimplementedError();
+  const CustomMap();
+  @override
+  int get length => throw new UnimplementedError();
+  @override
+  void addAll(Map<String, String> other) => throw new UnimplementedError();
+  @override
+  void addEntries(Iterable<MapEntry<String, String>> newEntries) =>
+      throw new UnimplementedError();
+  @override
+  void clear() => throw new UnimplementedError();
+  @override
+  void forEach(void f(String key, String value)) =>
+      throw new UnimplementedError();
+  @override
+  void operator []=(String key, String value) => throw new UnimplementedError();
+  @override
+  void removeWhere(bool predicate(String key, String value)) =>
+      throw new UnimplementedError();
+  @override
+  void updateAll(String update(String key, String value)) =>
+      throw new UnimplementedError();
+}
+
+class WithEquals {
+  const WithEquals(this.i);
+  final int i;
+  operator ==(Object o) {}
+}
+
+const List<String> bar = [...foo, "!"];
+const List<String> barWithCustomIterableSpread1 = [
+  ...bar,
+  ...const CustomIterable()
+];
+const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+const List<String> barWithMapSpread = [...foo, ...quux];
+const List<String> barWithNullSpread = [...foo, ...nullList];
+const List<String> foo = ["hello", "world"];
+const List<String> listConcat = ["Hello"] + ["World"];
+const List<String> nullList = null;
+const Map<String, String> customMap = const CustomMap();
+const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+const Map<String, String> mapWithCustomMap3 = {...customMap};
+const Map<String, String> mapWithSetSpread = {...baz};
+const Map<String, String> nullMap = null;
+const Map<String, String> quux = {"hello": "world"};
+const Map<String, String> quuz = {...quux, "!": "bye!"};
+const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+  const WithEquals(42): 42
+};
+const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+const Set<String> baz = {"hello", "world"};
+const Set<String> nullSet = null;
+const Set<String> qux = {...baz, "!"};
+const Set<String> quxWithCustomIterableSpread1 = {
+  ...baz,
+  ...const CustomIterable()
+};
+const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+const Set<String> quxWithMapSpread = {...baz, ...quux};
+const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+const Set<dynamic> setWithDuplicates = {42, 42};
+const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+const customIterable = const CustomIterable();
+const dynamic fortyTwoAsDynamic = ((fortyTwo as dynamic) * 2) ~/ 2;
+const int fortyTwo = 42;
+main() {}
+var barAsVar = [...foo, "!"];
diff --git a/pkg/front_end/testcases/general/constants/folder.options b/pkg/front_end/testcases/general/constants/folder.options
new file mode 100644
index 0000000..0cbe954
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/folder.options
@@ -0,0 +1,4 @@
+--enable-experiment=triple-shift
+-Dbaz=42
+-DbazTrue=true
+-DbazFalse=false
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/folder.options b/pkg/front_end/testcases/general/constants/js_semantics/folder.options
new file mode 100644
index 0000000..674c362
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/folder.options
@@ -0,0 +1,2 @@
+--enable-experiment=triple-shift
+--target=noneWithJs
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart
new file mode 100644
index 0000000..618b0a5
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, 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.
+
+const int shiftNegative1 = 2 << -1;
+const int shiftNegative2 = 2 >>> -1;
+const int shiftNegative3 = 2 >> -1;
+const int modZero = 2 % 0;
+const int divZero = 2 / 0;
+const int intdivZero = 2 ~/ 0;
+const int unaryMinus = -2;
+const int unaryTilde = ~2;
+const int unaryPlus = +2;
+
+const int binaryPlus = 40 + 2;
+const int binaryMinus = 44 - 2;
+const int binaryTimes = 21 * 2;
+const double binaryDiv = 84 / 2;
+const int binaryTildeDiv = 84~/ 2;
+const int binaryMod = 85 % 43;
+const int binaryOr = 32 | 10;
+const int binaryAnd = 63 & 106;
+const int binaryXor = 63 ^ 21;
+const int binaryShift1 = 21 << 1;
+
+// These aren't currently defined on int :(.
+const int binaryShift2 = 84 >>> 1;
+const int binaryShift3 = 21 >>> 64;
+
+const int binaryShift4 = 84 >> 1;
+const int binaryShift5 = -1 >> 1;
+const bool binaryLess = 42 < 42;
+const bool binaryLessEqual = 42 <= 42;
+const bool binaryGreaterEqual = 42 >= 42;
+const bool binaryGreater = 42 > 42;
+
+const int doubleTruncateDiv = 84.2 ~/ 2;
+const int doubleTruncateDivZero = 84.2 ~/ 0;
+const int doubleTruncateDivNull = 84.2 ~/ null;
+const double doubleNan = 0/0;
+const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+
+const int bigNumber = 0x8000000000000000;
+
+main() {
+
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.outline.expect
new file mode 100644
index 0000000..e31b315
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.outline.expect
@@ -0,0 +1,107 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift2 = 84 >>> 1;
+//                             ^^^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift3 = 21 >>> 64;
+//                             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = 2.{core::int::<<}(1.{core::int::unary-}());
+static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int shiftNegative2 = 2 >>> -1;
+                             ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* shiftNegative3 = 2.{core::int::>>}(1.{core::int::unary-}());
+static const field core::int* modZero = 2.{core::num::%}(0);
+static const field core::int* divZero = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^" in 2.{core::num::/}(0) as{TypeError} core::int*;
+static const field core::int* intdivZero = 2.{core::num::~/}(0);
+static const field core::int* unaryMinus = 2.{core::int::unary-}();
+static const field core::int* unaryTilde = 2.{core::int::~}();
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^".+(2) as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryPlus = 40.{core::num::+}(2);
+static const field core::int* binaryMinus = 44.{core::num::-}(2);
+static const field core::int* binaryTimes = 21.{core::num::*}(2);
+static const field core::double* binaryDiv = 84.{core::num::/}(2);
+static const field core::int* binaryTildeDiv = 84.{core::num::~/}(2);
+static const field core::int* binaryMod = 85.{core::num::%}(43);
+static const field core::int* binaryOr = 32.{core::int::|}(10);
+static const field core::int* binaryAnd = 63.{core::int::&}(106);
+static const field core::int* binaryXor = 63.{core::int::^}(21);
+static const field core::int* binaryShift1 = 21.{core::int::<<}(1);
+static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift2 = 84 >>> 1;
+                            ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift3 = 21 >>> 64;
+                            ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryShift4 = 84.{core::int::>>}(1);
+static const field core::int* binaryShift5 = 1.{core::int::unary-}().{core::int::>>}(1);
+static const field core::bool* binaryLess = 42.{core::num::<}(42);
+static const field core::bool* binaryLessEqual = 42.{core::num::<=}(42);
+static const field core::bool* binaryGreaterEqual = 42.{core::num::>=}(42);
+static const field core::bool* binaryGreater = 42.{core::num::>}(42);
+static const field core::int* doubleTruncateDiv = 84.2.{core::double::~/}(2);
+static const field core::int* doubleTruncateDivZero = 84.2.{core::double::~/}(0);
+static const field core::int* doubleTruncateDivNull = 84.2.{core::double::~/}(null);
+static const field core::double* doubleNan = 0.{core::num::/}(0);
+static const field core::int* doubleTruncateDivNaN = 84.2.{core::double::~/}(self::doubleNan);
+static const field core::int* bigNumber = -9223372036854775808;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:5:33 -> DoubleConstant(-1.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:7:33 -> DoubleConstant(-1.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:9:23 -> DoubleConstant(Infinity)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:11:24 -> DoubleConstant(-2.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:12:24 -> DoubleConstant(4294967293.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:15:27 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:16:28 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:17:28 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:18:29 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:19:30 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:20:26 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:21:25 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:22:26 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:23:26 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:24:29 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:30:29 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:31:29 -> DoubleConstant(4294967295.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:32:28 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:33:33 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:34:36 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:35:31 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:37:36 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:40:27 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///number_folds.dart:41:42 -> DoubleConstant(NaN)
+Extra constant evaluation: tries: 38, successes: 24
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.strong.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.strong.expect
new file mode 100644
index 0000000..351a41d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.strong.expect
@@ -0,0 +1,162 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Context: Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Context: Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:23: Context: Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:26: Context: Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:38:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:38:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:38:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift2 = 84 >>> 1;
+//                             ^^^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift3 = 21 >>> 64;
+//                             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int shiftNegative2 = 2 >>> -1;
+                             ^^^";
+static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int* modZero = invalid-expression "Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int* intdivZero = invalid-expression "Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* unaryMinus = #C1;
+static const field core::int* unaryTilde = #C2;
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int* binaryPlus = #C3;
+static const field core::int* binaryMinus = #C3;
+static const field core::int* binaryTimes = #C3;
+static const field core::double* binaryDiv = #C3;
+static const field core::int* binaryTildeDiv = #C3;
+static const field core::int* binaryMod = #C3;
+static const field core::int* binaryOr = #C3;
+static const field core::int* binaryAnd = #C3;
+static const field core::int* binaryXor = #C3;
+static const field core::int* binaryShift1 = #C3;
+static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift2 = 84 >>> 1;
+                            ^^^";
+static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift3 = 21 >>> 64;
+                            ^^^";
+static const field core::int* binaryShift4 = #C3;
+static const field core::int* binaryShift5 = #C4;
+static const field core::bool* binaryLess = #C5;
+static const field core::bool* binaryLessEqual = #C6;
+static const field core::bool* binaryGreaterEqual = #C6;
+static const field core::bool* binaryGreater = #C5;
+static const field core::int* doubleTruncateDiv = #C3;
+static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double* doubleNan = #C7;
+static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static const field core::int* bigNumber = #C8;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2.0
+  #C2 = 4294967293.0
+  #C3 = 42.0
+  #C4 = 4294967295.0
+  #C5 = false
+  #C6 = true
+  #C7 = NaN
+  #C8 = 9223372036854776000.0
+}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.strong.transformed.expect
new file mode 100644
index 0000000..351a41d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.strong.transformed.expect
@@ -0,0 +1,162 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Context: Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Context: Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:23: Context: Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:26: Context: Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:38:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:38:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:38:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift2 = 84 >>> 1;
+//                             ^^^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift3 = 21 >>> 64;
+//                             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int shiftNegative2 = 2 >>> -1;
+                             ^^^";
+static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int* modZero = invalid-expression "Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int* intdivZero = invalid-expression "Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* unaryMinus = #C1;
+static const field core::int* unaryTilde = #C2;
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int* binaryPlus = #C3;
+static const field core::int* binaryMinus = #C3;
+static const field core::int* binaryTimes = #C3;
+static const field core::double* binaryDiv = #C3;
+static const field core::int* binaryTildeDiv = #C3;
+static const field core::int* binaryMod = #C3;
+static const field core::int* binaryOr = #C3;
+static const field core::int* binaryAnd = #C3;
+static const field core::int* binaryXor = #C3;
+static const field core::int* binaryShift1 = #C3;
+static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift2 = 84 >>> 1;
+                            ^^^";
+static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift3 = 21 >>> 64;
+                            ^^^";
+static const field core::int* binaryShift4 = #C3;
+static const field core::int* binaryShift5 = #C4;
+static const field core::bool* binaryLess = #C5;
+static const field core::bool* binaryLessEqual = #C6;
+static const field core::bool* binaryGreaterEqual = #C6;
+static const field core::bool* binaryGreater = #C5;
+static const field core::int* doubleTruncateDiv = #C3;
+static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double* doubleNan = #C7;
+static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static const field core::int* bigNumber = #C8;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2.0
+  #C2 = 4294967293.0
+  #C3 = 42.0
+  #C4 = 4294967295.0
+  #C5 = false
+  #C6 = true
+  #C7 = NaN
+  #C8 = 9223372036854776000.0
+}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.textual_outline.expect
new file mode 100644
index 0000000..cb5607d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.textual_outline.expect
@@ -0,0 +1,34 @@
+const int shiftNegative1 = 2 << -1;
+const int shiftNegative2 = 2 >>> -1;
+const int shiftNegative3 = 2 >> -1;
+const int modZero = 2 % 0;
+const int divZero = 2 / 0;
+const int intdivZero = 2 ~/ 0;
+const int unaryMinus = -2;
+const int unaryTilde = ~2;
+const int unaryPlus = +2;
+const int binaryPlus = 40 + 2;
+const int binaryMinus = 44 - 2;
+const int binaryTimes = 21 * 2;
+const double binaryDiv = 84 / 2;
+const int binaryTildeDiv = 84~/ 2;
+const int binaryMod = 85 % 43;
+const int binaryOr = 32 | 10;
+const int binaryAnd = 63 & 106;
+const int binaryXor = 63 ^ 21;
+const int binaryShift1 = 21 << 1;
+const int binaryShift2 = 84 >>> 1;
+const int binaryShift3 = 21 >>> 64;
+const int binaryShift4 = 84 >> 1;
+const int binaryShift5 = -1 >> 1;
+const bool binaryLess = 42 < 42;
+const bool binaryLessEqual = 42 <= 42;
+const bool binaryGreaterEqual = 42 >= 42;
+const bool binaryGreater = 42 > 42;
+const int doubleTruncateDiv = 84.2 ~/ 2;
+const int doubleTruncateDivZero = 84.2 ~/ 0;
+const int doubleTruncateDivNull = 84.2 ~/ null;
+const double doubleNan = 0/0;
+const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+const int bigNumber = 0x8000000000000000;
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart b/pkg/front_end/testcases/general/constants/js_semantics/various.dart
new file mode 100644
index 0000000..f2270ff
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, 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.
+
+const bool y = false;
+const bool z = !(y);
+
+const maybeInt = z ? 42 : true;
+const bool isItInt = maybeInt is int ? true : false;
+const bool isItDouble = maybeInt is double ? true : false;
+
+const int actualInt = 42;
+const bool isItInt2 = actualInt is int ? true : false;
+const bool isItDouble2 = actualInt is double ? true : false;
+
+const maybeDouble = z ? 42.0 : true;
+const bool isItInt3 = maybeDouble is int ? true : false;
+const bool isItDouble3 = maybeDouble is double ? true : false;
+
+const double actualDouble = 42.0;
+const bool isItInt4 = actualDouble is int ? true : false;
+const bool isItDouble4 = actualDouble is double ? true : false;
+
+const maybeDouble2 = z ? 42.42 : true;
+const bool isItInt5 = maybeDouble2 is int ? true : false;
+const bool isItDouble5 = maybeDouble2 is double ? true : false;
+
+const double actualDouble2 = 42.42;
+const bool isItInt6 = actualDouble2 is int ? true : false;
+const bool isItDouble7 = actualDouble2 is double ? true : false;
+
+const zeroPointZeroIdentical = identical(0.0, 0.0);
+const zeroPointZeroIdenticalToZero = identical(0.0, 0);
+const zeroIdenticalToZeroPointZero = identical(0, 0.0);
+const nanIdentical = identical(0 / 0, 0 / 0);
+const stringIdentical = identical("hello", "hello");
+const string2Identical = identical("hello", "world");
+
+const zeroPointZeroEqual = 0.0 == 0.0;
+const zeroPointZeroEqualToZero = 0.0 == 0;
+const zeroEqualToZeroPointZero = 0 == 0.0;
+const nanEqual = 0 / 0 == 0 / 0;
+const stringEqual = "hello" == "hello";
+const string2Equal = "hello" == "world";
+
+const int intFortyTwo = 42;
+const String intStringConcat = "hello" "${intFortyTwo * intFortyTwo}";
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.outline.expect
new file mode 100644
index 0000000..4897983
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.outline.expect
@@ -0,0 +1,71 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::bool* y = false;
+static const field core::bool* z = !self::y;
+static const field core::Object* maybeInt = self::z ?{core::Object*} 42 : true;
+static const field core::bool* isItInt = self::maybeInt is core::int* ?{core::bool*} true : false;
+static const field core::bool* isItDouble = self::maybeInt is core::double* ?{core::bool*} true : false;
+static const field core::int* actualInt = 42;
+static const field core::bool* isItInt2 = self::actualInt is core::int* ?{core::bool*} true : false;
+static const field core::bool* isItDouble2 = self::actualInt is core::double* ?{core::bool*} true : false;
+static const field core::Object* maybeDouble = self::z ?{core::Object*} 42.0 : true;
+static const field core::bool* isItInt3 = self::maybeDouble is core::int* ?{core::bool*} true : false;
+static const field core::bool* isItDouble3 = self::maybeDouble is core::double* ?{core::bool*} true : false;
+static const field core::double* actualDouble = 42.0;
+static const field core::bool* isItInt4 = self::actualDouble is core::int* ?{core::bool*} true : false;
+static const field core::bool* isItDouble4 = self::actualDouble is core::double* ?{core::bool*} true : false;
+static const field core::Object* maybeDouble2 = self::z ?{core::Object*} 42.42 : true;
+static const field core::bool* isItInt5 = self::maybeDouble2 is core::int* ?{core::bool*} true : false;
+static const field core::bool* isItDouble5 = self::maybeDouble2 is core::double* ?{core::bool*} true : false;
+static const field core::double* actualDouble2 = 42.42;
+static const field core::bool* isItInt6 = self::actualDouble2 is core::int* ?{core::bool*} true : false;
+static const field core::bool* isItDouble7 = self::actualDouble2 is core::double* ?{core::bool*} true : false;
+static const field core::bool* zeroPointZeroIdentical = core::identical(0.0, 0.0);
+static const field core::bool* zeroPointZeroIdenticalToZero = core::identical(0.0, 0);
+static const field core::bool* zeroIdenticalToZeroPointZero = core::identical(0, 0.0);
+static const field core::bool* nanIdentical = core::identical(0.{core::num::/}(0), 0.{core::num::/}(0));
+static const field core::bool* stringIdentical = core::identical("hello", "hello");
+static const field core::bool* string2Identical = core::identical("hello", "world");
+static const field core::bool* zeroPointZeroEqual = 0.0.{core::num::==}(0.0);
+static const field core::bool* zeroPointZeroEqualToZero = 0.0.{core::num::==}(0);
+static const field core::bool* zeroEqualToZeroPointZero = 0.{core::num::==}(0.0);
+static const field core::bool* nanEqual = 0.{core::num::/}(0).{core::num::==}(0.{core::num::/}(0));
+static const field core::bool* stringEqual = "hello".{core::String::==}("hello");
+static const field core::bool* string2Equal = "hello".{core::String::==}("world");
+static const field core::int* intFortyTwo = 42;
+static const field core::String* intStringConcat = "hello${self::intFortyTwo.{core::num::*}(self::intFortyTwo)}";
+
+
+Extra constant evaluation status:
+Evaluated: Not @ org-dartlang-testcase:///various.dart:6:16 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:8:20 -> DoubleConstant(42.0)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:9:38 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:10:44 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:13:40 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:14:46 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:16:23 -> DoubleConstant(42.0)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:17:42 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:18:48 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:21:43 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:22:49 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:24:24 -> DoubleConstant(42.42)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:25:43 -> BoolConstant(false)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:26:49 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:29:44 -> BoolConstant(false)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:30:50 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:32:32 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:33:38 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:34:38 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:35:22 -> BoolConstant(false)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:36:25 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:37:26 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:39:32 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:40:38 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:41:36 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:42:24 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:43:29 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:44:30 -> BoolConstant(false)
+Evaluated: StringConcatenation @ org-dartlang-testcase:///various.dart:47:30 -> StringConstant("hello1764")
+Extra constant evaluation: tries: 29, successes: 29
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.strong.expect
new file mode 100644
index 0000000..0570489
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.strong.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::bool* y = #C1;
+static const field core::bool* z = #C2;
+static const field core::Object* maybeInt = #C3;
+static const field core::bool* isItInt = #C2;
+static const field core::bool* isItDouble = #C2;
+static const field core::int* actualInt = #C3;
+static const field core::bool* isItInt2 = #C2;
+static const field core::bool* isItDouble2 = #C2;
+static const field core::Object* maybeDouble = #C3;
+static const field core::bool* isItInt3 = #C2;
+static const field core::bool* isItDouble3 = #C2;
+static const field core::double* actualDouble = #C3;
+static const field core::bool* isItInt4 = #C2;
+static const field core::bool* isItDouble4 = #C2;
+static const field core::Object* maybeDouble2 = #C4;
+static const field core::bool* isItInt5 = #C1;
+static const field core::bool* isItDouble5 = #C2;
+static const field core::double* actualDouble2 = #C4;
+static const field core::bool* isItInt6 = #C1;
+static const field core::bool* isItDouble7 = #C2;
+static const field core::bool* zeroPointZeroIdentical = #C2;
+static const field core::bool* zeroPointZeroIdenticalToZero = #C2;
+static const field core::bool* zeroIdenticalToZeroPointZero = #C2;
+static const field core::bool* nanIdentical = #C1;
+static const field core::bool* stringIdentical = #C2;
+static const field core::bool* string2Identical = #C1;
+static const field core::bool* zeroPointZeroEqual = #C2;
+static const field core::bool* zeroPointZeroEqualToZero = #C2;
+static const field core::bool* zeroEqualToZeroPointZero = #C2;
+static const field core::bool* nanEqual = #C1;
+static const field core::bool* stringEqual = #C2;
+static const field core::bool* string2Equal = #C1;
+static const field core::int* intFortyTwo = #C3;
+static const field core::String* intStringConcat = #C5;
+
+constants  {
+  #C1 = false
+  #C2 = true
+  #C3 = 42.0
+  #C4 = 42.42
+  #C5 = "hello1764"
+}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.strong.transformed.expect
new file mode 100644
index 0000000..0570489
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::bool* y = #C1;
+static const field core::bool* z = #C2;
+static const field core::Object* maybeInt = #C3;
+static const field core::bool* isItInt = #C2;
+static const field core::bool* isItDouble = #C2;
+static const field core::int* actualInt = #C3;
+static const field core::bool* isItInt2 = #C2;
+static const field core::bool* isItDouble2 = #C2;
+static const field core::Object* maybeDouble = #C3;
+static const field core::bool* isItInt3 = #C2;
+static const field core::bool* isItDouble3 = #C2;
+static const field core::double* actualDouble = #C3;
+static const field core::bool* isItInt4 = #C2;
+static const field core::bool* isItDouble4 = #C2;
+static const field core::Object* maybeDouble2 = #C4;
+static const field core::bool* isItInt5 = #C1;
+static const field core::bool* isItDouble5 = #C2;
+static const field core::double* actualDouble2 = #C4;
+static const field core::bool* isItInt6 = #C1;
+static const field core::bool* isItDouble7 = #C2;
+static const field core::bool* zeroPointZeroIdentical = #C2;
+static const field core::bool* zeroPointZeroIdenticalToZero = #C2;
+static const field core::bool* zeroIdenticalToZeroPointZero = #C2;
+static const field core::bool* nanIdentical = #C1;
+static const field core::bool* stringIdentical = #C2;
+static const field core::bool* string2Identical = #C1;
+static const field core::bool* zeroPointZeroEqual = #C2;
+static const field core::bool* zeroPointZeroEqualToZero = #C2;
+static const field core::bool* zeroEqualToZeroPointZero = #C2;
+static const field core::bool* nanEqual = #C1;
+static const field core::bool* stringEqual = #C2;
+static const field core::bool* string2Equal = #C1;
+static const field core::int* intFortyTwo = #C3;
+static const field core::String* intStringConcat = #C5;
+
+constants  {
+  #C1 = false
+  #C2 = true
+  #C3 = 42.0
+  #C4 = 42.42
+  #C5 = "hello1764"
+}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.textual_outline.expect
new file mode 100644
index 0000000..4ca812c
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.textual_outline.expect
@@ -0,0 +1,34 @@
+const bool y = false;
+const bool z = !(y);
+const maybeInt = z ? 42 : true;
+const bool isItInt = maybeInt is int ? true : false;
+const bool isItDouble = maybeInt is double ? true : false;
+const int actualInt = 42;
+const bool isItInt2 = actualInt is int ? true : false;
+const bool isItDouble2 = actualInt is double ? true : false;
+const maybeDouble = z ? 42.0 : true;
+const bool isItInt3 = maybeDouble is int ? true : false;
+const bool isItDouble3 = maybeDouble is double ? true : false;
+const double actualDouble = 42.0;
+const bool isItInt4 = actualDouble is int ? true : false;
+const bool isItDouble4 = actualDouble is double ? true : false;
+const maybeDouble2 = z ? 42.42 : true;
+const bool isItInt5 = maybeDouble2 is int ? true : false;
+const bool isItDouble5 = maybeDouble2 is double ? true : false;
+const double actualDouble2 = 42.42;
+const bool isItInt6 = actualDouble2 is int ? true : false;
+const bool isItDouble7 = actualDouble2 is double ? true : false;
+const zeroPointZeroIdentical = identical(0.0, 0.0);
+const zeroPointZeroIdenticalToZero = identical(0.0, 0);
+const zeroIdenticalToZeroPointZero = identical(0, 0.0);
+const nanIdentical = identical(0 / 0, 0 / 0);
+const stringIdentical = identical("hello", "hello");
+const string2Identical = identical("hello", "world");
+const zeroPointZeroEqual = 0.0 == 0.0;
+const zeroPointZeroEqualToZero = 0.0 == 0;
+const zeroEqualToZeroPointZero = 0 == 0.0;
+const nanEqual = 0 / 0 == 0 / 0;
+const stringEqual = "hello" == "hello";
+const string2Equal = "hello" == "world";
+const int intFortyTwo = 42;
+const String intStringConcat = "hello" "${intFortyTwo * intFortyTwo}";
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..70b112b
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.textual_outline_modelled.expect
@@ -0,0 +1,34 @@
+const String intStringConcat = "hello" "${intFortyTwo * intFortyTwo}";
+const bool isItDouble = maybeInt is double ? true : false;
+const bool isItDouble2 = actualInt is double ? true : false;
+const bool isItDouble3 = maybeDouble is double ? true : false;
+const bool isItDouble4 = actualDouble is double ? true : false;
+const bool isItDouble5 = maybeDouble2 is double ? true : false;
+const bool isItDouble7 = actualDouble2 is double ? true : false;
+const bool isItInt = maybeInt is int ? true : false;
+const bool isItInt2 = actualInt is int ? true : false;
+const bool isItInt3 = maybeDouble is int ? true : false;
+const bool isItInt4 = actualDouble is int ? true : false;
+const bool isItInt5 = maybeDouble2 is int ? true : false;
+const bool isItInt6 = actualDouble2 is int ? true : false;
+const bool y = false;
+const bool z = !(y);
+const double actualDouble = 42.0;
+const double actualDouble2 = 42.42;
+const int actualInt = 42;
+const int intFortyTwo = 42;
+const maybeDouble = z ? 42.0 : true;
+const maybeDouble2 = z ? 42.42 : true;
+const maybeInt = z ? 42 : true;
+const nanEqual = 0 / 0 == 0 / 0;
+const nanIdentical = identical(0 / 0, 0 / 0);
+const string2Equal = "hello" == "world";
+const string2Identical = identical("hello", "world");
+const stringEqual = "hello" == "hello";
+const stringIdentical = identical("hello", "hello");
+const zeroEqualToZeroPointZero = 0 == 0.0;
+const zeroIdenticalToZeroPointZero = identical(0, 0.0);
+const zeroPointZeroEqual = 0.0 == 0.0;
+const zeroPointZeroEqualToZero = 0.0 == 0;
+const zeroPointZeroIdentical = identical(0.0, 0.0);
+const zeroPointZeroIdenticalToZero = identical(0.0, 0);
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/folder.options b/pkg/front_end/testcases/general/constants/no_experiments/folder.options
new file mode 100644
index 0000000..db4ac03
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/folder.options
@@ -0,0 +1,3 @@
+-Dbaz=42
+-DbazTrue=true
+-DbazFalse=false
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/various.dart b/pkg/front_end/testcases/general/constants/no_experiments/various.dart
new file mode 100644
index 0000000..df79a2d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/various.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, 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.
+
+const Symbol tripleShiftSymbol = const Symbol(">>>");
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.outline.expect
new file mode 100644
index 0000000..e41cc76
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static const field core::Symbol* tripleShiftSymbol = const _in::Symbol::•(">>>");
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.strong.expect
new file mode 100644
index 0000000..d69a863
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.strong.expect
@@ -0,0 +1,19 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/no_experiments/various.dart:5:40: Error: Constant evaluation error:
+// const Symbol tripleShiftSymbol = const Symbol(">>>");
+//                                        ^
+// pkg/front_end/testcases/general/constants/no_experiments/various.dart:5:47: Context: The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '">>>"'.
+// const Symbol tripleShiftSymbol = const Symbol(">>>");
+//                                               ^
+// pkg/front_end/testcases/general/constants/no_experiments/various.dart:5:14: Context: While analyzing:
+// const Symbol tripleShiftSymbol = const Symbol(">>>");
+//              ^
+//
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::Symbol* tripleShiftSymbol = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\">>>\"'.";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.strong.transformed.expect
new file mode 100644
index 0000000..d69a863
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/no_experiments/various.dart:5:40: Error: Constant evaluation error:
+// const Symbol tripleShiftSymbol = const Symbol(">>>");
+//                                        ^
+// pkg/front_end/testcases/general/constants/no_experiments/various.dart:5:47: Context: The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '">>>"'.
+// const Symbol tripleShiftSymbol = const Symbol(">>>");
+//                                               ^
+// pkg/front_end/testcases/general/constants/no_experiments/various.dart:5:14: Context: While analyzing:
+// const Symbol tripleShiftSymbol = const Symbol(">>>");
+//              ^
+//
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::Symbol* tripleShiftSymbol = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\">>>\"'.";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/various.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.textual_outline.expect
new file mode 100644
index 0000000..3cb83df
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+const Symbol tripleShiftSymbol = const Symbol(">>>");
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/various.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3cb83df
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+const Symbol tripleShiftSymbol = const Symbol(">>>");
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart b/pkg/front_end/testcases/general/constants/number_folds.dart
new file mode 100644
index 0000000..2069e49
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2020, 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.
+
+const int shiftNegative1 = 2 << -1;
+const int shiftNegative2 = 2 >>> -1;
+const int shiftNegative3 = 2 >> -1;
+const int modZero = 2 % 0;
+const int divZero = 2 / 0;
+const int intdivZero = 2 ~/ 0;
+const int unaryMinus = -2;
+const int unaryTilde = ~2;
+const int unaryPlus = +2;
+
+const int binaryPlus = 40 + 2;
+const int binaryMinus = 44 - 2;
+const int binaryTimes = 21 * 2;
+const double binaryDiv = 84 / 2;
+const int binaryTildeDiv = 84~/ 2;
+const int binaryMod = 85 % 43;
+const int binaryOr = 32 | 10;
+const int binaryAnd = 63 & 106;
+const int binaryXor = 63 ^ 21;
+const int binaryShift1 = 21 << 1;
+
+// These aren't currently defined on int :(.
+const int binaryShift2 = 84 >>> 1;
+const int binaryShift3 = 21 >>> 64;
+
+const int binaryShift4 = 84 >> 1;
+const bool binaryLess = 42 < 42;
+const bool binaryLessEqual = 42 <= 42;
+const bool binaryGreaterEqual = 42 >= 42;
+const bool binaryGreater = 42 > 42;
+
+const int doubleTruncateDiv = 84.2 ~/ 2;
+const int doubleTruncateDivZero = 84.2 ~/ 0;
+const int doubleTruncateDivNull = 84.2 ~/ null;
+const double doubleNan = 0/0;
+const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+
+main() {
+
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect
new file mode 100644
index 0000000..715ad66
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift2 = 84 >>> 1;
+//                             ^^^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift3 = 21 >>> 64;
+//                             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = 2.{core::int::<<}(1.{core::int::unary-}());
+static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int shiftNegative2 = 2 >>> -1;
+                             ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* shiftNegative3 = 2.{core::int::>>}(1.{core::int::unary-}());
+static const field core::int* modZero = 2.{core::num::%}(0);
+static const field core::int* divZero = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^" in 2.{core::num::/}(0) as{TypeError} core::int*;
+static const field core::int* intdivZero = 2.{core::num::~/}(0);
+static const field core::int* unaryMinus = 2.{core::int::unary-}();
+static const field core::int* unaryTilde = 2.{core::int::~}();
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^".+(2) as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryPlus = 40.{core::num::+}(2);
+static const field core::int* binaryMinus = 44.{core::num::-}(2);
+static const field core::int* binaryTimes = 21.{core::num::*}(2);
+static const field core::double* binaryDiv = 84.{core::num::/}(2);
+static const field core::int* binaryTildeDiv = 84.{core::num::~/}(2);
+static const field core::int* binaryMod = 85.{core::num::%}(43);
+static const field core::int* binaryOr = 32.{core::int::|}(10);
+static const field core::int* binaryAnd = 63.{core::int::&}(106);
+static const field core::int* binaryXor = 63.{core::int::^}(21);
+static const field core::int* binaryShift1 = 21.{core::int::<<}(1);
+static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift2 = 84 >>> 1;
+                            ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift3 = 21 >>> 64;
+                            ^^^" as{TypeError,ForDynamic} core::int*;
+static const field core::int* binaryShift4 = 84.{core::int::>>}(1);
+static const field core::bool* binaryLess = 42.{core::num::<}(42);
+static const field core::bool* binaryLessEqual = 42.{core::num::<=}(42);
+static const field core::bool* binaryGreaterEqual = 42.{core::num::>=}(42);
+static const field core::bool* binaryGreater = 42.{core::num::>}(42);
+static const field core::int* doubleTruncateDiv = 84.2.{core::double::~/}(2);
+static const field core::int* doubleTruncateDivZero = 84.2.{core::double::~/}(0);
+static const field core::int* doubleTruncateDivNull = 84.2.{core::double::~/}(null);
+static const field core::double* doubleNan = 0.{core::num::/}(0);
+static const field core::int* doubleTruncateDivNaN = 84.2.{core::double::~/}(self::doubleNan);
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:5:33 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:7:33 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:9:23 -> DoubleConstant(Infinity)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:11:24 -> IntConstant(-2)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:12:24 -> IntConstant(-3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:15:27 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:16:28 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:17:28 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:18:29 -> DoubleConstant(42.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:19:30 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:20:26 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:21:25 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:22:26 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:23:26 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:24:29 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:30:29 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:31:28 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:32:33 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:33:36 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:34:31 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:36:36 -> IntConstant(42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///number_folds.dart:39:27 -> DoubleConstant(NaN)
+Evaluated: StaticGet @ org-dartlang-testcase:///number_folds.dart:40:42 -> DoubleConstant(NaN)
+Extra constant evaluation: tries: 37, successes: 23
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.strong.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.strong.expect
new file mode 100644
index 0000000..551adf0
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.strong.expect
@@ -0,0 +1,159 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Context: Binary operator '<<' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Context: Binary operator '>>' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:23: Context: Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:26: Context: Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:37:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:37:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:37:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift2 = 84 >>> 1;
+//                             ^^^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift3 = 21 >>> 64;
+//                             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int shiftNegative2 = 2 >>> -1;
+                             ^^^";
+static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int* modZero = invalid-expression "Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int* intdivZero = invalid-expression "Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* unaryMinus = #C1;
+static const field core::int* unaryTilde = #C2;
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int* binaryPlus = #C3;
+static const field core::int* binaryMinus = #C3;
+static const field core::int* binaryTimes = #C3;
+static const field core::double* binaryDiv = #C4;
+static const field core::int* binaryTildeDiv = #C3;
+static const field core::int* binaryMod = #C3;
+static const field core::int* binaryOr = #C3;
+static const field core::int* binaryAnd = #C3;
+static const field core::int* binaryXor = #C3;
+static const field core::int* binaryShift1 = #C3;
+static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift2 = 84 >>> 1;
+                            ^^^";
+static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift3 = 21 >>> 64;
+                            ^^^";
+static const field core::int* binaryShift4 = #C3;
+static const field core::bool* binaryLess = #C5;
+static const field core::bool* binaryLessEqual = #C6;
+static const field core::bool* binaryGreaterEqual = #C6;
+static const field core::bool* binaryGreater = #C5;
+static const field core::int* doubleTruncateDiv = #C3;
+static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double* doubleNan = #C7;
+static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2
+  #C2 = -3
+  #C3 = 42
+  #C4 = 42.0
+  #C5 = false
+  #C6 = true
+  #C7 = NaN
+}
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.strong.transformed.expect
new file mode 100644
index 0000000..551adf0
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.strong.transformed.expect
@@ -0,0 +1,159 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Context: Binary operator '<<' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Context: Binary operator '>>' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:23: Context: Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:26: Context: Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:37:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:37:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:37:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift2 = 84 >>> 1;
+//                             ^^^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '>>>' operator.
+// const int binaryShift3 = 21 >>> 64;
+//                             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int* shiftNegative2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int shiftNegative2 = 2 >>> -1;
+                             ^^^";
+static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int* modZero = invalid-expression "Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int* intdivZero = invalid-expression "Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* unaryMinus = #C1;
+static const field core::int* unaryTilde = #C2;
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int* binaryPlus = #C3;
+static const field core::int* binaryMinus = #C3;
+static const field core::int* binaryTimes = #C3;
+static const field core::double* binaryDiv = #C4;
+static const field core::int* binaryTildeDiv = #C3;
+static const field core::int* binaryMod = #C3;
+static const field core::int* binaryOr = #C3;
+static const field core::int* binaryAnd = #C3;
+static const field core::int* binaryXor = #C3;
+static const field core::int* binaryShift1 = #C3;
+static const field core::int* binaryShift2 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:27:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift2 = 84 >>> 1;
+                            ^^^";
+static const field core::int* binaryShift3 = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:28:29: Error: The operator '>>>' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '>>>' operator.
+const int binaryShift3 = 21 >>> 64;
+                            ^^^";
+static const field core::int* binaryShift4 = #C3;
+static const field core::bool* binaryLess = #C5;
+static const field core::bool* binaryLessEqual = #C6;
+static const field core::bool* binaryGreaterEqual = #C6;
+static const field core::bool* binaryGreater = #C5;
+static const field core::int* doubleTruncateDiv = #C3;
+static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double* doubleNan = #C7;
+static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2
+  #C2 = -3
+  #C3 = 42
+  #C4 = 42.0
+  #C5 = false
+  #C6 = true
+  #C7 = NaN
+}
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.textual_outline.expect
new file mode 100644
index 0000000..20ada74
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.textual_outline.expect
@@ -0,0 +1,32 @@
+const int shiftNegative1 = 2 << -1;
+const int shiftNegative2 = 2 >>> -1;
+const int shiftNegative3 = 2 >> -1;
+const int modZero = 2 % 0;
+const int divZero = 2 / 0;
+const int intdivZero = 2 ~/ 0;
+const int unaryMinus = -2;
+const int unaryTilde = ~2;
+const int unaryPlus = +2;
+const int binaryPlus = 40 + 2;
+const int binaryMinus = 44 - 2;
+const int binaryTimes = 21 * 2;
+const double binaryDiv = 84 / 2;
+const int binaryTildeDiv = 84~/ 2;
+const int binaryMod = 85 % 43;
+const int binaryOr = 32 | 10;
+const int binaryAnd = 63 & 106;
+const int binaryXor = 63 ^ 21;
+const int binaryShift1 = 21 << 1;
+const int binaryShift2 = 84 >>> 1;
+const int binaryShift3 = 21 >>> 64;
+const int binaryShift4 = 84 >> 1;
+const bool binaryLess = 42 < 42;
+const bool binaryLessEqual = 42 <= 42;
+const bool binaryGreaterEqual = 42 >= 42;
+const bool binaryGreater = 42 > 42;
+const int doubleTruncateDiv = 84.2 ~/ 2;
+const int doubleTruncateDivZero = 84.2 ~/ 0;
+const int doubleTruncateDivNull = 84.2 ~/ null;
+const double doubleNan = 0/0;
+const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart
new file mode 100644
index 0000000..9eb86b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, 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.
+
+const int foo = 42 * 42;
+const String bar =
+    "hello" " " "${String.fromEnvironment("baz", defaultValue: "world")}" "!";
+const String bar2 = "hello2" " 2" + bar;
+const bool baz = true && true && (false || true) && (42 == 21 * 4 / 2);
+const blaSymbol = #_x;
+
+main() {
+  _x();
+  const bool.fromEnvironment("foo");
+  print(bar);
+}
+
+void _x() {
+  print(foo);
+  print(bar);
+}
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.outline.expect b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.outline.expect
new file mode 100644
index 0000000..c1a907c
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* foo = 42.{core::num::*}(42);
+static const field core::String* bar = "hello ${const core::String::fromEnvironment("baz", defaultValue: "world")}!";
+static const field core::String* bar2 = "hello2 2".{core::String::+}(self::bar);
+static const field core::bool* baz = true && true && (false || true) && 42.{core::num::==}(21.{core::num::*}(4).{core::num::/}(2));
+static const field core::Symbol* blaSymbol = #_x;
+static method main() → dynamic
+  ;
+static method _x() → void
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///rudimentary_test_01.dart:5:20 -> IntConstant(1764)
+Evaluated: StringConcatenation @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello 42!")
+Evaluated: MethodInvocation @ org-dartlang-testcase:///rudimentary_test_01.dart:8:35 -> StringConstant("hello2 2hello 42!")
+Evaluated: LogicalExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:9:50 -> BoolConstant(true)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///rudimentary_test_01.dart:10:19 -> SymbolConstant(#_x)
+Extra constant evaluation: tries: 5, successes: 5
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.strong.expect b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.strong.expect
new file mode 100644
index 0000000..f3b74df
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.strong.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* foo = #C1;
+static const field core::String* bar = #C2;
+static const field core::String* bar2 = #C3;
+static const field core::bool* baz = #C4;
+static const field core::Symbol* blaSymbol = #C5;
+static method main() → dynamic {
+  self::_x();
+  #C6;
+  core::print(#C2);
+}
+static method _x() → void {
+  core::print(#C1);
+  core::print(#C2);
+}
+
+constants  {
+  #C1 = 1764
+  #C2 = "hello 42!"
+  #C3 = "hello2 2hello 42!"
+  #C4 = true
+  #C5 = #org-dartlang-testcase:///rudimentary_test_01.dart::_x
+  #C6 = false
+}
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.strong.transformed.expect
new file mode 100644
index 0000000..f3b74df
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* foo = #C1;
+static const field core::String* bar = #C2;
+static const field core::String* bar2 = #C3;
+static const field core::bool* baz = #C4;
+static const field core::Symbol* blaSymbol = #C5;
+static method main() → dynamic {
+  self::_x();
+  #C6;
+  core::print(#C2);
+}
+static method _x() → void {
+  core::print(#C1);
+  core::print(#C2);
+}
+
+constants  {
+  #C1 = 1764
+  #C2 = "hello 42!"
+  #C3 = "hello2 2hello 42!"
+  #C4 = true
+  #C5 = #org-dartlang-testcase:///rudimentary_test_01.dart::_x
+  #C6 = false
+}
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.textual_outline.expect
new file mode 100644
index 0000000..c369a44
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+const int foo = 42 * 42;
+const String bar =
+    "hello" " " "${String.fromEnvironment("baz", defaultValue: "world")}" "!";
+const String bar2 = "hello2" " 2" + bar;
+const bool baz = true && true && (false || true) && (42 == 21 * 4 / 2);
+const blaSymbol = #_x;
+main() {}
+void _x() {}
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..fc42499
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+const String bar =
+    "hello" " " "${String.fromEnvironment("baz", defaultValue: "world")}" "!";
+const String bar2 = "hello2" " 2" + bar;
+const blaSymbol = #_x;
+const bool baz = true && true && (false || true) && (42 == 21 * 4 / 2);
+const int foo = 42 * 42;
+main() {}
+void _x() {}
diff --git a/pkg/front_end/testcases/general/constants/various.dart b/pkg/front_end/testcases/general/constants/various.dart
new file mode 100644
index 0000000..a4ebf42
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/various.dart
@@ -0,0 +1,220 @@
+// Copyright (c) 2020, 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.
+
+// Environment does not contain "bar".
+const bool barFromEnv = const bool.fromEnvironment("bar");
+const bool hasBarEnv = const bool.hasEnvironment("bar");
+const bool barFromEnvOrNull =
+    const bool.fromEnvironment("bar", defaultValue: null);
+const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+const bool nullAwareOnNullTrue = barFromEnvOrNull ?? true;
+const bool nullAwareOnNullFalse = barFromEnvOrNull ?? false;
+const bool andOnFalse = nullAwareOnNullFalse && nullAwareOnNullTrue;
+const bool andOnFalse2 = nullAwareOnNullTrue && nullAwareOnNullFalse;
+const bool andOnNull = barFromEnvOrNull && true;
+const bool andOnNull2 = true && barFromEnvOrNull;
+const bool orOnNull = barFromEnvOrNull || true;
+const bool orOnNull2 = barFromEnvOrNull || false;
+const bool orOnNull3 = true || barFromEnvOrNull;
+const bool orOnNull4 = false || barFromEnvOrNull;
+
+const String barFromEnvString = const String.fromEnvironment("bar");
+const String barFromEnvOrNullString =
+    const String.fromEnvironment("bar", defaultValue: null);
+const String barFromEnvOrActualString =
+    const String.fromEnvironment("bar", defaultValue: "hello");
+const String nullFromEnvString =
+    const String.fromEnvironment(barFromEnvOrNullString);
+
+const bool barFromEnvBool = const bool.fromEnvironment("bar");
+const bool barFromEnvOrNullBool =
+    const bool.fromEnvironment("bar", defaultValue: null);
+const bool barFromEnvOrActualBool =
+    const bool.fromEnvironment("bar", defaultValue: true);
+const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+
+const int barFromEnvInt = const int.fromEnvironment("bar");
+const int barFromEnvOrNullInt =
+    const int.fromEnvironment("bar", defaultValue: null);
+const int barFromEnvOrActualInt =
+    const int.fromEnvironment("bar", defaultValue: 42);
+const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+
+// Environment does contain "baz" (value '42', i.e. neither true nor false).
+const bool bazFromEnv = const bool.fromEnvironment("baz");
+const bool hasBazEnv = const bool.hasEnvironment("baz");
+const int bazFromEnvAsInt = const int.fromEnvironment("baz");
+const String bazFromEnvAsString = const String.fromEnvironment("baz");
+
+// Environment does contain "bazTrue" (value 'true') and
+// "bazFalse" (value 'false').
+const bool bazTrueFromEnv = const bool.fromEnvironment("bazTrue");
+const bool bazFalseFromEnv = const bool.fromEnvironment("bazFalse");
+
+const bool trueBool = true;
+const bool falseBool = false;
+const bool binaryOnBoolCaret = trueBool ^ falseBool;
+const bool binaryOnBoolAmpersand = trueBool & falseBool;
+const bool binaryOnBoolBar = trueBool | falseBool;
+const bool binaryOnBoolBar2 = falseBool | trueBool;
+
+const dynamic willBeDouble = const bool.fromEnvironment("foo") ? 42 : 42.42;
+const binaryOnDouble = willBeDouble << 2;
+const dynamic willBeInt = const bool.fromEnvironment("foo") ? 42.42 : 42;
+const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+const binaryOnIntWithDoubleOK = willBeInt + willBeDouble;
+const binaryOnIntWithString = willBeInt << "hello";
+const dynamic willBeString =
+    const bool.fromEnvironment("foo") ? 42.42 : "hello";
+const binaryOnStringWithStringOK = willBeString + " world";
+const binaryOnStringWithInt = willBeString + willBeInt;
+const binaryOnStringWithStringBad = willBeString - " world";
+
+var x = 1;
+const x1 = --x;
+const x2 = ++x;
+const x3 = x--;
+const x4 = x++;
+
+const y = 1;
+const y1 = --y;
+const y2 = ++y;
+const y3 = y--;
+const y4 = y++;
+
+abstract class AbstractClass {}
+
+abstract class AbstractClassWithConstructor {
+  const AbstractClassWithConstructor();
+
+  int foo();
+}
+
+AbstractClassWithConstructor abstractClassWithConstructor =
+    const AbstractClassWithConstructor();
+
+class NotAbstractClass {
+  @AbstractClass()
+  Object foo;
+
+  @AbstractClassWithConstructor()
+  Object bar;
+}
+
+class Foo {
+  final int x;
+  final int y;
+  const Foo(int x)
+      : this.x = x,
+        this.y = "hello".length;
+}
+
+class ExtendsFoo1 extends Foo {
+  // No constructor.
+}
+
+const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+
+class ExtendsFoo2 extends Foo {
+  const ExtendsFoo2();
+}
+
+const ExtendsFoo2 extendsFoo2 = const ExtendsFoo2();
+
+const Foo foo1 = const Foo(42);
+const Foo foo2 = const Foo(42);
+const bool foosIdentical = identical(foo1, foo2);
+const bool foosEqual = foo1 == foo2;
+const Symbol barFoo = const Symbol("Foo");
+const Symbol barFooEqual = const Symbol("Foo=");
+const Symbol tripleShiftSymbol = const Symbol(">>>");
+const Symbol symbolWithDots = const Symbol("I.Have.Dots");
+
+const int circularity1 = circularity2;
+const int circularity2 = circularity3;
+const int circularity3 = circularity4;
+const int circularity4 = circularity1;
+
+const function_const = () {};
+var function_var = () {};
+
+class ConstClassWithFailingAssertWithEmptyMessage {
+  const ConstClassWithFailingAssertWithEmptyMessage() : assert(false, "");
+}
+
+ConstClassWithFailingAssertWithEmptyMessage failedAssertEmptyMessage =
+    const ConstClassWithFailingAssertWithEmptyMessage();
+
+class ClassWithTypeArguments<E, F, G> {
+  const ClassWithTypeArguments(E e, F f, G g);
+}
+
+const ClassWithTypeArguments classWithTypeArguments1 =
+    const ClassWithTypeArguments<int, int, int>(42, 42, 42);
+const ClassWithTypeArguments classWithTypeArguments2 =
+    const ClassWithTypeArguments(42, 42, 42);
+const bool classWithTypeArgumentsIdentical =
+    identical(classWithTypeArguments1, classWithTypeArguments2);
+
+class ClassWithNonEmptyConstConstructor {
+  const ClassWithNonEmptyConstConstructor() {
+    print("hello");
+  }
+}
+
+ClassWithNonEmptyConstConstructor classWithNonEmptyConstConstructor =
+    const ClassWithNonEmptyConstConstructor();
+
+class ConstClassWithFinalFields1 {
+  const ConstClassWithFinalFields1();
+
+  final x = 1;
+}
+
+class ConstClassWithFinalFields2 {
+  const ConstClassWithFinalFields2();
+
+  final y = 1;
+  final z1 = y;
+  final z2 = x;
+}
+
+ConstClassWithFinalFields2 constClassWithFinalFields =
+    const ConstClassWithFinalFields2();
+
+const zeroPointZeroIdentical = identical(0.0, 0.0);
+const zeroPointZeroIdenticalToZero = identical(0.0, 0);
+const zeroIdenticalToZeroPointZero = identical(0, 0.0);
+const nanIdentical = identical(0 / 0, 0 / 0);
+
+const zeroPointZeroEqual = 0.0 == 0.0;
+const zeroPointZeroEqualToZero = 0.0 == 0;
+const zeroEqualToZeroPointZero = 0 == 0.0;
+const nanEqual = 0 / 0 == 0 / 0;
+
+T id1<T>(T t) => t;
+T id2<T>(T t) => t;
+
+const dynamic willBecomeNull = const bool.fromEnvironment("foo") ? id1 : null;
+
+const int Function(int) willBecomeNullToo =
+    const bool.fromEnvironment("foo") ? id1 : willBecomeNull;
+const int Function(int) partialInstantiation =
+    const bool.fromEnvironment("foo") ? willBecomeNull : id1;
+
+const bool yBool = true;
+const bool zBool = !yBool;
+
+const maybeInt = bool.fromEnvironment("foo") ? 42 : true;
+const bool isItInt = maybeInt is int ? true : false;
+const maybeInt2 = zBool ? 42 : true;
+const bool isItInt2 = maybeInt2 is int ? true : false;
+const maybeInt3 = zBool ? 42 : null;
+const bool isItInt3 = maybeInt3 is int ? true : false;
+
+main() {
+  print(barFromEnv);
+  print(hasBarEnv);
+}
diff --git a/pkg/front_end/testcases/general/constants/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
new file mode 100644
index 0000000..7b33312
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
@@ -0,0 +1,456 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/various.dart:162:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const ClassWithNonEmptyConstConstructor() {
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:76:14: Error: Not a constant expression.
+// const x1 = --x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:77:14: Error: Not a constant expression.
+// const x2 = ++x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:78:12: Error: Not a constant expression.
+// const x3 = x--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:79:12: Error: Not a constant expression.
+// const x4 = x++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+// const y1 = --y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+// const y2 = ++y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+// const y3 = y--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+// const y4 = y++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+// const function_const = () {};
+//                        ^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Can't access 'this' in a field initializer to read 'y'.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: The class 'AbstractClass' is abstract and can't be instantiated.
+//   @AbstractClass()
+//    ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClass()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: The class 'AbstractClassWithConstructor' is abstract and can't be instantiated.
+//   @AbstractClassWithConstructor()
+//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClassWithConstructor()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+//                                       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+//   const ExtendsFoo2();
+//         ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Not a constant expression.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:181:14: Error: Not a constant expression.
+//   final z2 = x;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class AbstractClass extends core::Object {
+  synthetic constructor •() → self::AbstractClass*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class AbstractClassWithConstructor extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::AbstractClassWithConstructor*
+    : super core::Object::•()
+    ;
+  abstract method foo() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NotAbstractClass extends core::Object {
+  @throw invalid-expression "pkg/front_end/testcases/general/constants/various.dart:99:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  @AbstractClass()
+   ^"
+  field core::Object* foo;
+  @throw invalid-expression "pkg/front_end/testcases/general/constants/various.dart:102:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  @AbstractClassWithConstructor()
+   ^"
+  field core::Object* bar;
+  synthetic constructor •() → self::NotAbstractClass*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  final field core::int* y;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, self::Foo::y = "hello".{core::String::length}, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ExtendsFoo1 extends self::Foo {
+  synthetic constructor •() → self::ExtendsFoo1*
+    ;
+}
+class ExtendsFoo2 extends self::Foo /*hasConstConstructor*/  {
+  const constructor •() → self::ExtendsFoo2*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+  const ExtendsFoo2();
+        ^^^^^^^^^^^"
+    ;
+}
+class ConstClassWithFailingAssertWithEmptyMessage extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::ConstClassWithFailingAssertWithEmptyMessage*
+    : assert(false, ""), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithTypeArguments<E extends core::Object* = dynamic, F extends core::Object* = dynamic, G extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::ClassWithTypeArguments::E* e, self::ClassWithTypeArguments::F* f, self::ClassWithTypeArguments::G* g) → self::ClassWithTypeArguments<self::ClassWithTypeArguments::E*, self::ClassWithTypeArguments::F*, self::ClassWithTypeArguments::G*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithNonEmptyConstConstructor extends core::Object {
+  constructor •() → self::ClassWithNonEmptyConstConstructor*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields1 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x = 1;
+  const constructor •() → self::ConstClassWithFinalFields1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields2 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* y = 1;
+  final field dynamic z1 = this.{self::ConstClassWithFinalFields2::y};
+  final field core::int* z2 = self::x;
+  const constructor •() → self::ConstClassWithFinalFields2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::bool* barFromEnv = const core::bool::fromEnvironment("bar");
+static const field core::bool* hasBarEnv = const core::bool::hasEnvironment("bar");
+static const field core::bool* barFromEnvOrNull = const core::bool::fromEnvironment("bar", defaultValue: null);
+static const field core::bool* notBarFromEnvOrNull = !self::barFromEnvOrNull;
+static const field core::bool* conditionalOnNull = self::barFromEnvOrNull ?{core::bool*} true : false;
+static const field core::bool* nullAwareOnNullTrue = let final core::bool* #t2 = self::barFromEnvOrNull in #t2.{core::Object::==}(null) ?{core::bool*} true : #t2;
+static const field core::bool* nullAwareOnNullFalse = let final core::bool* #t3 = self::barFromEnvOrNull in #t3.{core::Object::==}(null) ?{core::bool*} false : #t3;
+static const field core::bool* andOnFalse = self::nullAwareOnNullFalse && self::nullAwareOnNullTrue;
+static const field core::bool* andOnFalse2 = self::nullAwareOnNullTrue && self::nullAwareOnNullFalse;
+static const field core::bool* andOnNull = self::barFromEnvOrNull && true;
+static const field core::bool* andOnNull2 = true && self::barFromEnvOrNull;
+static const field core::bool* orOnNull = self::barFromEnvOrNull || true;
+static const field core::bool* orOnNull2 = self::barFromEnvOrNull || false;
+static const field core::bool* orOnNull3 = true || self::barFromEnvOrNull;
+static const field core::bool* orOnNull4 = false || self::barFromEnvOrNull;
+static const field core::String* barFromEnvString = const core::String::fromEnvironment("bar");
+static const field core::String* barFromEnvOrNullString = const core::String::fromEnvironment("bar", defaultValue: null);
+static const field core::String* barFromEnvOrActualString = const core::String::fromEnvironment("bar", defaultValue: "hello");
+static const field core::String* nullFromEnvString = const core::String::fromEnvironment(self::barFromEnvOrNullString);
+static const field core::bool* barFromEnvBool = const core::bool::fromEnvironment("bar");
+static const field core::bool* barFromEnvOrNullBool = const core::bool::fromEnvironment("bar", defaultValue: null);
+static const field core::bool* barFromEnvOrActualBool = const core::bool::fromEnvironment("bar", defaultValue: true);
+static const field core::bool* nullFromEnvBool = const core::bool::fromEnvironment(self::barFromEnvOrNullString);
+static const field core::int* barFromEnvInt = const core::int::fromEnvironment("bar");
+static const field core::int* barFromEnvOrNullInt = const core::int::fromEnvironment("bar", defaultValue: null);
+static const field core::int* barFromEnvOrActualInt = const core::int::fromEnvironment("bar", defaultValue: 42);
+static const field core::int* nullFromEnvInt = const core::int::fromEnvironment(self::barFromEnvOrNullString);
+static const field core::bool* bazFromEnv = const core::bool::fromEnvironment("baz");
+static const field core::bool* hasBazEnv = const core::bool::hasEnvironment("baz");
+static const field core::int* bazFromEnvAsInt = const core::int::fromEnvironment("baz");
+static const field core::String* bazFromEnvAsString = const core::String::fromEnvironment("baz");
+static const field core::bool* bazTrueFromEnv = const core::bool::fromEnvironment("bazTrue");
+static const field core::bool* bazFalseFromEnv = const core::bool::fromEnvironment("bazFalse");
+static const field core::bool* trueBool = true;
+static const field core::bool* falseBool = false;
+static const field core::bool* binaryOnBoolCaret = self::trueBool.{core::bool::^}(self::falseBool);
+static const field core::bool* binaryOnBoolAmpersand = self::trueBool.{core::bool::&}(self::falseBool);
+static const field core::bool* binaryOnBoolBar = self::trueBool.{core::bool::|}(self::falseBool);
+static const field core::bool* binaryOnBoolBar2 = self::falseBool.{core::bool::|}(self::trueBool);
+static const field dynamic willBeDouble = const core::bool::fromEnvironment("foo") ?{core::num*} 42 : 42.42;
+static const field dynamic binaryOnDouble = self::willBeDouble.<<(2);
+static const field dynamic willBeInt = const core::bool::fromEnvironment("foo") ?{core::num*} 42.42 : 42;
+static const field dynamic binaryOnIntWithDoubleBad = self::willBeInt.<<(self::willBeDouble);
+static const field dynamic binaryOnIntWithDoubleOK = self::willBeInt.+(self::willBeDouble);
+static const field dynamic binaryOnIntWithString = self::willBeInt.<<("hello");
+static const field dynamic willBeString = const core::bool::fromEnvironment("foo") ?{core::Object*} 42.42 : "hello";
+static const field dynamic binaryOnStringWithStringOK = self::willBeString.+(" world");
+static const field dynamic binaryOnStringWithInt = self::willBeString.+(self::willBeInt);
+static const field dynamic binaryOnStringWithStringBad = self::willBeString.-(" world");
+static field core::int* x;
+static const field core::int* x1 = self::x = self::x.{core::num::-}(1);
+static const field core::int* x2 = self::x = self::x.{core::num::+}(1);
+static const field core::int* x3 = let final core::int* #t4 = self::x in let final core::int* #t5 = self::x = #t4.{core::num::-}(1) in #t4;
+static const field core::int* x4 = let final core::int* #t6 = self::x in let final core::int* #t7 = self::x = #t6.{core::num::+}(1) in #t6;
+static const field core::int* y = 1;
+static const field dynamic y1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+const y1 = --y;
+             ^";
+static const field dynamic y2 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+const y2 = ++y;
+             ^";
+static const field core::int* y3 = let final core::int* #t8 = self::y in let final dynamic #t9 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+const y3 = y--;
+           ^" in #t8;
+static const field core::int* y4 = let final core::int* #t10 = self::y in let final dynamic #t11 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+const y4 = y++;
+           ^" in #t10;
+static field self::AbstractClassWithConstructor* abstractClassWithConstructor;
+static const field self::ExtendsFoo1* extendsFoo1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+                                      ^^^^^^^^^^^" as{TypeError,ForDynamic} self::ExtendsFoo1*;
+static const field self::ExtendsFoo2* extendsFoo2 = const self::ExtendsFoo2::•();
+static const field self::Foo* foo1 = const self::Foo::•(42);
+static const field self::Foo* foo2 = const self::Foo::•(42);
+static const field core::bool* foosIdentical = core::identical(self::foo1, self::foo2);
+static const field core::bool* foosEqual = self::foo1.{self::Foo::==}(self::foo2);
+static const field core::Symbol* barFoo = const _in::Symbol::•("Foo");
+static const field core::Symbol* barFooEqual = const _in::Symbol::•("Foo=");
+static const field core::Symbol* tripleShiftSymbol = const _in::Symbol::•(">>>");
+static const field core::Symbol* symbolWithDots = const _in::Symbol::•("I.Have.Dots");
+static const field core::int* circularity1 = self::circularity2;
+static const field core::int* circularity2 = self::circularity3;
+static const field core::int* circularity3 = self::circularity4;
+static const field core::int* circularity4 = self::circularity1;
+static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+const function_const = () {};
+                       ^^";
+static field () →* core::Null? function_var;
+static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage;
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = const self::ClassWithTypeArguments::•<core::int*, core::int*, core::int*>(42, 42, 42);
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = const self::ClassWithTypeArguments::•<dynamic, dynamic, dynamic>(42, 42, 42);
+static const field core::bool* classWithTypeArgumentsIdentical = core::identical(self::classWithTypeArguments1, self::classWithTypeArguments2);
+static field self::ClassWithNonEmptyConstConstructor* classWithNonEmptyConstConstructor;
+static field self::ConstClassWithFinalFields2* constClassWithFinalFields;
+static const field core::bool* zeroPointZeroIdentical = core::identical(0.0, 0.0);
+static const field core::bool* zeroPointZeroIdenticalToZero = core::identical(0.0, 0);
+static const field core::bool* zeroIdenticalToZeroPointZero = core::identical(0, 0.0);
+static const field core::bool* nanIdentical = core::identical(0.{core::num::/}(0), 0.{core::num::/}(0));
+static const field core::bool* zeroPointZeroEqual = 0.0.{core::num::==}(0.0);
+static const field core::bool* zeroPointZeroEqualToZero = 0.0.{core::num::==}(0);
+static const field core::bool* zeroEqualToZeroPointZero = 0.{core::num::==}(0.0);
+static const field core::bool* nanEqual = 0.{core::num::/}(0).{core::num::==}(0.{core::num::/}(0));
+static const field dynamic willBecomeNull = const core::bool::fromEnvironment("foo") ?{<T extends core::Object* = dynamic>(T*) →* T*} self::id1 : null;
+static const field (core::int*) →* core::int* willBecomeNullToo = (const core::bool::fromEnvironment("foo") ?{dynamic} self::id1<core::int*> : self::willBecomeNull) as{TypeError,ForDynamic} (core::int*) →* core::int*;
+static const field (core::int*) →* core::int* partialInstantiation = (const core::bool::fromEnvironment("foo") ?{dynamic} self::willBecomeNull : self::id1<core::int*>) as{TypeError,ForDynamic} (core::int*) →* core::int*;
+static const field core::bool* yBool = true;
+static const field core::bool* zBool = !self::yBool;
+static const field core::Object* maybeInt = const core::bool::fromEnvironment("foo") ?{core::Object*} 42 : true;
+static const field core::bool* isItInt = self::maybeInt is core::int* ?{core::bool*} true : false;
+static const field core::Object* maybeInt2 = self::zBool ?{core::Object*} 42 : true;
+static const field core::bool* isItInt2 = self::maybeInt2 is core::int* ?{core::bool*} true : false;
+static const field core::int* maybeInt3 = self::zBool ?{core::int*} 42 : null;
+static const field core::bool* isItInt3 = self::maybeInt3 is core::int* ?{core::bool*} true : false;
+static method id1<T extends core::Object* = dynamic>(self::id1::T* t) → self::id1::T*
+  ;
+static method id2<T extends core::Object* = dynamic>(self::id2::T* t) → self::id2::T*
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: PropertyGet @ org-dartlang-testcase:///various.dart:111:26 -> IntConstant(5)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:6:31 -> BoolConstant(false)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:7:30 -> BoolConstant(false)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:9:11 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:10:35 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:11:32 -> NullConstant(null)
+Evaluated: Let @ org-dartlang-testcase:///various.dart:12:51 -> BoolConstant(true)
+Evaluated: Let @ org-dartlang-testcase:///various.dart:13:52 -> BoolConstant(false)
+Evaluated: LogicalExpression @ org-dartlang-testcase:///various.dart:14:46 -> BoolConstant(false)
+Evaluated: LogicalExpression @ org-dartlang-testcase:///various.dart:15:46 -> BoolConstant(false)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:16:24 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:17:33 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:18:23 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:19:24 -> NullConstant(null)
+Evaluated: LogicalExpression @ org-dartlang-testcase:///various.dart:20:29 -> BoolConstant(true)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:21:33 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:23:39 -> StringConstant("")
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:25:11 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:27:11 -> StringConstant("hello")
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:29:34 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:31:35 -> BoolConstant(false)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:33:11 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:35:11 -> BoolConstant(true)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:36:57 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:38:33 -> IntConstant(0)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:40:11 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:42:11 -> IntConstant(42)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:43:54 -> NullConstant(null)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:46:31 -> BoolConstant(false)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:47:30 -> BoolConstant(true)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:48:35 -> IntConstant(42)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:49:41 -> StringConstant("42")
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:53:35 -> BoolConstant(true)
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:54:36 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:58:41 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:59:45 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:60:39 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:61:41 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:63:64 -> DoubleConstant(42.42)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:64:24 -> DoubleConstant(42.42)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:65:61 -> IntConstant(42)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:66:34 -> IntConstant(42)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:66:47 -> DoubleConstant(42.42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:67:43 -> DoubleConstant(84.42)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:68:31 -> IntConstant(42)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:70:39 -> StringConstant("hello")
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:71:49 -> StringConstant("hello world")
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:72:31 -> StringConstant("hello")
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:72:46 -> IntConstant(42)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:73:37 -> StringConstant("hello")
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:84:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///various.dart:84:12 -> IntConstant(1)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:85:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///various.dart:85:12 -> IntConstant(1)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:126:24 -> InstanceConstant(const Foo{Foo.x: 42, Foo.y: 5})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:127:24 -> InstanceConstant(const Foo{Foo.x: 42, Foo.y: 5})
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:128:28 -> BoolConstant(true)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:129:24 -> InstanceConstant(const Foo{Foo.x: 42, Foo.y: 5})
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:129:32 -> InstanceConstant(const Foo{Foo.x: 42, Foo.y: 5})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:130:29 -> SymbolConstant(#Foo)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:131:34 -> SymbolConstant(#Foo=)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:132:40 -> SymbolConstant(#>>>)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:133:37 -> SymbolConstant(#I.Have.Dots)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:155:11 -> InstanceConstant(const ClassWithTypeArguments<int*, int*, int*>{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:157:11 -> InstanceConstant(const ClassWithTypeArguments<dynamic, dynamic, dynamic>{})
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:159:5 -> BoolConstant(false)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:187:32 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:188:38 -> BoolConstant(false)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:189:38 -> BoolConstant(false)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various.dart:190:22 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:192:32 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:193:38 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:194:36 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///various.dart:195:24 -> BoolConstant(false)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:200:66 -> NullConstant(null)
+Evaluated: AsExpression @ org-dartlang-testcase:///various.dart:203:39 -> NullConstant(null)
+Evaluated: AsExpression @ org-dartlang-testcase:///various.dart:205:39 -> PartialInstantiationConstant(id1<int*>)
+Evaluated: Not @ org-dartlang-testcase:///various.dart:208:20 -> BoolConstant(false)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:210:46 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:211:38 -> BoolConstant(false)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:212:25 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:213:40 -> BoolConstant(false)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:214:25 -> NullConstant(null)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:215:40 -> BoolConstant(false)
+Extra constant evaluation: tries: 136, successes: 84
diff --git a/pkg/front_end/testcases/general/constants/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/various.dart.strong.expect
new file mode 100644
index 0000000..eb69153
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.expect
@@ -0,0 +1,629 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/various.dart:10:34: Error: Constant evaluation error:
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:10:34: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:10:12: Context: While analyzing:
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:11:49: Error: Constant evaluation error:
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//                                                 ^
+// pkg/front_end/testcases/general/constants/various.dart:11:32: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//                                ^
+// pkg/front_end/testcases/general/constants/various.dart:11:12: Context: While analyzing:
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:16:41: Error: Constant evaluation error:
+// const bool andOnNull = barFromEnvOrNull && true;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:16:41: Context: The method '&&' can't be invoked on 'null' in a constant expression.
+// const bool andOnNull = barFromEnvOrNull && true;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:16:12: Context: While analyzing:
+// const bool andOnNull = barFromEnvOrNull && true;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:17:30: Error: Constant evaluation error:
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:17:30: Context: Binary operator '&&' on 'true' requires operand of type 'bool', but was of type 'Null'.
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:17:12: Context: While analyzing:
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:18:40: Error: Constant evaluation error:
+// const bool orOnNull = barFromEnvOrNull || true;
+//                                        ^
+// pkg/front_end/testcases/general/constants/various.dart:18:40: Context: The method '||' can't be invoked on 'null' in a constant expression.
+// const bool orOnNull = barFromEnvOrNull || true;
+//                                        ^
+// pkg/front_end/testcases/general/constants/various.dart:18:12: Context: While analyzing:
+// const bool orOnNull = barFromEnvOrNull || true;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:19:41: Error: Constant evaluation error:
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:19:41: Context: The method '||' can't be invoked on 'null' in a constant expression.
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:19:12: Context: While analyzing:
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:21:30: Error: Constant evaluation error:
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:21:30: Context: Binary operator '||' on 'false' requires operand of type 'bool', but was of type 'Null'.
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:21:12: Context: While analyzing:
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:29:11: Error: Constant evaluation error:
+//     const String.fromEnvironment(barFromEnvOrNullString);
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:29:11: Context: Null value during constant evaluation.
+//     const String.fromEnvironment(barFromEnvOrNullString);
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:28:14: Context: While analyzing:
+// const String nullFromEnvString =
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:36:36: Error: Constant evaluation error:
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//                                    ^
+// pkg/front_end/testcases/general/constants/various.dart:36:36: Context: Null value during constant evaluation.
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//                                    ^
+// pkg/front_end/testcases/general/constants/various.dart:36:12: Context: While analyzing:
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:43:34: Error: Constant evaluation error:
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:43:34: Context: Null value during constant evaluation.
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:43:11: Context: While analyzing:
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:64:37: Error: Constant evaluation error:
+// const binaryOnDouble = willBeDouble << 2;
+//                                     ^
+// pkg/front_end/testcases/general/constants/various.dart:64:37: Context: Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.
+// const binaryOnDouble = willBeDouble << 2;
+//                                     ^
+// pkg/front_end/testcases/general/constants/various.dart:64:7: Context: While analyzing:
+// const binaryOnDouble = willBeDouble << 2;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:66:44: Error: Constant evaluation error:
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:66:44: Context: Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:66:7: Context: While analyzing:
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:68:41: Error: Constant evaluation error:
+// const binaryOnIntWithString = willBeInt << "hello";
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:68:41: Context: Binary operator '<<' on '42' requires operand of type 'num', but was of type 'String'.
+// const binaryOnIntWithString = willBeInt << "hello";
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:68:7: Context: While analyzing:
+// const binaryOnIntWithString = willBeInt << "hello";
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:72:44: Error: Constant evaluation error:
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:72:44: Context: Binary operator '+' on '"hello"' requires operand of type 'String', but was of type 'int'.
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:72:7: Context: While analyzing:
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:73:50: Error: Constant evaluation error:
+// const binaryOnStringWithStringBad = willBeString - " world";
+//                                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:73:50: Context: The method '-' can't be invoked on '"hello"' in a constant expression.
+// const binaryOnStringWithStringBad = willBeString - " world";
+//                                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:73:7: Context: While analyzing:
+// const binaryOnStringWithStringBad = willBeString - " world";
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:78:13: Error: Constant evaluation error:
+// const x3 = x--;
+//             ^
+// pkg/front_end/testcases/general/constants/various.dart:78:12: Context: The invocation of 'x' is not allowed in a constant expression.
+// const x3 = x--;
+//            ^
+// pkg/front_end/testcases/general/constants/various.dart:78:7: Context: While analyzing:
+// const x3 = x--;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:79:13: Error: Constant evaluation error:
+// const x4 = x++;
+//             ^
+// pkg/front_end/testcases/general/constants/various.dart:79:12: Context: The invocation of 'x' is not allowed in a constant expression.
+// const x4 = x++;
+//            ^
+// pkg/front_end/testcases/general/constants/various.dart:79:7: Context: While analyzing:
+// const x4 = x++;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:129:29: Error: Constant evaluation error:
+// const bool foosEqual = foo1 == foo2;
+//                             ^
+// pkg/front_end/testcases/general/constants/various.dart:129:29: Context: Binary operator '==' requires receiver constant 'Foo {x: 42, y: 5}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/constants/various.dart'.
+// const bool foosEqual = foo1 == foo2;
+//                             ^
+// pkg/front_end/testcases/general/constants/various.dart:129:12: Context: While analyzing:
+// const bool foosEqual = foo1 == foo2;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:135:26: Error: Constant evaluation error:
+// const int circularity1 = circularity2;
+//                          ^
+// pkg/front_end/testcases/general/constants/various.dart:135:26: Context: Constant expression depends on itself.
+// const int circularity1 = circularity2;
+//                          ^
+// pkg/front_end/testcases/general/constants/various.dart:135:11: Context: While analyzing:
+// const int circularity1 = circularity2;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:148:11: Error: Constant evaluation error:
+//     const ConstClassWithFailingAssertWithEmptyMessage();
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:144:64: Context: This assertion failed with message: (empty)
+//   const ConstClassWithFailingAssertWithEmptyMessage() : assert(false, "");
+//                                                                ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:185:11: Error: Constant evaluation error:
+//     const ConstClassWithFinalFields2();
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:181:14: Context: The invocation of 'x' is not allowed in a constant expression.
+//   final z2 = x;
+//              ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/various.dart:162:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const ClassWithNonEmptyConstConstructor() {
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:76:14: Error: Not a constant expression.
+// const x1 = --x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:77:14: Error: Not a constant expression.
+// const x2 = ++x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:78:12: Error: Not a constant expression.
+// const x3 = x--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:79:12: Error: Not a constant expression.
+// const x4 = x++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+// const y1 = --y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+// const y2 = ++y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+// const y3 = y--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+// const y4 = y++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+// const function_const = () {};
+//                        ^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Can't access 'this' in a field initializer to read 'y'.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: The class 'AbstractClass' is abstract and can't be instantiated.
+//   @AbstractClass()
+//    ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClass()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: The class 'AbstractClassWithConstructor' is abstract and can't be instantiated.
+//   @AbstractClassWithConstructor()
+//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClassWithConstructor()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+//                                       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+//   const ExtendsFoo2();
+//         ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Not a constant expression.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:181:14: Error: Not a constant expression.
+//   final z2 = x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:96:11: Error: The class 'AbstractClassWithConstructor' is abstract and can't be instantiated.
+//     const AbstractClassWithConstructor();
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:96:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//     const AbstractClassWithConstructor();
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:168:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//     const ClassWithNonEmptyConstConstructor();
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:114:7: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+// class ExtendsFoo1 extends Foo {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class AbstractClass extends core::Object {
+  synthetic constructor •() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class AbstractClassWithConstructor extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::AbstractClassWithConstructor*
+    : super core::Object::•()
+    ;
+  abstract method foo() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NotAbstractClass extends core::Object {
+  @invalid-expression "Constant evaluation has no support for Throw!"
+  field core::Object* foo = null;
+  @invalid-expression "Constant evaluation has no support for Throw!"
+  field core::Object* bar = null;
+  synthetic constructor •() → self::NotAbstractClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  final field core::int* y;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, self::Foo::y = "hello".{core::String::length}, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ExtendsFoo1 extends self::Foo {
+  synthetic constructor •() → self::ExtendsFoo1*
+    : invalid-initializer
+    ;
+}
+class ExtendsFoo2 extends self::Foo /*hasConstConstructor*/  {
+  const constructor •() → self::ExtendsFoo2*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+  const ExtendsFoo2();
+        ^^^^^^^^^^^"
+    ;
+}
+class ConstClassWithFailingAssertWithEmptyMessage extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::ConstClassWithFailingAssertWithEmptyMessage*
+    : assert(false, ""), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithTypeArguments<E extends core::Object* = dynamic, F extends core::Object* = dynamic, G extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::ClassWithTypeArguments::E* e, self::ClassWithTypeArguments::F* f, self::ClassWithTypeArguments::G* g) → self::ClassWithTypeArguments<self::ClassWithTypeArguments::E*, self::ClassWithTypeArguments::F*, self::ClassWithTypeArguments::G*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithNonEmptyConstConstructor extends core::Object {
+  constructor •() → self::ClassWithNonEmptyConstConstructor*
+    : super core::Object::•() {
+    core::print("hello");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields1 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x = 1;
+  const constructor •() → self::ConstClassWithFinalFields1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields2 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* y = 1;
+  final field dynamic z1 = this.{self::ConstClassWithFinalFields2::y};
+  final field core::int* z2 = self::x;
+  const constructor •() → self::ConstClassWithFinalFields2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::bool* barFromEnv = #C1;
+static const field core::bool* hasBarEnv = #C1;
+static const field core::bool* barFromEnvOrNull = #C2;
+static const field core::bool* notBarFromEnvOrNull = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field core::bool* conditionalOnNull = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field core::bool* nullAwareOnNullTrue = #C3;
+static const field core::bool* nullAwareOnNullFalse = #C1;
+static const field core::bool* andOnFalse = #C1;
+static const field core::bool* andOnFalse2 = #C1;
+static const field core::bool* andOnNull = invalid-expression "The method '&&' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* andOnNull2 = invalid-expression "Binary operator '&&' on 'true' requires operand of type 'bool', but was of type 'Null'.";
+static const field core::bool* orOnNull = invalid-expression "The method '||' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* orOnNull2 = invalid-expression "The method '||' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* orOnNull3 = #C3;
+static const field core::bool* orOnNull4 = invalid-expression "Binary operator '||' on 'false' requires operand of type 'bool', but was of type 'Null'.";
+static const field core::String* barFromEnvString = #C4;
+static const field core::String* barFromEnvOrNullString = #C2;
+static const field core::String* barFromEnvOrActualString = #C5;
+static const field core::String* nullFromEnvString = invalid-expression "Null value during constant evaluation.";
+static const field core::bool* barFromEnvBool = #C1;
+static const field core::bool* barFromEnvOrNullBool = #C2;
+static const field core::bool* barFromEnvOrActualBool = #C3;
+static const field core::bool* nullFromEnvBool = invalid-expression "Null value during constant evaluation.";
+static const field core::int* barFromEnvInt = #C6;
+static const field core::int* barFromEnvOrNullInt = #C2;
+static const field core::int* barFromEnvOrActualInt = #C7;
+static const field core::int* nullFromEnvInt = invalid-expression "Null value during constant evaluation.";
+static const field core::bool* bazFromEnv = #C1;
+static const field core::bool* hasBazEnv = #C3;
+static const field core::int* bazFromEnvAsInt = #C7;
+static const field core::String* bazFromEnvAsString = #C8;
+static const field core::bool* bazTrueFromEnv = #C3;
+static const field core::bool* bazFalseFromEnv = #C1;
+static const field core::bool* trueBool = #C3;
+static const field core::bool* falseBool = #C1;
+static const field core::bool* binaryOnBoolCaret = #C3;
+static const field core::bool* binaryOnBoolAmpersand = #C1;
+static const field core::bool* binaryOnBoolBar = #C3;
+static const field core::bool* binaryOnBoolBar2 = #C3;
+static const field dynamic willBeDouble = #C9;
+static const field dynamic binaryOnDouble = invalid-expression "Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic willBeInt = #C7;
+static const field dynamic binaryOnIntWithDoubleBad = invalid-expression "Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic binaryOnIntWithDoubleOK = #C10;
+static const field dynamic binaryOnIntWithString = invalid-expression "Binary operator '<<' on '42' requires operand of type 'num', but was of type 'String'.";
+static const field dynamic willBeString = #C5;
+static const field dynamic binaryOnStringWithStringOK = #C11;
+static const field dynamic binaryOnStringWithInt = invalid-expression "Binary operator '+' on '\"hello\"' requires operand of type 'String', but was of type 'int'.";
+static const field dynamic binaryOnStringWithStringBad = invalid-expression "The method '-' can't be invoked on '\"hello\"' in a constant expression.";
+static field core::int* x = 1;
+static const field core::int* x1 = invalid-expression "Constant evaluation has no support for StaticSet!";
+static const field core::int* x2 = invalid-expression "Constant evaluation has no support for StaticSet!";
+static const field core::int* x3 = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::int* x4 = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::int* y = #C12;
+static const field dynamic y1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+const y1 = --y;
+             ^";
+static const field dynamic y2 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+const y2 = ++y;
+             ^";
+static const field core::int* y3 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+const y3 = y--;
+           ^";
+static const field core::int* y4 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+const y4 = y++;
+           ^";
+static field self::AbstractClassWithConstructor* abstractClassWithConstructor = throw invalid-expression "pkg/front_end/testcases/general/constants/various.dart:96:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+    const AbstractClassWithConstructor();
+          ^";
+static const field self::ExtendsFoo1* extendsFoo1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+                                      ^^^^^^^^^^^";
+static const field self::ExtendsFoo2* extendsFoo2 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+  const ExtendsFoo2();
+        ^^^^^^^^^^^";
+static const field self::Foo* foo1 = #C14;
+static const field self::Foo* foo2 = #C14;
+static const field core::bool* foosIdentical = #C3;
+static const field core::bool* foosEqual = invalid-expression "Binary operator '==' requires receiver constant 'Foo {x: 42, y: 5}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/constants/various.dart'.";
+static const field core::Symbol* barFoo = #C15;
+static const field core::Symbol* barFooEqual = #C16;
+static const field core::Symbol* tripleShiftSymbol = #C17;
+static const field core::Symbol* symbolWithDots = #C18;
+static const field core::int* circularity1 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity2 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity3 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity4 = invalid-expression "Constant expression depends on itself.";
+static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+const function_const = () {};
+                       ^^";
+static field () →* core::Null? function_var = () → core::Null? {};
+static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage = invalid-expression "This assertion failed with message: (empty)";
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = #C19;
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = #C20;
+static const field core::bool* classWithTypeArgumentsIdentical = #C1;
+static field self::ClassWithNonEmptyConstConstructor* classWithNonEmptyConstConstructor = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:168:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+    const ClassWithNonEmptyConstConstructor();
+          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic} self::ClassWithNonEmptyConstConstructor*;
+static field self::ConstClassWithFinalFields2* constClassWithFinalFields = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::bool* zeroPointZeroIdentical = #C3;
+static const field core::bool* zeroPointZeroIdenticalToZero = #C1;
+static const field core::bool* zeroIdenticalToZeroPointZero = #C1;
+static const field core::bool* nanIdentical = #C3;
+static const field core::bool* zeroPointZeroEqual = #C3;
+static const field core::bool* zeroPointZeroEqualToZero = #C3;
+static const field core::bool* zeroEqualToZeroPointZero = #C3;
+static const field core::bool* nanEqual = #C1;
+static const field dynamic willBecomeNull = #C2;
+static const field (core::int*) →* core::int* willBecomeNullToo = #C2;
+static const field (core::int*) →* core::int* partialInstantiation = #C22;
+static const field core::bool* yBool = #C3;
+static const field core::bool* zBool = #C1;
+static const field core::Object* maybeInt = #C3;
+static const field core::bool* isItInt = #C1;
+static const field core::Object* maybeInt2 = #C3;
+static const field core::bool* isItInt2 = #C1;
+static const field core::int* maybeInt3 = #C2;
+static const field core::bool* isItInt3 = #C1;
+static method id1<T extends core::Object* = dynamic>(self::id1::T* t) → self::id1::T*
+  return t;
+static method id2<T extends core::Object* = dynamic>(self::id2::T* t) → self::id2::T*
+  return t;
+static method main() → dynamic {
+  core::print(#C1);
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
+  #C2 = null
+  #C3 = true
+  #C4 = ""
+  #C5 = "hello"
+  #C6 = 0
+  #C7 = 42
+  #C8 = "42"
+  #C9 = 42.42
+  #C10 = 84.42
+  #C11 = "hello world"
+  #C12 = 1
+  #C13 = 5
+  #C14 = self::Foo {x:#C7, y:#C13}
+  #C15 = #Foo
+  #C16 = #Foo=
+  #C17 = #>>>
+  #C18 = #I.Have.Dots
+  #C19 = self::ClassWithTypeArguments<core::int*, core::int*, core::int*> {}
+  #C20 = self::ClassWithTypeArguments<dynamic, dynamic, dynamic> {}
+  #C21 = tearoff self::id1
+  #C22 = partial-instantiation self::id1 <core::int*>
+}
diff --git a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
new file mode 100644
index 0000000..2ad931e
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
@@ -0,0 +1,633 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/various.dart:10:34: Error: Constant evaluation error:
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:10:34: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:10:12: Context: While analyzing:
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:11:49: Error: Constant evaluation error:
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//                                                 ^
+// pkg/front_end/testcases/general/constants/various.dart:11:32: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//                                ^
+// pkg/front_end/testcases/general/constants/various.dart:11:12: Context: While analyzing:
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:16:41: Error: Constant evaluation error:
+// const bool andOnNull = barFromEnvOrNull && true;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:16:41: Context: The method '&&' can't be invoked on 'null' in a constant expression.
+// const bool andOnNull = barFromEnvOrNull && true;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:16:12: Context: While analyzing:
+// const bool andOnNull = barFromEnvOrNull && true;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:17:30: Error: Constant evaluation error:
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:17:30: Context: Binary operator '&&' on 'true' requires operand of type 'bool', but was of type 'Null'.
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:17:12: Context: While analyzing:
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:18:40: Error: Constant evaluation error:
+// const bool orOnNull = barFromEnvOrNull || true;
+//                                        ^
+// pkg/front_end/testcases/general/constants/various.dart:18:40: Context: The method '||' can't be invoked on 'null' in a constant expression.
+// const bool orOnNull = barFromEnvOrNull || true;
+//                                        ^
+// pkg/front_end/testcases/general/constants/various.dart:18:12: Context: While analyzing:
+// const bool orOnNull = barFromEnvOrNull || true;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:19:41: Error: Constant evaluation error:
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:19:41: Context: The method '||' can't be invoked on 'null' in a constant expression.
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:19:12: Context: While analyzing:
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:21:30: Error: Constant evaluation error:
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:21:30: Context: Binary operator '||' on 'false' requires operand of type 'bool', but was of type 'Null'.
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:21:12: Context: While analyzing:
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:29:11: Error: Constant evaluation error:
+//     const String.fromEnvironment(barFromEnvOrNullString);
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:29:11: Context: Null value during constant evaluation.
+//     const String.fromEnvironment(barFromEnvOrNullString);
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:28:14: Context: While analyzing:
+// const String nullFromEnvString =
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:36:36: Error: Constant evaluation error:
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//                                    ^
+// pkg/front_end/testcases/general/constants/various.dart:36:36: Context: Null value during constant evaluation.
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//                                    ^
+// pkg/front_end/testcases/general/constants/various.dart:36:12: Context: While analyzing:
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:43:34: Error: Constant evaluation error:
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:43:34: Context: Null value during constant evaluation.
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:43:11: Context: While analyzing:
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:64:37: Error: Constant evaluation error:
+// const binaryOnDouble = willBeDouble << 2;
+//                                     ^
+// pkg/front_end/testcases/general/constants/various.dart:64:37: Context: Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.
+// const binaryOnDouble = willBeDouble << 2;
+//                                     ^
+// pkg/front_end/testcases/general/constants/various.dart:64:7: Context: While analyzing:
+// const binaryOnDouble = willBeDouble << 2;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:66:44: Error: Constant evaluation error:
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:66:44: Context: Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:66:7: Context: While analyzing:
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:68:41: Error: Constant evaluation error:
+// const binaryOnIntWithString = willBeInt << "hello";
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:68:41: Context: Binary operator '<<' on '42' requires operand of type 'num', but was of type 'String'.
+// const binaryOnIntWithString = willBeInt << "hello";
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:68:7: Context: While analyzing:
+// const binaryOnIntWithString = willBeInt << "hello";
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:72:44: Error: Constant evaluation error:
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:72:44: Context: Binary operator '+' on '"hello"' requires operand of type 'String', but was of type 'int'.
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:72:7: Context: While analyzing:
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:73:50: Error: Constant evaluation error:
+// const binaryOnStringWithStringBad = willBeString - " world";
+//                                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:73:50: Context: The method '-' can't be invoked on '"hello"' in a constant expression.
+// const binaryOnStringWithStringBad = willBeString - " world";
+//                                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:73:7: Context: While analyzing:
+// const binaryOnStringWithStringBad = willBeString - " world";
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:78:13: Error: Constant evaluation error:
+// const x3 = x--;
+//             ^
+// pkg/front_end/testcases/general/constants/various.dart:78:12: Context: The invocation of 'x' is not allowed in a constant expression.
+// const x3 = x--;
+//            ^
+// pkg/front_end/testcases/general/constants/various.dart:78:7: Context: While analyzing:
+// const x3 = x--;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:79:13: Error: Constant evaluation error:
+// const x4 = x++;
+//             ^
+// pkg/front_end/testcases/general/constants/various.dart:79:12: Context: The invocation of 'x' is not allowed in a constant expression.
+// const x4 = x++;
+//            ^
+// pkg/front_end/testcases/general/constants/various.dart:79:7: Context: While analyzing:
+// const x4 = x++;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:129:29: Error: Constant evaluation error:
+// const bool foosEqual = foo1 == foo2;
+//                             ^
+// pkg/front_end/testcases/general/constants/various.dart:129:29: Context: Binary operator '==' requires receiver constant 'Foo {x: 42, y: 5}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/constants/various.dart'.
+// const bool foosEqual = foo1 == foo2;
+//                             ^
+// pkg/front_end/testcases/general/constants/various.dart:129:12: Context: While analyzing:
+// const bool foosEqual = foo1 == foo2;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:135:26: Error: Constant evaluation error:
+// const int circularity1 = circularity2;
+//                          ^
+// pkg/front_end/testcases/general/constants/various.dart:135:26: Context: Constant expression depends on itself.
+// const int circularity1 = circularity2;
+//                          ^
+// pkg/front_end/testcases/general/constants/various.dart:135:11: Context: While analyzing:
+// const int circularity1 = circularity2;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:148:11: Error: Constant evaluation error:
+//     const ConstClassWithFailingAssertWithEmptyMessage();
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:144:64: Context: This assertion failed with message: (empty)
+//   const ConstClassWithFailingAssertWithEmptyMessage() : assert(false, "");
+//                                                                ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:185:11: Error: Constant evaluation error:
+//     const ConstClassWithFinalFields2();
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:181:14: Context: The invocation of 'x' is not allowed in a constant expression.
+//   final z2 = x;
+//              ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/various.dart:162:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const ClassWithNonEmptyConstConstructor() {
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:76:14: Error: Not a constant expression.
+// const x1 = --x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:77:14: Error: Not a constant expression.
+// const x2 = ++x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:78:12: Error: Not a constant expression.
+// const x3 = x--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:79:12: Error: Not a constant expression.
+// const x4 = x++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+// const y1 = --y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+// const y2 = ++y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+// const y3 = y--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+// const y4 = y++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+// const function_const = () {};
+//                        ^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Can't access 'this' in a field initializer to read 'y'.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: The class 'AbstractClass' is abstract and can't be instantiated.
+//   @AbstractClass()
+//    ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClass()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: The class 'AbstractClassWithConstructor' is abstract and can't be instantiated.
+//   @AbstractClassWithConstructor()
+//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClassWithConstructor()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+//                                       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+//   const ExtendsFoo2();
+//         ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Not a constant expression.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:181:14: Error: Not a constant expression.
+//   final z2 = x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:96:11: Error: The class 'AbstractClassWithConstructor' is abstract and can't be instantiated.
+//     const AbstractClassWithConstructor();
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:96:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//     const AbstractClassWithConstructor();
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:168:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//     const ClassWithNonEmptyConstConstructor();
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:114:7: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+// class ExtendsFoo1 extends Foo {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class AbstractClass extends core::Object {
+  synthetic constructor •() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class AbstractClassWithConstructor extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::AbstractClassWithConstructor*
+    : super core::Object::•()
+    ;
+  abstract method foo() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NotAbstractClass extends core::Object {
+  @invalid-expression "Constant evaluation has no support for Throw!"
+  field core::Object* foo = null;
+  @invalid-expression "Constant evaluation has no support for Throw!"
+  field core::Object* bar = null;
+  synthetic constructor •() → self::NotAbstractClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  final field core::int* y;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, self::Foo::y = "hello".{core::String::length}, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ExtendsFoo1 extends self::Foo {
+  synthetic constructor •() → self::ExtendsFoo1*
+    : invalid-initializer
+    ;
+}
+class ExtendsFoo2 extends self::Foo /*hasConstConstructor*/  {
+  const constructor •() → self::ExtendsFoo2*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+  const ExtendsFoo2();
+        ^^^^^^^^^^^"
+    ;
+}
+class ConstClassWithFailingAssertWithEmptyMessage extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::ConstClassWithFailingAssertWithEmptyMessage*
+    : assert(false, ""), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithTypeArguments<E extends core::Object* = dynamic, F extends core::Object* = dynamic, G extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::ClassWithTypeArguments::E* e, self::ClassWithTypeArguments::F* f, self::ClassWithTypeArguments::G* g) → self::ClassWithTypeArguments<self::ClassWithTypeArguments::E*, self::ClassWithTypeArguments::F*, self::ClassWithTypeArguments::G*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithNonEmptyConstConstructor extends core::Object {
+  constructor •() → self::ClassWithNonEmptyConstConstructor*
+    : super core::Object::•() {
+    core::print("hello");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields1 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x = 1;
+  const constructor •() → self::ConstClassWithFinalFields1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields2 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* y = 1;
+  final field dynamic z1 = this.{self::ConstClassWithFinalFields2::y};
+  final field core::int* z2 = self::x;
+  const constructor •() → self::ConstClassWithFinalFields2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::bool* barFromEnv = #C1;
+static const field core::bool* hasBarEnv = #C1;
+static const field core::bool* barFromEnvOrNull = #C2;
+static const field core::bool* notBarFromEnvOrNull = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field core::bool* conditionalOnNull = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field core::bool* nullAwareOnNullTrue = #C3;
+static const field core::bool* nullAwareOnNullFalse = #C1;
+static const field core::bool* andOnFalse = #C1;
+static const field core::bool* andOnFalse2 = #C1;
+static const field core::bool* andOnNull = invalid-expression "The method '&&' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* andOnNull2 = invalid-expression "Binary operator '&&' on 'true' requires operand of type 'bool', but was of type 'Null'.";
+static const field core::bool* orOnNull = invalid-expression "The method '||' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* orOnNull2 = invalid-expression "The method '||' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* orOnNull3 = #C3;
+static const field core::bool* orOnNull4 = invalid-expression "Binary operator '||' on 'false' requires operand of type 'bool', but was of type 'Null'.";
+static const field core::String* barFromEnvString = #C4;
+static const field core::String* barFromEnvOrNullString = #C2;
+static const field core::String* barFromEnvOrActualString = #C5;
+static const field core::String* nullFromEnvString = invalid-expression "Null value during constant evaluation.";
+static const field core::bool* barFromEnvBool = #C1;
+static const field core::bool* barFromEnvOrNullBool = #C2;
+static const field core::bool* barFromEnvOrActualBool = #C3;
+static const field core::bool* nullFromEnvBool = invalid-expression "Null value during constant evaluation.";
+static const field core::int* barFromEnvInt = #C6;
+static const field core::int* barFromEnvOrNullInt = #C2;
+static const field core::int* barFromEnvOrActualInt = #C7;
+static const field core::int* nullFromEnvInt = invalid-expression "Null value during constant evaluation.";
+static const field core::bool* bazFromEnv = #C1;
+static const field core::bool* hasBazEnv = #C3;
+static const field core::int* bazFromEnvAsInt = #C7;
+static const field core::String* bazFromEnvAsString = #C8;
+static const field core::bool* bazTrueFromEnv = #C3;
+static const field core::bool* bazFalseFromEnv = #C1;
+static const field core::bool* trueBool = #C3;
+static const field core::bool* falseBool = #C1;
+static const field core::bool* binaryOnBoolCaret = #C3;
+static const field core::bool* binaryOnBoolAmpersand = #C1;
+static const field core::bool* binaryOnBoolBar = #C3;
+static const field core::bool* binaryOnBoolBar2 = #C3;
+static const field dynamic willBeDouble = #C9;
+static const field dynamic binaryOnDouble = invalid-expression "Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic willBeInt = #C7;
+static const field dynamic binaryOnIntWithDoubleBad = invalid-expression "Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic binaryOnIntWithDoubleOK = #C10;
+static const field dynamic binaryOnIntWithString = invalid-expression "Binary operator '<<' on '42' requires operand of type 'num', but was of type 'String'.";
+static const field dynamic willBeString = #C5;
+static const field dynamic binaryOnStringWithStringOK = #C11;
+static const field dynamic binaryOnStringWithInt = invalid-expression "Binary operator '+' on '\"hello\"' requires operand of type 'String', but was of type 'int'.";
+static const field dynamic binaryOnStringWithStringBad = invalid-expression "The method '-' can't be invoked on '\"hello\"' in a constant expression.";
+static field core::int* x = 1;
+static const field core::int* x1 = invalid-expression "Constant evaluation has no support for StaticSet!";
+static const field core::int* x2 = invalid-expression "Constant evaluation has no support for StaticSet!";
+static const field core::int* x3 = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::int* x4 = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::int* y = #C12;
+static const field dynamic y1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+const y1 = --y;
+             ^";
+static const field dynamic y2 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+const y2 = ++y;
+             ^";
+static const field core::int* y3 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+const y3 = y--;
+           ^";
+static const field core::int* y4 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+const y4 = y++;
+           ^";
+static field self::AbstractClassWithConstructor* abstractClassWithConstructor = throw invalid-expression "pkg/front_end/testcases/general/constants/various.dart:96:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+    const AbstractClassWithConstructor();
+          ^";
+static const field self::ExtendsFoo1* extendsFoo1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+                                      ^^^^^^^^^^^";
+static const field self::ExtendsFoo2* extendsFoo2 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+  const ExtendsFoo2();
+        ^^^^^^^^^^^";
+static const field self::Foo* foo1 = #C14;
+static const field self::Foo* foo2 = #C14;
+static const field core::bool* foosIdentical = #C3;
+static const field core::bool* foosEqual = invalid-expression "Binary operator '==' requires receiver constant 'Foo {x: 42, y: 5}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/constants/various.dart'.";
+static const field core::Symbol* barFoo = #C15;
+static const field core::Symbol* barFooEqual = #C16;
+static const field core::Symbol* tripleShiftSymbol = #C17;
+static const field core::Symbol* symbolWithDots = #C18;
+static const field core::int* circularity1 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity2 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity3 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity4 = invalid-expression "Constant expression depends on itself.";
+static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+const function_const = () {};
+                       ^^";
+static field () →* core::Null? function_var = () → core::Null? {};
+static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage = invalid-expression "This assertion failed with message: (empty)";
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = #C19;
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = #C20;
+static const field core::bool* classWithTypeArgumentsIdentical = #C1;
+static field self::ClassWithNonEmptyConstConstructor* classWithNonEmptyConstConstructor = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:168:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+    const ClassWithNonEmptyConstConstructor();
+          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+static field self::ConstClassWithFinalFields2* constClassWithFinalFields = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::bool* zeroPointZeroIdentical = #C3;
+static const field core::bool* zeroPointZeroIdenticalToZero = #C1;
+static const field core::bool* zeroIdenticalToZeroPointZero = #C1;
+static const field core::bool* nanIdentical = #C3;
+static const field core::bool* zeroPointZeroEqual = #C3;
+static const field core::bool* zeroPointZeroEqualToZero = #C3;
+static const field core::bool* zeroEqualToZeroPointZero = #C3;
+static const field core::bool* nanEqual = #C1;
+static const field dynamic willBecomeNull = #C2;
+static const field (core::int*) →* core::int* willBecomeNullToo = #C2;
+static const field (core::int*) →* core::int* partialInstantiation = #C22;
+static const field core::bool* yBool = #C3;
+static const field core::bool* zBool = #C1;
+static const field core::Object* maybeInt = #C3;
+static const field core::bool* isItInt = #C1;
+static const field core::Object* maybeInt2 = #C3;
+static const field core::bool* isItInt2 = #C1;
+static const field core::int* maybeInt3 = #C2;
+static const field core::bool* isItInt3 = #C1;
+static method id1<T extends core::Object* = dynamic>(self::id1::T* t) → self::id1::T*
+  return t;
+static method id2<T extends core::Object* = dynamic>(self::id2::T* t) → self::id2::T*
+  return t;
+static method main() → dynamic {
+  core::print(#C1);
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
+  #C2 = null
+  #C3 = true
+  #C4 = ""
+  #C5 = "hello"
+  #C6 = 0
+  #C7 = 42
+  #C8 = "42"
+  #C9 = 42.42
+  #C10 = 84.42
+  #C11 = "hello world"
+  #C12 = 1
+  #C13 = 5
+  #C14 = self::Foo {x:#C7, y:#C13}
+  #C15 = #Foo
+  #C16 = #Foo=
+  #C17 = #>>>
+  #C18 = #I.Have.Dots
+  #C19 = self::ClassWithTypeArguments<core::int*, core::int*, core::int*> {}
+  #C20 = self::ClassWithTypeArguments<dynamic, dynamic, dynamic> {}
+  #C21 = tearoff self::id1
+  #C22 = partial-instantiation self::id1 <core::int*>
+}
+
+Extra constant evaluation status:
+Evaluated: PropertyGet @ org-dartlang-testcase:///various.dart:111:26 -> IntConstant(5)
+Extra constant evaluation: tries: 12, successes: 1
diff --git a/pkg/front_end/testcases/general/constants/various.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/various.dart.textual_outline.expect
new file mode 100644
index 0000000..f696546
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/various.dart.textual_outline.expect
@@ -0,0 +1,143 @@
+const bool barFromEnv = const bool.fromEnvironment("bar");
+const bool hasBarEnv = const bool.hasEnvironment("bar");
+const bool barFromEnvOrNull = const bool.fromEnvironment("bar", defaultValue: null);
+const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+const bool nullAwareOnNullTrue = barFromEnvOrNull ?? true;
+const bool nullAwareOnNullFalse = barFromEnvOrNull ?? false;
+const bool andOnFalse = nullAwareOnNullFalse && nullAwareOnNullTrue;
+const bool andOnFalse2 = nullAwareOnNullTrue && nullAwareOnNullFalse;
+const bool andOnNull = barFromEnvOrNull && true;
+const bool andOnNull2 = true && barFromEnvOrNull;
+const bool orOnNull = barFromEnvOrNull || true;
+const bool orOnNull2 = barFromEnvOrNull || false;
+const bool orOnNull3 = true || barFromEnvOrNull;
+const bool orOnNull4 = false || barFromEnvOrNull;
+const String barFromEnvString = const String.fromEnvironment("bar");
+const String barFromEnvOrNullString = const String.fromEnvironment("bar", defaultValue: null);
+const String barFromEnvOrActualString = const String.fromEnvironment("bar", defaultValue: "hello");
+const String nullFromEnvString = const String.fromEnvironment(barFromEnvOrNullString);
+const bool barFromEnvBool = const bool.fromEnvironment("bar");
+const bool barFromEnvOrNullBool = const bool.fromEnvironment("bar", defaultValue: null);
+const bool barFromEnvOrActualBool = const bool.fromEnvironment("bar", defaultValue: true);
+const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+const int barFromEnvInt = const int.fromEnvironment("bar");
+const int barFromEnvOrNullInt = const int.fromEnvironment("bar", defaultValue: null);
+const int barFromEnvOrActualInt = const int.fromEnvironment("bar", defaultValue: 42);
+const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+const bool bazFromEnv = const bool.fromEnvironment("baz");
+const bool hasBazEnv = const bool.hasEnvironment("baz");
+const int bazFromEnvAsInt = const int.fromEnvironment("baz");
+const String bazFromEnvAsString = const String.fromEnvironment("baz");
+const bool bazTrueFromEnv = const bool.fromEnvironment("bazTrue");
+const bool bazFalseFromEnv = const bool.fromEnvironment("bazFalse");
+const bool trueBool = true;
+const bool falseBool = false;
+const bool binaryOnBoolCaret = trueBool ^ falseBool;
+const bool binaryOnBoolAmpersand = trueBool & falseBool;
+const bool binaryOnBoolBar = trueBool | falseBool;
+const bool binaryOnBoolBar2 = falseBool | trueBool;
+const dynamic willBeDouble = const bool.fromEnvironment("foo") ? 42 : 42.42;
+const binaryOnDouble = willBeDouble << 2;
+const dynamic willBeInt = const bool.fromEnvironment("foo") ? 42.42 : 42;
+const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+const binaryOnIntWithDoubleOK = willBeInt + willBeDouble;
+const binaryOnIntWithString = willBeInt << "hello";
+const dynamic willBeString = const bool.fromEnvironment("foo") ? 42.42 : "hello";
+const binaryOnStringWithStringOK = willBeString + " world";
+const binaryOnStringWithInt = willBeString + willBeInt;
+const binaryOnStringWithStringBad = willBeString - " world";
+var x = 1;
+const x1 = --x;
+const x2 = ++x;
+const x3 = x--;
+const x4 = x++;
+const y = 1;
+const y1 = --y;
+const y2 = ++y;
+const y3 = y--;
+const y4 = y++;
+abstract class AbstractClass {}
+abstract class AbstractClassWithConstructor {
+  const AbstractClassWithConstructor();
+  int foo();
+}
+AbstractClassWithConstructor abstractClassWithConstructor = const AbstractClassWithConstructor();
+class NotAbstractClass {
+  @AbstractClass()
+  Object foo;
+  @AbstractClassWithConstructor()
+  Object bar;
+}
+class Foo {
+  final int x;
+  final int y;
+  const Foo(int x) : this.x = x, this.y = "hello".length;
+}
+class ExtendsFoo1 extends Foo {}
+const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+class ExtendsFoo2 extends Foo {
+  const ExtendsFoo2();
+}
+const ExtendsFoo2 extendsFoo2 = const ExtendsFoo2();
+const Foo foo1 = const Foo(42);
+const Foo foo2 = const Foo(42);
+const bool foosIdentical = identical(foo1, foo2);
+const bool foosEqual = foo1 == foo2;
+const Symbol barFoo = const Symbol("Foo");
+const Symbol barFooEqual = const Symbol("Foo=");
+const Symbol tripleShiftSymbol = const Symbol(">>>");
+const Symbol symbolWithDots = const Symbol("I.Have.Dots");
+const int circularity1 = circularity2;
+const int circularity2 = circularity3;
+const int circularity3 = circularity4;
+const int circularity4 = circularity1;
+const function_const = () {};
+var function_var = () {};
+class ConstClassWithFailingAssertWithEmptyMessage {
+  const ConstClassWithFailingAssertWithEmptyMessage() : assert(false, "");
+}
+ConstClassWithFailingAssertWithEmptyMessage failedAssertEmptyMessage = const ConstClassWithFailingAssertWithEmptyMessage();
+class ClassWithTypeArguments<E, F, G> {
+  const ClassWithTypeArguments(E e, F f, G g);
+}
+const ClassWithTypeArguments classWithTypeArguments1 = const ClassWithTypeArguments<int, int, int>(42, 42, 42);
+const ClassWithTypeArguments classWithTypeArguments2 = const ClassWithTypeArguments(42, 42, 42);
+const bool classWithTypeArgumentsIdentical = identical(classWithTypeArguments1, classWithTypeArguments2);
+class ClassWithNonEmptyConstConstructor {
+  const ClassWithNonEmptyConstConstructor() {}
+}
+ClassWithNonEmptyConstConstructor classWithNonEmptyConstConstructor = const ClassWithNonEmptyConstConstructor();
+class ConstClassWithFinalFields1 {
+  const ConstClassWithFinalFields1();
+  final x = 1;
+}
+class ConstClassWithFinalFields2 {
+  const ConstClassWithFinalFields2();
+  final y = 1;
+  final z1 = y;
+  final z2 = x;
+}
+ConstClassWithFinalFields2 constClassWithFinalFields = const ConstClassWithFinalFields2();
+const zeroPointZeroIdentical = identical(0.0, 0.0);
+const zeroPointZeroIdenticalToZero = identical(0.0, 0);
+const zeroIdenticalToZeroPointZero = identical(0, 0.0);
+const nanIdentical = identical(0 / 0, 0 / 0);
+const zeroPointZeroEqual = 0.0 == 0.0;
+const zeroPointZeroEqualToZero = 0.0 == 0;
+const zeroEqualToZeroPointZero = 0 == 0.0;
+const nanEqual = 0 / 0 == 0 / 0;
+T id1<T>(T t) => t;
+T id2<T>(T t) => t;
+const dynamic willBecomeNull = const bool.fromEnvironment("foo") ? id1 : null;
+const int Function(int) willBecomeNullToo = const bool.fromEnvironment("foo") ? id1 : willBecomeNull;
+const int Function(int) partialInstantiation = const bool.fromEnvironment("foo") ? willBecomeNull : id1;
+const bool yBool = true;
+const bool zBool = !yBool;
+const maybeInt = bool.fromEnvironment("foo") ? 42 : true;
+const bool isItInt = maybeInt is int ? true : false;
+const maybeInt2 = zBool ? 42 : true;
+const bool isItInt2 = maybeInt2 is int ? true : false;
+const maybeInt3 = zBool ? 42 : null;
+const bool isItInt3 = maybeInt3 is int ? true : false;
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/various.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/various.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..068970b
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/various.dart.textual_outline_modelled.expect
@@ -0,0 +1,39 @@
+ConstClassWithFailingAssertWithEmptyMessage failedAssertEmptyMessage =
+    const ConstClassWithFailingAssertWithEmptyMessage();
+
+abstract class AbstractClass {}
+
+class ConstClassWithFailingAssertWithEmptyMessage {
+  const ConstClassWithFailingAssertWithEmptyMessage() : assert(false, "");
+}
+
+class Foo {
+  const Foo(int x)
+      : this.x = x,
+        this.y = "hello".length;
+  final int x;
+  final int y;
+}
+
+class NotAbstractClass {
+  @AbstractClass()
+  Object foo;
+}
+
+const Foo foo = const Foo(42);
+const Symbol barFoo = const Symbol("Foo");
+const bool barFromEnv = const bool.fromEnvironment("bar");
+const bool hasBarEnv = const bool.hasEnvironment("bar");
+const function_const = () {};
+const x1 = --x;
+const x2 = ++x;
+const x3 = x--;
+const x4 = x++;
+const y = 1;
+const y1 = --y;
+const y2 = ++y;
+const y3 = y--;
+const y4 = y++;
+main() {}
+var function_var = () {};
+var x = 1;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart
new file mode 100644
index 0000000..473c73d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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 Foo {
+  final int x;
+  const Foo(this.x)
+      : assert(x > 0, "x is not positive"),
+        assert(x > 0),
+        assert(const bool.fromEnvironment("foo") == false,
+            "foo was ${const bool.fromEnvironment("foo")}"),
+        assert(const bool.fromEnvironment("foo") == false);
+  const Foo.withMessage(this.x)
+      : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+  const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+  const Foo.withInvalidCondition(this.x) : assert(x);
+}
+
+class Bar {
+  final int x;
+  const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+  const Bar.withoutMessage(this.x) : assert(x < 0);
+}
+
+const Foo foo1 = const Foo(1);
+const Foo foo2 = const Foo(0);
+const Foo foo3 = const Foo.withMessage(42);
+const Foo foo4 = const Foo.withInvalidMessage(42);
+const Foo foo5 = const Foo.withInvalidCondition(42);
+const Bar bar1 = const Bar.withMessage(1);
+const Bar bar2 = const Bar.withMessage(0);
+const Bar bar3 = const Bar.withoutMessage(1);
+const Bar bar4 = const Bar.withoutMessage(0);
+
+main() {
+  print(foo1);
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.outline.expect
new file mode 100644
index 0000000..aff93a8
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.outline.expect
@@ -0,0 +1,61 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor •(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::>}(0), "x is not positive"), assert(x.{core::num::>}(0)), assert(const core::bool::fromEnvironment("foo").{core::Object::==}(false), "foo was ${const core::bool::fromEnvironment("foo")}"), assert(const core::bool::fromEnvironment("foo").{core::Object::==}(false)), super core::Object::•()
+    ;
+  const constructor withMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0), "btw foo was ${const core::bool::fromEnvironment("foo")}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0), x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int x) → self::Foo
+    : self::Foo::x = x, assert(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError,ForNonNullableByDefault} core::bool), super core::Object::•()
+    ;
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor withMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0), "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+}
+static const field self::Foo foo1 = const self::Foo::•(1);
+static const field self::Foo foo2 = const self::Foo::•(0);
+static const field self::Foo foo3 = const self::Foo::withMessage(42);
+static const field self::Foo foo4 = const self::Foo::withInvalidMessage(42);
+static const field self::Foo foo5 = const self::Foo::withInvalidCondition(42);
+static const field self::Bar bar1 = const self::Bar::withMessage(1);
+static const field self::Bar bar2 = const self::Bar::withMessage(0);
+static const field self::Bar bar3 = const self::Bar::withoutMessage(1);
+static const field self::Bar bar4 = const self::Bar::withoutMessage(0);
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated with empty environment: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:10:50 -> BoolConstant(true)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:10:22 -> BoolConstant(false)
+Evaluated with empty environment: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:11:59 -> StringConstant("foo was false")
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:11:30 -> BoolConstant(false)
+Evaluated with empty environment: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:12:50 -> BoolConstant(true)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:12:22 -> BoolConstant(false)
+Evaluated with empty environment: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:14:73 -> StringConstant("btw foo was false")
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_asserts.dart:14:44 -> BoolConstant(false)
+Evaluated with empty environment: ConstructorInvocation @ org-dartlang-testcase:///const_asserts.dart:25:24 -> InstanceConstant(const Foo{Foo.x: 1})
+Extra constant evaluation: tries: 39, successes: 9
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.expect
new file mode 100644
index 0000000..9ad7ac5
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.expect
@@ -0,0 +1,130 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:26:24: Error: Constant evaluation error:
+// const Foo foo2 = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:8:18: Context: This assertion failed with message: x is not positive
+//       : assert(x > 0, "x is not positive"),
+//                  ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:26:11: Context: While analyzing:
+// const Foo foo2 = const Foo(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:24: Error: Constant evaluation error:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+//   const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+//                                                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:11: Context: While analyzing:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:30:24: Error: Constant evaluation error:
+// const Bar bar1 = const Bar.withMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:21:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:30:11: Context: While analyzing:
+// const Bar bar1 = const Bar.withMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:31:24: Error: Constant evaluation error:
+// const Bar bar2 = const Bar.withMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:21:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:31:11: Context: While analyzing:
+// const Bar bar2 = const Bar.withMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:32:24: Error: Constant evaluation error:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:22:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:32:11: Context: While analyzing:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:33:24: Error: Constant evaluation error:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:22:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:33:11: Context: While analyzing:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//           ^
+//
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor •(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::>}(0), "x is not positive"), assert(x.{core::num::>}(0)), assert((#C2).{core::Object::==}(false), "foo was ${#C3}"), assert((#C4).{core::Object::==}(false)), super core::Object::•()
+    ;
+  const constructor withMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0), "btw foo was ${#C5}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0), x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int x) → self::Foo
+    : self::Foo::x = x, assert(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError,ForNonNullableByDefault} core::bool), super core::Object::•()
+    ;
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor withMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0), "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+}
+static const field self::Foo foo1 = #C9;
+static const field self::Foo foo2 = invalid-expression "This assertion failed with message: x is not positive";
+static const field self::Foo foo3 = #C12;
+static const field self::Foo foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo foo5 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^";
+static const field self::Bar bar1 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar bar2 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar bar3 = invalid-expression "This assertion failed.";
+static const field self::Bar bar4 = invalid-expression "This assertion failed.";
+static method main() → dynamic {
+  core::print(#C13);
+}
+
+constants  {
+  #C1 = "foo"
+  #C2 = eval const core::bool::fromEnvironment(#C1)
+  #C3 = eval const core::bool::fromEnvironment(#C1)
+  #C4 = eval const core::bool::fromEnvironment(#C1)
+  #C5 = eval const core::bool::fromEnvironment(#C1)
+  #C6 = 1
+  #C7 = false
+  #C8 = "foo was "
+  #C9 = eval self::Foo{x:#C6, assert(const core::bool::fromEnvironment(#C1).==(#C7), "${#C8}${const core::bool::fromEnvironment(#C1)}"), assert(const core::bool::fromEnvironment(#C1).==(#C7))}
+  #C10 = 42
+  #C11 = "btw foo was "
+  #C12 = eval self::Foo{x:#C10, assert(#C7, "${#C11}${const core::bool::fromEnvironment(#C1)}")}
+  #C13 = eval self::Foo{x:#C6, assert(const core::bool::fromEnvironment(#C1).==(#C7), "${#C8}${const core::bool::fromEnvironment(#C1)}"), assert(const core::bool::fromEnvironment(#C1).==(#C7))}
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.transformed.expect
new file mode 100644
index 0000000..62817bb
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.transformed.expect
@@ -0,0 +1,143 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:26:24: Error: Constant evaluation error:
+// const Foo foo2 = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:8:18: Context: This assertion failed with message: x is not positive
+//       : assert(x > 0, "x is not positive"),
+//                  ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:26:11: Context: While analyzing:
+// const Foo foo2 = const Foo(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:24: Error: Constant evaluation error:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+//   const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+//                                                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:11: Context: While analyzing:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:30:24: Error: Constant evaluation error:
+// const Bar bar1 = const Bar.withMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:21:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:30:11: Context: While analyzing:
+// const Bar bar1 = const Bar.withMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:31:24: Error: Constant evaluation error:
+// const Bar bar2 = const Bar.withMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:21:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:31:11: Context: While analyzing:
+// const Bar bar2 = const Bar.withMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:32:24: Error: Constant evaluation error:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:22:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:32:11: Context: While analyzing:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:33:24: Error: Constant evaluation error:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:22:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:33:11: Context: While analyzing:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//           ^
+//
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor •(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::>}(0), "x is not positive"), assert(x.{core::num::>}(0)), assert((#C2).{core::Object::==}(false), "foo was ${#C3}"), assert((#C4).{core::Object::==}(false)), super core::Object::•()
+    ;
+  const constructor withMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0), "btw foo was ${#C5}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0), x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int x) → self::Foo
+    : self::Foo::x = x, assert(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError,ForNonNullableByDefault} core::bool), super core::Object::•()
+    ;
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor withMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0), "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0)), super core::Object::•()
+    ;
+}
+static const field self::Foo foo1 = #C9;
+static const field self::Foo foo2 = invalid-expression "This assertion failed with message: x is not positive";
+static const field self::Foo foo3 = #C12;
+static const field self::Foo foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo foo5 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^";
+static const field self::Bar bar1 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar bar2 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar bar3 = invalid-expression "This assertion failed.";
+static const field self::Bar bar4 = invalid-expression "This assertion failed.";
+static method main() → dynamic {
+  core::print(#C13);
+}
+
+constants  {
+  #C1 = "foo"
+  #C2 = eval const core::bool::fromEnvironment(#C1)
+  #C3 = eval const core::bool::fromEnvironment(#C1)
+  #C4 = eval const core::bool::fromEnvironment(#C1)
+  #C5 = eval const core::bool::fromEnvironment(#C1)
+  #C6 = 1
+  #C7 = false
+  #C8 = "foo was "
+  #C9 = eval self::Foo{x:#C6, assert(const core::bool::fromEnvironment(#C1).==(#C7), "${#C8}${const core::bool::fromEnvironment(#C1)}"), assert(const core::bool::fromEnvironment(#C1).==(#C7))}
+  #C10 = 42
+  #C11 = "btw foo was "
+  #C12 = eval self::Foo{x:#C10, assert(#C7, "${#C11}${const core::bool::fromEnvironment(#C1)}")}
+  #C13 = eval self::Foo{x:#C6, assert(const core::bool::fromEnvironment(#C1).==(#C7), "${#C8}${const core::bool::fromEnvironment(#C1)}"), assert(const core::bool::fromEnvironment(#C1).==(#C7))}
+}
+
+Extra constant evaluation status:
+Evaluated with empty environment: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:10:50 -> BoolConstant(true)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:10:22 -> BoolConstant(false)
+Evaluated with empty environment: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:11:59 -> StringConstant("foo was false")
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:11:30 -> BoolConstant(false)
+Evaluated with empty environment: MethodInvocation @ org-dartlang-testcase:///const_asserts.dart:12:50 -> BoolConstant(true)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:12:22 -> BoolConstant(false)
+Evaluated with empty environment: StringConcatenation @ org-dartlang-testcase:///const_asserts.dart:14:73 -> StringConstant("btw foo was false")
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:14:44 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:25:24 -> InstanceConstant(const Foo{Foo.x: 1})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_asserts.dart:25:24 -> InstanceConstant(const Foo{Foo.x: 1})
+Extra constant evaluation: tries: 34, successes: 10
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.textual_outline.expect
new file mode 100644
index 0000000..13faa29
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.textual_outline.expect
@@ -0,0 +1,30 @@
+class Foo {
+  final int x;
+  const Foo(this.x)
+      : assert(x > 0, "x is not positive"),
+        assert(x > 0),
+        assert(const bool.fromEnvironment("foo") == false,
+            "foo was ${const bool.fromEnvironment("foo")}"),
+        assert(const bool.fromEnvironment("foo") == false);
+  const Foo.withMessage(this.x)
+      : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+  const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+  const Foo.withInvalidCondition(this.x) : assert(x);
+}
+
+class Bar {
+  final int x;
+  const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+  const Bar.withoutMessage(this.x) : assert(x < 0);
+}
+
+const Foo foo1 = const Foo(1);
+const Foo foo2 = const Foo(0);
+const Foo foo3 = const Foo.withMessage(42);
+const Foo foo4 = const Foo.withInvalidMessage(42);
+const Foo foo5 = const Foo.withInvalidCondition(42);
+const Bar bar1 = const Bar.withMessage(1);
+const Bar bar2 = const Bar.withMessage(0);
+const Bar bar3 = const Bar.withoutMessage(1);
+const Bar bar4 = const Bar.withoutMessage(0);
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0bde6d8
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.textual_outline_modelled.expect
@@ -0,0 +1,30 @@
+class Bar {
+  const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+  const Bar.withoutMessage(this.x) : assert(x < 0);
+  final int x;
+}
+
+class Foo {
+  const Foo(this.x)
+      : assert(x > 0, "x is not positive"),
+        assert(x > 0),
+        assert(const bool.fromEnvironment("foo") == false,
+            "foo was ${const bool.fromEnvironment("foo")}"),
+        assert(const bool.fromEnvironment("foo") == false);
+  const Foo.withInvalidCondition(this.x) : assert(x);
+  const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+  const Foo.withMessage(this.x)
+      : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+  final int x;
+}
+
+const Bar bar1 = const Bar.withMessage(1);
+const Bar bar2 = const Bar.withMessage(0);
+const Bar bar3 = const Bar.withoutMessage(1);
+const Bar bar4 = const Bar.withoutMessage(0);
+const Foo foo1 = const Foo(1);
+const Foo foo2 = const Foo(0);
+const Foo foo3 = const Foo.withMessage(42);
+const Foo foo4 = const Foo.withInvalidMessage(42);
+const Foo foo5 = const Foo.withInvalidCondition(42);
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart
new file mode 100644
index 0000000..d96e7e1
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2020, 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.
+
+const List<bool> listWithUnevaluated = [
+  bool.fromEnvironment("foo"),
+  bool.fromEnvironment("bar"),
+  true,
+];
+const List<bool> listWithUnevaluatedSpread = [
+  true,
+  ...listWithUnevaluated,
+  false
+];
+
+const Set<bool> setWithUnevaluated = {
+  bool.fromEnvironment("foo"),
+  bool.fromEnvironment("bar"),
+  true,
+};
+const Set<bool> setWithUnevaluatedSpread = {true, ...setWithUnevaluated, false};
+
+const a = <int>[];
+const b = <int?>[];
+const setNotAgnosticOK = {a, b};
+
+const Map<bool> MapWithUnevaluated = {
+  bool.fromEnvironment("foo"): bool.fromEnvironment("bar"),
+};
+
+const mapNotAgnosticOK = {a: 0, b: 1};
+
+main() {
+  print(listWithUnevaluated);
+  print(listWithUnevaluatedSpread);
+  print(setWithUnevaluated);
+  print(setWithUnevaluatedSpread);
+  print({"hello"});
+  print(const {"hello"});
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.outline.expect
new file mode 100644
index 0000000..d579c1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.outline.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:27:7: Error: Expected 2 type arguments.
+// const Map<bool> MapWithUnevaluated = {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::bool> listWithUnevaluated = const <core::bool>[const core::bool::fromEnvironment("foo"), const core::bool::fromEnvironment("bar"), true];
+static const field core::List<core::bool> listWithUnevaluatedSpread = const <core::bool>[true] + self::listWithUnevaluated + const <core::bool>[false];
+static const field core::Set<core::bool> setWithUnevaluated = const <core::bool>{const core::bool::fromEnvironment("foo"), const core::bool::fromEnvironment("bar"), true};
+static const field core::Set<core::bool> setWithUnevaluatedSpread = const <core::bool>{true} + self::setWithUnevaluated + const <core::bool>{false};
+static const field core::List<core::int> a = const <core::int>[];
+static const field core::List<core::int?> b = const <core::int?>[];
+static const field core::Set<core::List<core::int?>> setNotAgnosticOK = const <core::List<core::int?>>{self::a, self::b};
+static const field invalid-type MapWithUnevaluated = const <core::bool, core::bool>{const core::bool::fromEnvironment("foo"): const core::bool::fromEnvironment("bar")};
+static const field core::Map<core::List<core::int?>, core::int> mapNotAgnosticOK = const <core::List<core::int?>, core::int>{self::a: 0, self::b: 1};
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated with empty environment: ListLiteral @ org-dartlang-testcase:///const_collections.dart:5:40 -> ListConstant(const <bool>[false, false, true])
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections.dart:6:8 -> BoolConstant(false)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections.dart:7:8 -> BoolConstant(false)
+Evaluated with empty environment: ListConcatenation @ org-dartlang-testcase:///const_collections.dart:10:46 -> ListConstant(const <bool>[true, false, false, true, false])
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:10:46 -> ListConstant(const <bool>[true])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///const_collections.dart:12:6 -> ListConstant(const <bool>[false, false, true])
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:10:46 -> ListConstant(const <bool>[false])
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections.dart:17:8 -> BoolConstant(false)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections.dart:18:8 -> BoolConstant(false)
+Evaluated: SetLiteral @ org-dartlang-testcase:///const_collections.dart:21:44 -> SetConstant(const <bool>{true})
+Evaluated: SetLiteral @ org-dartlang-testcase:///const_collections.dart:21:44 -> SetConstant(const <bool>{false})
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:23:16 -> ListConstant(const <int>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:24:17 -> ListConstant(const <int?>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:25:27 -> ListConstant(const <int>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:25:30 -> ListConstant(const <int?>[])
+Evaluated with empty environment: MapLiteral @ org-dartlang-testcase:///const_collections.dart:27:38 -> MapConstant(const <bool, bool>{false: false})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections.dart:28:8 -> BoolConstant(false)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections.dart:28:37 -> BoolConstant(false)
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:31:27 -> ListConstant(const <int>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:31:33 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 25, successes: 20
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.expect
new file mode 100644
index 0000000..83d7801
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.expect
@@ -0,0 +1,82 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:25:26: Error: Constant evaluation error:
+// const setNotAgnosticOK = {a, b};
+//                          ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:25:30: Context: Constant value is not strong/weak mode agnostic.
+// const setNotAgnosticOK = {a, b};
+//                              ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:25:7: Context: While analyzing:
+// const setNotAgnosticOK = {a, b};
+//       ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:31:26: Error: Constant evaluation error:
+// const mapNotAgnosticOK = {a: 0, b: 1};
+//                          ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:31:33: Context: Constant value is not strong/weak mode agnostic.
+// const mapNotAgnosticOK = {a: 0, b: 1};
+//                                 ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:31:7: Context: While analyzing:
+// const mapNotAgnosticOK = {a: 0, b: 1};
+//       ^
+//
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:27:7: Error: Expected 2 type arguments.
+// const Map<bool> MapWithUnevaluated = {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::bool> listWithUnevaluated = #C7;
+static const field core::List<core::bool> listWithUnevaluatedSpread = #C11;
+static const field core::Set<core::bool> setWithUnevaluated = #C15;
+static const field core::Set<core::bool> setWithUnevaluatedSpread = #C18;
+static const field core::List<core::int> a = #C19;
+static const field core::List<core::int?> b = #C20;
+static const field core::Set<core::List<core::int?>> setNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
+static const field invalid-type MapWithUnevaluated = #C22;
+static const field core::Map<core::List<core::int?>, core::int> mapNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
+static method main() → dynamic {
+  core::print(#C23);
+  core::print(#C24);
+  core::print(#C25);
+  core::print(#C26);
+  core::print(<core::String>{"hello"});
+  core::print(#C28);
+}
+
+constants  {
+  #C1 = <core::bool>[]
+  #C2 = <dynamic>[]
+  #C3 = "foo"
+  #C4 = "bar"
+  #C5 = true
+  #C6 = <dynamic>[#C5]
+  #C7 = eval #C1 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
+  #C8 = <core::bool>[#C5]
+  #C9 = false
+  #C10 = <core::bool>[#C9]
+  #C11 = eval #C8 + #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
+  #C12 = <core::bool>{}
+  #C13 = <dynamic>{}
+  #C14 = <dynamic>{#C5}
+  #C15 = eval #C12 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
+  #C16 = <core::bool>{#C5}
+  #C17 = <core::bool>{#C9}
+  #C18 = eval #C16 + #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
+  #C19 = <core::int>[]
+  #C20 = <core::int?>[]
+  #C21 = <core::bool, core::bool>{)
+  #C22 = eval #C21 + const <dynamic, dynamic>{const core::bool::fromEnvironment(#C3): const core::bool::fromEnvironment(#C4)}
+  #C23 = eval #C1 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
+  #C24 = eval #C8 + #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
+  #C25 = eval #C12 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
+  #C26 = eval #C16 + #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
+  #C27 = "hello"
+  #C28 = <core::String>{#C27}
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
new file mode 100644
index 0000000..b99c5b8
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
@@ -0,0 +1,91 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:25:26: Error: Constant evaluation error:
+// const setNotAgnosticOK = {a, b};
+//                          ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:25:30: Context: Constant value is not strong/weak mode agnostic.
+// const setNotAgnosticOK = {a, b};
+//                              ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:25:7: Context: While analyzing:
+// const setNotAgnosticOK = {a, b};
+//       ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:31:26: Error: Constant evaluation error:
+// const mapNotAgnosticOK = {a: 0, b: 1};
+//                          ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:31:33: Context: Constant value is not strong/weak mode agnostic.
+// const mapNotAgnosticOK = {a: 0, b: 1};
+//                                 ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:31:7: Context: While analyzing:
+// const mapNotAgnosticOK = {a: 0, b: 1};
+//       ^
+//
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:27:7: Error: Expected 2 type arguments.
+// const Map<bool> MapWithUnevaluated = {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::bool> listWithUnevaluated = #C7;
+static const field core::List<core::bool> listWithUnevaluatedSpread = #C11;
+static const field core::Set<core::bool> setWithUnevaluated = #C15;
+static const field core::Set<core::bool> setWithUnevaluatedSpread = #C18;
+static const field core::List<core::int> a = #C19;
+static const field core::List<core::int?> b = #C20;
+static const field core::Set<core::List<core::int?>> setNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
+static const field invalid-type MapWithUnevaluated = #C23;
+static const field core::Map<core::List<core::int?>, core::int> mapNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
+static method main() → dynamic {
+  core::print(#C24);
+  core::print(#C25);
+  core::print(#C26);
+  core::print(#C27);
+  core::print(<core::String>{"hello"});
+  core::print(#C29);
+}
+
+constants  {
+  #C1 = <core::bool>[]
+  #C2 = <dynamic>[]
+  #C3 = "foo"
+  #C4 = "bar"
+  #C5 = true
+  #C6 = <dynamic>[#C5]
+  #C7 = eval #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
+  #C8 = <core::bool>[#C5]
+  #C9 = false
+  #C10 = <core::bool>[#C9]
+  #C11 = eval #C8 + #C1 + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
+  #C12 = <core::bool>{}
+  #C13 = <dynamic>{}
+  #C14 = <dynamic>{#C5}
+  #C15 = eval #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
+  #C16 = <core::bool>{#C5}
+  #C17 = <core::bool>{#C9}
+  #C18 = eval #C16 + #C12 + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
+  #C19 = <core::int>[]
+  #C20 = <core::int?>[]
+  #C21 = <core::bool, core::bool>{)
+  #C22 = <dynamic, dynamic>{)
+  #C23 = eval #C21 + #C22 + const <dynamic, dynamic>{const core::bool::fromEnvironment(#C3): const core::bool::fromEnvironment(#C4)}
+  #C24 = eval #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
+  #C25 = eval #C8 + #C1 + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
+  #C26 = eval #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
+  #C27 = eval #C16 + #C12 + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
+  #C28 = "hello"
+  #C29 = <core::String>{#C28}
+}
+
+Extra constant evaluation status:
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:5:40 -> ListConstant(const <bool>[false, false, true])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:10:46 -> ListConstant(const <bool>[true, false, false, true, false])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:5:40 -> ListConstant(const <bool>[false, false, true])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:10:46 -> ListConstant(const <bool>[true, false, false, true, false])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections.dart:27:38 -> MapConstant(const <bool, bool>{false: false})
+Extra constant evaluation: tries: 16, successes: 5
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.textual_outline.expect
new file mode 100644
index 0000000..320e5f4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.textual_outline.expect
@@ -0,0 +1,24 @@
+const List<bool> listWithUnevaluated = [
+  bool.fromEnvironment("foo"),
+  bool.fromEnvironment("bar"),
+  true,
+];
+const List<bool> listWithUnevaluatedSpread = [
+  true,
+  ...listWithUnevaluated,
+  false
+];
+const Set<bool> setWithUnevaluated = {
+  bool.fromEnvironment("foo"),
+  bool.fromEnvironment("bar"),
+  true,
+};
+const Set<bool> setWithUnevaluatedSpread = {true, ...setWithUnevaluated, false};
+const a = <int>[];
+const b = <int?>[];
+const setNotAgnosticOK = {a, b};
+const Map<bool> MapWithUnevaluated = {
+  bool.fromEnvironment("foo"): bool.fromEnvironment("bar"),
+};
+const mapNotAgnosticOK = {a: 0, b: 1};
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c3b5d78
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.textual_outline_modelled.expect
@@ -0,0 +1,24 @@
+const List<bool> listWithUnevaluated = [
+  bool.fromEnvironment("foo"),
+  bool.fromEnvironment("bar"),
+  true,
+];
+const List<bool> listWithUnevaluatedSpread = [
+  true,
+  ...listWithUnevaluated,
+  false
+];
+const Map<bool> MapWithUnevaluated = {
+  bool.fromEnvironment("foo"): bool.fromEnvironment("bar"),
+};
+const Set<bool> setWithUnevaluated = {
+  bool.fromEnvironment("foo"),
+  bool.fromEnvironment("bar"),
+  true,
+};
+const Set<bool> setWithUnevaluatedSpread = {true, ...setWithUnevaluated, false};
+const a = <int>[];
+const b = <int?>[];
+const mapNotAgnosticOK = {a: 0, b: 1};
+const setNotAgnosticOK = {a, b};
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/folder.options b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/folder.options
new file mode 100644
index 0000000..41f34dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/folder.options
@@ -0,0 +1,5 @@
+--no-defines
+--target=none
+--no-verify
+--nnbd-agnostic
+--enable-experiment=non-nullable,triple-shift
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart
new file mode 100644
index 0000000..f790c4e
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2020, 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.
+
+const int foo = 42 * 42;
+const String bar =
+    "hello" " " "${String.fromEnvironment("baz", defaultValue: "world")}" "!";
+const bool baz = true && true && (false || true) && (42 == 21 * 4 / 2);
+const blaSymbol = #_x;
+
+main() {
+  _x();
+  const bool.fromEnvironment("foo");
+  print(bar);
+}
+
+void _x() {
+  print(foo);
+  print(bar);
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.outline.expect
new file mode 100644
index 0000000..b4f77fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int foo = 42.{core::num::*}(42);
+static const field core::String bar = "hello ${const core::String::fromEnvironment("baz", defaultValue: "world")}!";
+static const field core::bool baz = true && true && (false || true) && 42.{core::num::==}(21.{core::num::*}(4).{core::num::/}(2));
+static const field core::Symbol blaSymbol = #_x;
+static method main() → dynamic
+  ;
+static method _x() → void
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///rudimentary_test_01.dart:5:20 -> IntConstant(1764)
+Evaluated with empty environment: StringConcatenation @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello world!")
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///rudimentary_test_01.dart:7:27 -> StringConstant("world")
+Evaluated: LogicalExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:8:50 -> BoolConstant(true)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///rudimentary_test_01.dart:9:19 -> SymbolConstant(#_x)
+Extra constant evaluation: tries: 5, successes: 5
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.expect
new file mode 100644
index 0000000..113d7a2
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int foo = #C1;
+static const field core::String bar = #C6;
+static const field core::bool baz = #C7;
+static const field core::Symbol blaSymbol = #C8;
+static method main() → dynamic {
+  self::_x();
+  #C10;
+  core::print(#C11);
+}
+static method _x() → void {
+  core::print(#C1);
+  core::print(#C12);
+}
+
+constants  {
+  #C1 = 1764
+  #C2 = "hello "
+  #C3 = "baz"
+  #C4 = "world"
+  #C5 = "!"
+  #C6 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
+  #C7 = true
+  #C8 = #org-dartlang-testcase:///rudimentary_test_01.dart::_x
+  #C9 = "foo"
+  #C10 = eval const core::bool::fromEnvironment(#C9)
+  #C11 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
+  #C12 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
new file mode 100644
index 0000000..4af1ccc
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int foo = #C1;
+static const field core::String bar = #C6;
+static const field core::bool baz = #C7;
+static const field core::Symbol blaSymbol = #C8;
+static method main() → dynamic {
+  self::_x();
+  #C10;
+  core::print(#C11);
+}
+static method _x() → void {
+  core::print(#C1);
+  core::print(#C12);
+}
+
+constants  {
+  #C1 = 1764
+  #C2 = "hello "
+  #C3 = "baz"
+  #C4 = "world"
+  #C5 = "!"
+  #C6 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
+  #C7 = true
+  #C8 = #org-dartlang-testcase:///rudimentary_test_01.dart::_x
+  #C9 = "foo"
+  #C10 = eval const core::bool::fromEnvironment(#C9)
+  #C11 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
+  #C12 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
+}
+
+Extra constant evaluation status:
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:13:9 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello world!")
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello world!")
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///rudimentary_test_01.dart:6:18 -> StringConstant("hello world!")
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.textual_outline.expect
new file mode 100644
index 0000000..e88a140
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+const int foo = 42 * 42;
+const String bar =
+    "hello" " " "${String.fromEnvironment("baz", defaultValue: "world")}" "!";
+const bool baz = true && true && (false || true) && (42 == 21 * 4 / 2);
+const blaSymbol = #_x;
+main() {}
+void _x() {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..8e6f0e5
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+const String bar =
+    "hello" " " "${String.fromEnvironment("baz", defaultValue: "world")}" "!";
+const blaSymbol = #_x;
+const bool baz = true && true && (false || true) && (42 == 21 * 4 / 2);
+const int foo = 42 * 42;
+main() {}
+void _x() {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart
new file mode 100644
index 0000000..43e4383
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart
@@ -0,0 +1,144 @@
+// Copyright (c) 2020, 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.
+
+import "various_lib.dart" deferred as lib;
+
+const bool barFromEnv = const bool.fromEnvironment("bar");
+const bool hasBarEnv = const bool.hasEnvironment("bar");
+const bool? barFromEnvOrNull0 = const bool.fromEnvironment("bar") ? true : null;
+const bool barFromEnvOrNull =
+    const bool.fromEnvironment("bar", defaultValue: barFromEnvOrNull0!);
+const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+const bool nullAwareOnNull = barFromEnvOrNull ?? true;
+const bool andOnNull = barFromEnvOrNull && true;
+const bool andOnNull2 = true && barFromEnvOrNull;
+const bool orOnNull = barFromEnvOrNull || true;
+const bool orOnNull2 = barFromEnvOrNull || false;
+const bool orOnNull3 = true || barFromEnvOrNull;
+const bool orOnNull4 = false || barFromEnvOrNull;
+
+const fromDeferredLib = lib.x;
+
+class Foo<E> {
+  final bool saved;
+  final bool saved2;
+  const bool initialized =
+      const bool.fromEnvironment("foo", defaultValue: barFromEnv);
+  final E value;
+
+  const Foo(this.value,
+      {this.saved2: const bool.fromEnvironment("foo", defaultValue: barFromEnv),
+      bool x: const bool.fromEnvironment("foo", defaultValue: barFromEnv)})
+      : saved = x;
+}
+
+const x = const Foo<int>(42);
+
+const bool? y = true;
+const bool z = !(y!);
+
+const maybeInt = bool.fromEnvironment("foo") ? 42 : true;
+const bool isItInt = maybeInt is int ? true : false;
+const maybeInt2 = z ? 42 : true;
+const bool isItInt2 = maybeInt2 is int ? true : false;
+const maybeInt3 = z ? 42 : null;
+const bool isItInt3 = maybeInt3 is int ? true : false;
+
+const dynamic listOfNull = [null];
+const bool isListOfNull = listOfNull is List<Null>;
+const dynamic listOfInt = [42];
+const bool isListOfInt = listOfInt is List<int>;
+const bool isList = listOfInt is List;
+const dynamic setOfInt = {42};
+const bool isSetOfInt = setOfInt is Set<int>;
+const dynamic mapOfInt = {42: 42};
+const bool isMapOfInt = mapOfInt is Map<int, int>;
+const dynamic listOfListOfInt = [
+  [42]
+];
+const bool isListOfListOfInt = listOfListOfInt is List<List<int>>;
+const dynamic setOfSetOfInt = {
+  {42}
+};
+const bool isSetOfSetOfInt = setOfSetOfInt is Set<Set<int>>;
+const dynamic mapOfMapOfInt1 = {
+  {42: 42}: 42
+};
+const dynamic mapOfMapOfInt2 = {
+  42: {42: 42}
+};
+const bool isMapOfMapOfInt1 = mapOfMapOfInt1 is Map<Map<int, int>, int>;
+const bool isMapOfMapOfInt2 = mapOfMapOfInt2 is Map<int, Map<int, int>>;
+
+const Symbol symbolWithUnevaluatedParameter =
+    const Symbol(String.fromEnvironment("foo"));
+const Symbol symbolWithInvalidName = const Symbol("42");
+
+class A {
+  const A();
+
+  A operator -() => this;
+}
+
+class B implements A {
+  const B();
+
+  B operator -() => this;
+}
+
+class C implements A {
+  const C();
+
+  C operator -() => this;
+}
+
+class Class<T extends A> {
+  const Class(T t);
+  const Class.redirect(dynamic t) : this(t);
+  const Class.method(T t) : this(-t);
+}
+
+class Subclass<T extends A> extends Class<T> {
+  const Subclass(dynamic t) : super(t);
+}
+
+const c0 = bool.fromEnvironment("x") ? null : const Class<B>.redirect(C());
+const c1 = bool.fromEnvironment("x") ? null : const Class<A>.method(A());
+const c2 = bool.fromEnvironment("x") ? null : const Subclass<B>(C());
+const c3 = bool.fromEnvironment("x") ? null : const Class<A>(A());
+const c4 = bool.fromEnvironment("x") ? null : const Class<B>.redirect(B());
+const c5 = bool.fromEnvironment("x") ? null : const Subclass<A>(A());
+const c6 = bool.fromEnvironment("x") ? null : const Subclass<B>(B());
+
+typedef F = int Function(int, {int named});
+const f = F;
+
+class ConstClassWithF {
+  final F foo;
+  const ConstClassWithF(this.foo);
+}
+
+int procedure(int i, {int named}) => i;
+ConstClassWithF constClassWithF1 = const ConstClassWithF(procedure);
+const ConstClassWithF constClassWithF2 = const ConstClassWithF(procedure);
+
+const bool unevaluatedBool = bool.fromEnvironment("foo");
+const bool notUnevaluatedBool = !unevaluatedBool;
+const bool? unevaluatedBoolOrNull =
+    bool.fromEnvironment("bar") ? unevaluatedBool : null;
+const bool unevaluatedBoolNotNull = unevaluatedBoolOrNull!;
+
+main() {
+  print(c0);
+  print(c1);
+  print(c2);
+  print(c3);
+  print(c4);
+  print(c5);
+  print(c6);
+  print(x);
+  print(x.saved);
+  print(x.value);
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
new file mode 100644
index 0000000..de68860
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
@@ -0,0 +1,229 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:27:3: Error: Only static fields can be declared as const.
+// Try using 'final' instead of 'const', or adding the keyword 'static'.
+//   const bool initialized =
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:25: Error: 'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.
+// Try moving the constant from the deferred library, or removing 'deferred' from the import.
+//
+// const fromDeferredLib = lib.x;
+//                         ^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:14:30: Warning: Operand of null-aware operation '??' has type 'bool' which excludes null.
+// const bool nullAwareOnNull = barFromEnvOrNull ?? true;
+//                              ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+//  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+//   const Class.method(T t) : this(-t);
+//                                  ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:123:27: Error: Optional parameter 'named' should have a default value because its type 'int' doesn't allow null.
+// int procedure(int i, {int named}) => i;
+//                           ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "various_lib.dart" as var;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///various_lib.dart" deferred as lib;
+
+typedef F = (core::int, {named: core::int}) → core::int;
+class Foo<E extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool saved;
+  final field core::bool saved2;
+  field core::bool initialized;
+  final field self::Foo::E% value;
+  const constructor •(self::Foo::E% value, {core::bool saved2 = const core::bool::fromEnvironment("foo", defaultValue: self::barFromEnv), core::bool x = const core::bool::fromEnvironment("foo", defaultValue: self::barFromEnv)}) → self::Foo<self::Foo::E%>
+    : self::Foo::value = value, self::Foo::saved2 = saved2, self::Foo::saved = x, super core::Object::•()
+    ;
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator unary-() → self::A
+    ;
+}
+class B extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+  operator unary-() → self::B
+    ;
+}
+class C extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator unary-() → self::C
+    ;
+}
+class Class<T extends self::A = self::A> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::Class::T t) → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+  const constructor redirect(dynamic t) → self::Class<self::Class::T>
+    : this self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Class::T)
+    ;
+  const constructor method(self::Class::T t) → self::Class<self::Class::T>
+    : this self::Class::•(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^" in t.{self::A::unary-}() as{TypeError,ForNonNullableByDefault} <BottomType>)
+    ;
+}
+class Subclass<T extends self::A = self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
+  const constructor •(dynamic t) → self::Subclass<self::Subclass::T>
+    : super self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Subclass::T)
+    ;
+}
+class ConstClassWithF extends core::Object /*hasConstConstructor*/  {
+  final field (core::int, {named: core::int}) → core::int foo;
+  const constructor •((core::int, {named: core::int}) → core::int foo) → self::ConstClassWithF
+    : self::ConstClassWithF::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::bool barFromEnv = const core::bool::fromEnvironment("bar");
+static const field core::bool hasBarEnv = const core::bool::hasEnvironment("bar");
+static const field core::bool? barFromEnvOrNull0 = const core::bool::fromEnvironment("bar") ?{core::bool?} true : null;
+static const field core::bool barFromEnvOrNull = const core::bool::fromEnvironment("bar", defaultValue: self::barFromEnvOrNull0!);
+static const field core::bool notBarFromEnvOrNull = !self::barFromEnvOrNull;
+static const field core::bool conditionalOnNull = self::barFromEnvOrNull ?{core::bool} true : false;
+static const field core::bool nullAwareOnNull = let final core::bool #t2 = self::barFromEnvOrNull in #t2.{core::Object::==}(null) ?{core::bool} true : #t2;
+static const field core::bool andOnNull = self::barFromEnvOrNull && true;
+static const field core::bool andOnNull2 = true && self::barFromEnvOrNull;
+static const field core::bool orOnNull = self::barFromEnvOrNull || true;
+static const field core::bool orOnNull2 = self::barFromEnvOrNull || false;
+static const field core::bool orOnNull3 = true || self::barFromEnvOrNull;
+static const field core::bool orOnNull4 = false || self::barFromEnvOrNull;
+static const field core::int fromDeferredLib = let final dynamic #t3 = CheckLibraryIsLoaded(lib) in var::x;
+static const field self::Foo<core::int> x = const self::Foo::•<core::int>(42);
+static const field core::bool? y = true;
+static const field core::bool z = !self::y!;
+static const field core::Object maybeInt = const core::bool::fromEnvironment("foo") ?{core::Object} 42 : true;
+static const field core::bool isItInt = self::maybeInt is{ForNonNullableByDefault} core::int ?{core::bool} true : false;
+static const field core::Object maybeInt2 = self::z ?{core::Object} 42 : true;
+static const field core::bool isItInt2 = self::maybeInt2 is{ForNonNullableByDefault} core::int ?{core::bool} true : false;
+static const field core::int? maybeInt3 = self::z ?{core::int?} 42 : null;
+static const field core::bool isItInt3 = self::maybeInt3 is{ForNonNullableByDefault} core::int ?{core::bool} true : false;
+static const field dynamic listOfNull = const <core::Null?>[null];
+static const field core::bool isListOfNull = self::listOfNull is{ForNonNullableByDefault} core::List<core::Null?>;
+static const field dynamic listOfInt = const <core::int>[42];
+static const field core::bool isListOfInt = self::listOfInt is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool isList = self::listOfInt is{ForNonNullableByDefault} core::List<dynamic>;
+static const field dynamic setOfInt = const <core::int>{42};
+static const field core::bool isSetOfInt = self::setOfInt is{ForNonNullableByDefault} core::Set<core::int>;
+static const field dynamic mapOfInt = const <core::int, core::int>{42: 42};
+static const field core::bool isMapOfInt = self::mapOfInt is{ForNonNullableByDefault} core::Map<core::int, core::int>;
+static const field dynamic listOfListOfInt = const <core::List<core::int>>[const <core::int>[42]];
+static const field core::bool isListOfListOfInt = self::listOfListOfInt is{ForNonNullableByDefault} core::List<core::List<core::int>>;
+static const field dynamic setOfSetOfInt = const <core::Set<core::int>>{const <core::int>{42}};
+static const field core::bool isSetOfSetOfInt = self::setOfSetOfInt is{ForNonNullableByDefault} core::Set<core::Set<core::int>>;
+static const field dynamic mapOfMapOfInt1 = const <core::Map<core::int, core::int>, core::int>{const <core::int, core::int>{42: 42}: 42};
+static const field dynamic mapOfMapOfInt2 = const <core::int, core::Map<core::int, core::int>>{42: const <core::int, core::int>{42: 42}};
+static const field core::bool isMapOfMapOfInt1 = self::mapOfMapOfInt1 is{ForNonNullableByDefault} core::Map<core::Map<core::int, core::int>, core::int>;
+static const field core::bool isMapOfMapOfInt2 = self::mapOfMapOfInt2 is{ForNonNullableByDefault} core::Map<core::int, core::Map<core::int, core::int>>;
+static const field core::Symbol symbolWithUnevaluatedParameter = const _in::Symbol::•(const core::String::fromEnvironment("foo"));
+static const field core::Symbol symbolWithInvalidName = const _in::Symbol::•("42");
+static const field self::Class<self::B>? c0 = const core::bool::fromEnvironment("x") ?{self::Class<self::B>?} null : const self::Class::redirect<self::B>(const self::C::•());
+static const field self::Class<self::A>? c1 = const core::bool::fromEnvironment("x") ?{self::Class<self::A>?} null : const self::Class::method<self::A>(const self::A::•());
+static const field self::Subclass<self::B>? c2 = const core::bool::fromEnvironment("x") ?{self::Subclass<self::B>?} null : const self::Subclass::•<self::B>(const self::C::•());
+static const field self::Class<self::A>? c3 = const core::bool::fromEnvironment("x") ?{self::Class<self::A>?} null : const self::Class::•<self::A>(const self::A::•());
+static const field self::Class<self::B>? c4 = const core::bool::fromEnvironment("x") ?{self::Class<self::B>?} null : const self::Class::redirect<self::B>(const self::B::•());
+static const field self::Subclass<self::A>? c5 = const core::bool::fromEnvironment("x") ?{self::Subclass<self::A>?} null : const self::Subclass::•<self::A>(const self::A::•());
+static const field self::Subclass<self::B>? c6 = const core::bool::fromEnvironment("x") ?{self::Subclass<self::B>?} null : const self::Subclass::•<self::B>(const self::B::•());
+static const field core::Type f = (core::int, {named: core::int}) → core::int;
+static field self::ConstClassWithF constClassWithF1;
+static const field self::ConstClassWithF constClassWithF2 = const self::ConstClassWithF::•(self::procedure);
+static const field core::bool unevaluatedBool = const core::bool::fromEnvironment("foo");
+static const field core::bool notUnevaluatedBool = !self::unevaluatedBool;
+static const field core::bool? unevaluatedBoolOrNull = const core::bool::fromEnvironment("bar") ?{core::bool?} self::unevaluatedBool : null;
+static const field core::bool unevaluatedBoolNotNull = self::unevaluatedBoolOrNull!;
+static method procedure(core::int i, {core::int named}) → core::int
+  ;
+static method main() → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as var;
+import "dart:core" as core;
+
+static const field core::int x = 42;
+
+
+Extra constant evaluation status:
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:32:27 -> BoolConstant(false)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:32:69 -> BoolConstant(false)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:33:21 -> BoolConstant(false)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:33:63 -> BoolConstant(false)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:7:31 -> BoolConstant(false)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:8:30 -> BoolConstant(false)
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:9:67 -> NullConstant(null)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:9:39 -> BoolConstant(false)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:11:53 -> NullConstant(null)
+Evaluated: LogicalExpression @ org-dartlang-testcase:///various.dart:19:29 -> BoolConstant(true)
+Evaluated: StaticGet @ org-dartlang-testcase:///various.dart:22:29 -> IntConstant(42)
+Evaluated with empty environment: ConstructorInvocation @ org-dartlang-testcase:///various.dart:37:17 -> InstanceConstant(const Foo<int>{Foo.saved: false, Foo.saved2: false, Foo.initialized: null, Foo.value: 42})
+Evaluated: Not @ org-dartlang-testcase:///various.dart:40:16 -> BoolConstant(false)
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:42:46 -> BoolConstant(true)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:42:23 -> BoolConstant(false)
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:43:38 -> BoolConstant(false)
+Evaluated with empty environment: IsExpression @ org-dartlang-testcase:///various.dart:43:31 -> BoolConstant(false)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:43:22 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:44:21 -> BoolConstant(true)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:45:40 -> BoolConstant(false)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:46:21 -> NullConstant(null)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:47:40 -> BoolConstant(false)
+Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:49:28 -> ListConstant(const <Null?>[null])
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:50:38 -> BoolConstant(true)
+Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:51:27 -> ListConstant(const <int>[42])
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:52:36 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:53:31 -> BoolConstant(true)
+Evaluated: SetLiteral @ org-dartlang-testcase:///various.dart:54:26 -> SetConstant(const <int>{42})
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:55:34 -> BoolConstant(true)
+Evaluated: MapLiteral @ org-dartlang-testcase:///various.dart:56:26 -> MapConstant(const <int, int>{42: 42})
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:57:34 -> BoolConstant(true)
+Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:58:33 -> ListConstant(const <List<int>>[const <int>[42]])
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:61:48 -> BoolConstant(true)
+Evaluated: SetLiteral @ org-dartlang-testcase:///various.dart:62:31 -> SetConstant(const <Set<int>>{const <int>{42}})
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:65:44 -> BoolConstant(true)
+Evaluated: MapLiteral @ org-dartlang-testcase:///various.dart:66:32 -> MapConstant(const <Map<int, int>, int>{const <int, int>{42: 42}: 42})
+Evaluated: MapLiteral @ org-dartlang-testcase:///various.dart:69:32 -> MapConstant(const <int, Map<int, int>>{42: const <int, int>{42: 42}})
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:72:46 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:73:46 -> BoolConstant(true)
+Evaluated with empty environment: ConstructorInvocation @ org-dartlang-testcase:///various.dart:76:11 -> SymbolConstant(#)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:76:25 -> StringConstant("")
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:107:17 -> BoolConstant(false)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:107:71 -> InstanceConstant(const C{})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:108:17 -> BoolConstant(false)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:108:69 -> InstanceConstant(const A{})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:109:17 -> BoolConstant(false)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:109:65 -> InstanceConstant(const C{})
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:110:38 -> InstanceConstant(const Class<A>{})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:110:17 -> BoolConstant(false)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:110:53 -> InstanceConstant(const Class<A>{})
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:111:38 -> InstanceConstant(const Class<B>{})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:111:17 -> BoolConstant(false)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:111:53 -> InstanceConstant(const Class<B>{})
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:112:38 -> InstanceConstant(const Subclass<A>{})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:112:17 -> BoolConstant(false)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:112:53 -> InstanceConstant(const Subclass<A>{})
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:113:38 -> InstanceConstant(const Subclass<B>{})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:113:17 -> BoolConstant(false)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:113:53 -> InstanceConstant(const Subclass<B>{})
+Evaluated: TypeLiteral @ org-dartlang-testcase:///various.dart:116:11 -> TypeLiteralConstant(int Function(int, {named: int}))
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:125:48 -> InstanceConstant(const ConstClassWithF{ConstClassWithF.foo: procedure})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:127:35 -> BoolConstant(false)
+Evaluated with empty environment: Not @ org-dartlang-testcase:///various.dart:128:33 -> BoolConstant(true)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:128:34 -> BoolConstant(false)
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various.dart:130:33 -> NullConstant(null)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:130:10 -> BoolConstant(false)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:130:35 -> BoolConstant(false)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:131:37 -> NullConstant(null)
+Extra constant evaluation: tries: 112, successes: 68
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
new file mode 100644
index 0000000..349600b
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
@@ -0,0 +1,263 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:29: Error: Constant evaluation error:
+// const fromDeferredLib = lib.x;
+//                             ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:29: Context: 'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.
+// Try moving the constant from the deferred library, or removing 'deferred' from the import.
+//
+// const fromDeferredLib = lib.x;
+//                             ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:7: Context: While analyzing:
+// const fromDeferredLib = lib.x;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:44: Error: Constant evaluation error:
+// const Symbol symbolWithInvalidName = const Symbol("42");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:51: Context: The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '"42"'.
+// const Symbol symbolWithInvalidName = const Symbol("42");
+//                                                   ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:14: Context: While analyzing:
+// const Symbol symbolWithInvalidName = const Symbol("42");
+//              ^
+//
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:27:3: Error: Only static fields can be declared as const.
+// Try using 'final' instead of 'const', or adding the keyword 'static'.
+//   const bool initialized =
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:25: Error: 'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.
+// Try moving the constant from the deferred library, or removing 'deferred' from the import.
+//
+// const fromDeferredLib = lib.x;
+//                         ^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:14:30: Warning: Operand of null-aware operation '??' has type 'bool' which excludes null.
+// const bool nullAwareOnNull = barFromEnvOrNull ?? true;
+//                              ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+//  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+//   const Class.method(T t) : this(-t);
+//                                  ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:123:27: Error: Optional parameter 'named' should have a default value because its type 'int' doesn't allow null.
+// int procedure(int i, {int named}) => i;
+//                           ^^^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:31:9: Error: Constructor is marked 'const' so all fields must be final.
+//   const Foo(this.value,
+//         ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:27:14: Context: Field isn't final, but constructor is 'const'.
+//   const bool initialized =
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///various_lib.dart" deferred as lib;
+
+typedef F = (core::int, {named: core::int}) → core::int;
+class Foo<E extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool saved;
+  final field core::bool saved2;
+  field core::bool initialized = #C3;
+  final field self::Foo::E% value;
+  const constructor •(self::Foo::E% value, {core::bool saved2 = #C4, core::bool x = #C5}) → self::Foo<self::Foo::E%>
+    : self::Foo::value = value, self::Foo::saved2 = saved2, self::Foo::saved = x, super core::Object::•()
+    ;
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator unary-() → self::A
+    return this;
+}
+class B extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+  operator unary-() → self::B
+    return this;
+}
+class C extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator unary-() → self::C
+    return this;
+}
+class Class<T extends self::A = self::A> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::Class::T t) → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+  const constructor redirect(dynamic t) → self::Class<self::Class::T>
+    : this self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Class::T)
+    ;
+  const constructor method(self::Class::T t) → self::Class<self::Class::T>
+    : this self::Class::•(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^" in t.{self::A::unary-}() as{TypeError,ForNonNullableByDefault} <BottomType>)
+    ;
+}
+class Subclass<T extends self::A = self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
+  const constructor •(dynamic t) → self::Subclass<self::Subclass::T>
+    : super self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Subclass::T)
+    ;
+}
+class ConstClassWithF extends core::Object /*hasConstConstructor*/  {
+  final field (core::int, {named: core::int}) → core::int foo;
+  const constructor •((core::int, {named: core::int}) → core::int foo) → self::ConstClassWithF
+    : self::ConstClassWithF::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::bool barFromEnv = #C6;
+static const field core::bool hasBarEnv = #C7;
+static const field core::bool? barFromEnvOrNull0 = #C10;
+static const field core::bool barFromEnvOrNull = #C11;
+static const field core::bool notBarFromEnvOrNull = #C12;
+static const field core::bool conditionalOnNull = #C14;
+static const field core::bool nullAwareOnNull = #C15;
+static const field core::bool andOnNull = #C16;
+static const field core::bool andOnNull2 = #C17;
+static const field core::bool orOnNull = #C18;
+static const field core::bool orOnNull2 = #C19;
+static const field core::bool orOnNull3 = #C8;
+static const field core::bool orOnNull4 = #C20;
+static const field core::int fromDeferredLib = invalid-expression "'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.";
+static const field self::Foo<core::int> x = #C22;
+static const field core::bool? y = #C8;
+static const field core::bool z = #C13;
+static const field core::Object maybeInt = #C23;
+static const field core::bool isItInt = #C24;
+static const field core::Object maybeInt2 = #C8;
+static const field core::bool isItInt2 = #C13;
+static const field core::int? maybeInt3 = #C9;
+static const field core::bool isItInt3 = #C13;
+static const field dynamic listOfNull = #C25;
+static const field core::bool isListOfNull = #C8;
+static const field dynamic listOfInt = #C26;
+static const field core::bool isListOfInt = #C8;
+static const field core::bool isList = #C8;
+static const field dynamic setOfInt = #C27;
+static const field core::bool isSetOfInt = #C8;
+static const field dynamic mapOfInt = #C28;
+static const field core::bool isMapOfInt = #C8;
+static const field dynamic listOfListOfInt = #C29;
+static const field core::bool isListOfListOfInt = #C8;
+static const field dynamic setOfSetOfInt = #C30;
+static const field core::bool isSetOfSetOfInt = #C8;
+static const field dynamic mapOfMapOfInt1 = #C31;
+static const field dynamic mapOfMapOfInt2 = #C32;
+static const field core::bool isMapOfMapOfInt1 = #C8;
+static const field core::bool isMapOfMapOfInt2 = #C8;
+static const field core::Symbol symbolWithUnevaluatedParameter = #C33;
+static const field core::Symbol symbolWithInvalidName = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\"42\"'.";
+static const field self::Class<self::B>? c0 = #C35;
+static const field self::Class<self::A>? c1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^";
+static const field self::Subclass<self::B>? c2 = #C36;
+static const field self::Class<self::A>? c3 = #C37;
+static const field self::Class<self::B>? c4 = #C38;
+static const field self::Subclass<self::A>? c5 = #C39;
+static const field self::Subclass<self::B>? c6 = #C40;
+static const field core::Type f = #C41;
+static field self::ConstClassWithF constClassWithF1 = #C43;
+static const field self::ConstClassWithF constClassWithF2 = #C43;
+static const field core::bool unevaluatedBool = #C44;
+static const field core::bool notUnevaluatedBool = #C45;
+static const field core::bool? unevaluatedBoolOrNull = #C46;
+static const field core::bool unevaluatedBoolNotNull = #C47;
+static method procedure(core::int i, {core::int named = #C9}) → core::int
+  return i;
+static method main() → dynamic {
+  core::print(#C48);
+  core::print(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^");
+  core::print(#C49);
+  core::print(#C50);
+  core::print(#C51);
+  core::print(#C52);
+  core::print(#C53);
+  core::print(#C54);
+  core::print((#C55).{self::Foo::saved});
+  core::print((#C56).{self::Foo::value});
+}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+static const field core::int x = #C21;
+
+constants  {
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C4 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C5 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C6 = eval const core::bool::fromEnvironment(#C2)
+  #C7 = eval const core::bool::hasEnvironment(#C2)
+  #C8 = true
+  #C9 = null
+  #C10 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9
+  #C11 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C12 = eval !const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C13 = false
+  #C14 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) ?{core::bool} #C8 : #C13
+  #C15 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!).==(#C9) ?{core::bool} #C8 : const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C16 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) && (#C8)
+  #C17 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C18 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C8)
+  #C19 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C13)
+  #C20 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C21 = 42
+  #C22 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C23 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8
+  #C24 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
+  #C25 = <core::Null?>[#C9]
+  #C26 = <core::int>[#C21]
+  #C27 = <core::int>{#C21}
+  #C28 = <core::int, core::int>{#C21:#C21)
+  #C29 = <core::List<core::int>>[#C26]
+  #C30 = <core::Set<core::int>>{#C27}
+  #C31 = <core::Map<core::int, core::int>, core::int>{#C28:#C21)
+  #C32 = <core::int, core::Map<core::int, core::int>>{#C21:#C28)
+  #C33 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
+  #C34 = "x"
+  #C35 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C36 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C37 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
+  #C38 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C39 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
+  #C40 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C41 = TypeLiteralConstant((core::int, {named: core::int}) → core::int)
+  #C42 = tearoff self::procedure
+  #C43 = self::ConstClassWithF {foo:#C42}
+  #C44 = eval const core::bool::fromEnvironment(#C1)
+  #C45 = eval !const core::bool::fromEnvironment(#C1)
+  #C46 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
+  #C47 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
+  #C48 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C49 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C50 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
+  #C51 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C52 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
+  #C53 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C54 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C55 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C56 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
new file mode 100644
index 0000000..fd822a9
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
@@ -0,0 +1,290 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:29: Error: Constant evaluation error:
+// const fromDeferredLib = lib.x;
+//                             ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:29: Context: 'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.
+// Try moving the constant from the deferred library, or removing 'deferred' from the import.
+//
+// const fromDeferredLib = lib.x;
+//                             ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:7: Context: While analyzing:
+// const fromDeferredLib = lib.x;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:44: Error: Constant evaluation error:
+// const Symbol symbolWithInvalidName = const Symbol("42");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:51: Context: The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '"42"'.
+// const Symbol symbolWithInvalidName = const Symbol("42");
+//                                                   ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:14: Context: While analyzing:
+// const Symbol symbolWithInvalidName = const Symbol("42");
+//              ^
+//
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:27:3: Error: Only static fields can be declared as const.
+// Try using 'final' instead of 'const', or adding the keyword 'static'.
+//   const bool initialized =
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:25: Error: 'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.
+// Try moving the constant from the deferred library, or removing 'deferred' from the import.
+//
+// const fromDeferredLib = lib.x;
+//                         ^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:14:30: Warning: Operand of null-aware operation '??' has type 'bool' which excludes null.
+// const bool nullAwareOnNull = barFromEnvOrNull ?? true;
+//                              ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+//  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+//   const Class.method(T t) : this(-t);
+//                                  ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:123:27: Error: Optional parameter 'named' should have a default value because its type 'int' doesn't allow null.
+// int procedure(int i, {int named}) => i;
+//                           ^^^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:31:9: Error: Constructor is marked 'const' so all fields must be final.
+//   const Foo(this.value,
+//         ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:27:14: Context: Field isn't final, but constructor is 'const'.
+//   const bool initialized =
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///various_lib.dart" deferred as lib;
+
+typedef F = (core::int, {named: core::int}) → core::int;
+class Foo<E extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool saved;
+  final field core::bool saved2;
+  field core::bool initialized = #C3;
+  final field self::Foo::E% value;
+  const constructor •(self::Foo::E% value, {core::bool saved2 = #C4, core::bool x = #C5}) → self::Foo<self::Foo::E%>
+    : self::Foo::value = value, self::Foo::saved2 = saved2, self::Foo::saved = x, super core::Object::•()
+    ;
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator unary-() → self::A
+    return this;
+}
+class B extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+  operator unary-() → self::B
+    return this;
+}
+class C extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator unary-() → self::C
+    return this;
+}
+class Class<T extends self::A = self::A> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::Class::T t) → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+  const constructor redirect(dynamic t) → self::Class<self::Class::T>
+    : this self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Class::T)
+    ;
+  const constructor method(self::Class::T t) → self::Class<self::Class::T>
+    : this self::Class::•(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^" in t.{self::A::unary-}() as{TypeError,ForNonNullableByDefault} <BottomType>)
+    ;
+}
+class Subclass<T extends self::A = self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
+  const constructor •(dynamic t) → self::Subclass<self::Subclass::T>
+    : super self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Subclass::T)
+    ;
+}
+class ConstClassWithF extends core::Object /*hasConstConstructor*/  {
+  final field (core::int, {named: core::int}) → core::int foo;
+  const constructor •((core::int, {named: core::int}) → core::int foo) → self::ConstClassWithF
+    : self::ConstClassWithF::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::bool barFromEnv = #C6;
+static const field core::bool hasBarEnv = #C7;
+static const field core::bool? barFromEnvOrNull0 = #C10;
+static const field core::bool barFromEnvOrNull = #C11;
+static const field core::bool notBarFromEnvOrNull = #C12;
+static const field core::bool conditionalOnNull = #C14;
+static const field core::bool nullAwareOnNull = #C15;
+static const field core::bool andOnNull = #C16;
+static const field core::bool andOnNull2 = #C17;
+static const field core::bool orOnNull = #C18;
+static const field core::bool orOnNull2 = #C19;
+static const field core::bool orOnNull3 = #C8;
+static const field core::bool orOnNull4 = #C20;
+static const field core::int fromDeferredLib = invalid-expression "'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.";
+static const field self::Foo<core::int> x = #C22;
+static const field core::bool? y = #C8;
+static const field core::bool z = #C13;
+static const field core::Object maybeInt = #C23;
+static const field core::bool isItInt = #C24;
+static const field core::Object maybeInt2 = #C8;
+static const field core::bool isItInt2 = #C13;
+static const field core::int? maybeInt3 = #C9;
+static const field core::bool isItInt3 = #C13;
+static const field dynamic listOfNull = #C25;
+static const field core::bool isListOfNull = #C8;
+static const field dynamic listOfInt = #C26;
+static const field core::bool isListOfInt = #C8;
+static const field core::bool isList = #C8;
+static const field dynamic setOfInt = #C27;
+static const field core::bool isSetOfInt = #C8;
+static const field dynamic mapOfInt = #C28;
+static const field core::bool isMapOfInt = #C8;
+static const field dynamic listOfListOfInt = #C29;
+static const field core::bool isListOfListOfInt = #C8;
+static const field dynamic setOfSetOfInt = #C30;
+static const field core::bool isSetOfSetOfInt = #C8;
+static const field dynamic mapOfMapOfInt1 = #C31;
+static const field dynamic mapOfMapOfInt2 = #C32;
+static const field core::bool isMapOfMapOfInt1 = #C8;
+static const field core::bool isMapOfMapOfInt2 = #C8;
+static const field core::Symbol symbolWithUnevaluatedParameter = #C33;
+static const field core::Symbol symbolWithInvalidName = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\"42\"'.";
+static const field self::Class<self::B>? c0 = #C35;
+static const field self::Class<self::A>? c1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^";
+static const field self::Subclass<self::B>? c2 = #C36;
+static const field self::Class<self::A>? c3 = #C37;
+static const field self::Class<self::B>? c4 = #C38;
+static const field self::Subclass<self::A>? c5 = #C39;
+static const field self::Subclass<self::B>? c6 = #C40;
+static const field core::Type f = #C41;
+static field self::ConstClassWithF constClassWithF1 = #C43;
+static const field self::ConstClassWithF constClassWithF2 = #C43;
+static const field core::bool unevaluatedBool = #C44;
+static const field core::bool notUnevaluatedBool = #C45;
+static const field core::bool? unevaluatedBoolOrNull = #C46;
+static const field core::bool unevaluatedBoolNotNull = #C47;
+static method procedure(core::int i, {core::int named = #C9}) → core::int
+  return i;
+static method main() → dynamic {
+  core::print(#C48);
+  core::print(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^");
+  core::print(#C49);
+  core::print(#C50);
+  core::print(#C51);
+  core::print(#C52);
+  core::print(#C53);
+  core::print(#C54);
+  core::print((#C55).{self::Foo::saved});
+  core::print((#C56).{self::Foo::value});
+}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+static const field core::int x = #C21;
+
+constants  {
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C4 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C5 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C6 = eval const core::bool::fromEnvironment(#C2)
+  #C7 = eval const core::bool::hasEnvironment(#C2)
+  #C8 = true
+  #C9 = null
+  #C10 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9
+  #C11 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C12 = eval !const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C13 = false
+  #C14 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) ?{core::bool} #C8 : #C13
+  #C15 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!).==(#C9) ?{core::bool} #C8 : const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C16 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) && (#C8)
+  #C17 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C18 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C8)
+  #C19 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C13)
+  #C20 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C21 = 42
+  #C22 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C23 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8
+  #C24 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
+  #C25 = <core::Null?>[#C9]
+  #C26 = <core::int>[#C21]
+  #C27 = <core::int>{#C21}
+  #C28 = <core::int, core::int>{#C21:#C21)
+  #C29 = <core::List<core::int>>[#C26]
+  #C30 = <core::Set<core::int>>{#C27}
+  #C31 = <core::Map<core::int, core::int>, core::int>{#C28:#C21)
+  #C32 = <core::int, core::Map<core::int, core::int>>{#C21:#C28)
+  #C33 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
+  #C34 = "x"
+  #C35 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C36 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C37 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
+  #C38 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C39 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
+  #C40 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C41 = TypeLiteralConstant((core::int, {named: core::int}) → core::int)
+  #C42 = tearoff self::procedure
+  #C43 = self::ConstClassWithF {foo:#C42}
+  #C44 = eval const core::bool::fromEnvironment(#C1)
+  #C45 = eval !const core::bool::fromEnvironment(#C1)
+  #C46 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
+  #C47 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
+  #C48 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C49 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C50 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
+  #C51 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C52 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
+  #C53 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C54 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C55 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C56 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+}
+
+Extra constant evaluation status:
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:32:27 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:33:21 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:28:13 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:110:38 -> InstanceConstant(const Class<A>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:111:38 -> InstanceConstant(const Class<B>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:112:38 -> InstanceConstant(const Subclass<A>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:113:38 -> InstanceConstant(const Subclass<B>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:37:17 -> InstanceConstant(const Foo<int>{Foo.saved: false, Foo.saved2: false, Foo.initialized: false, Foo.value: 42})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:37:17 -> InstanceConstant(const Foo<int>{Foo.saved: false, Foo.saved2: false, Foo.initialized: false, Foo.value: 42})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:37:17 -> InstanceConstant(const Foo<int>{Foo.saved: false, Foo.saved2: false, Foo.initialized: false, Foo.value: 42})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:7:31 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:8:30 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:9:67 -> NullConstant(null)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:37:17 -> InstanceConstant(const Foo<int>{Foo.saved: false, Foo.saved2: false, Foo.initialized: false, Foo.value: 42})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:42:46 -> BoolConstant(true)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:43:38 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:76:11 -> SymbolConstant(#)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:110:38 -> InstanceConstant(const Class<A>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:111:38 -> InstanceConstant(const Class<B>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:112:38 -> InstanceConstant(const Subclass<A>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:113:38 -> InstanceConstant(const Subclass<B>{})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:127:35 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:128:33 -> BoolConstant(true)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various.dart:130:33 -> NullConstant(null)
+Extra constant evaluation: tries: 66, successes: 24
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.textual_outline.expect
new file mode 100644
index 0000000..602836a
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.textual_outline.expect
@@ -0,0 +1,117 @@
+import "various_lib.dart" deferred as lib;
+
+const bool barFromEnv = const bool.fromEnvironment("bar");
+const bool hasBarEnv = const bool.hasEnvironment("bar");
+const bool? barFromEnvOrNull0 = const bool.fromEnvironment("bar") ? true : null;
+const bool barFromEnvOrNull =
+    const bool.fromEnvironment("bar", defaultValue: barFromEnvOrNull0!);
+const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+const bool nullAwareOnNull = barFromEnvOrNull ?? true;
+const bool andOnNull = barFromEnvOrNull && true;
+const bool andOnNull2 = true && barFromEnvOrNull;
+const bool orOnNull = barFromEnvOrNull || true;
+const bool orOnNull2 = barFromEnvOrNull || false;
+const bool orOnNull3 = true || barFromEnvOrNull;
+const bool orOnNull4 = false || barFromEnvOrNull;
+const fromDeferredLib = lib.x;
+
+class Foo<E> {
+  final bool saved;
+  final bool saved2;
+  const bool initialized =
+      const bool.fromEnvironment("foo", defaultValue: barFromEnv);
+  final E value;
+  const Foo(this.value,
+      {this.saved2: const bool.fromEnvironment("foo", defaultValue: barFromEnv),
+      bool x: const bool.fromEnvironment("foo", defaultValue: barFromEnv)})
+      : saved = x;
+}
+
+const x = const Foo<int>(42);
+const bool? y = true;
+const bool z = !(y!);
+const maybeInt = bool.fromEnvironment("foo") ? 42 : true;
+const bool isItInt = maybeInt is int ? true : false;
+const maybeInt2 = z ? 42 : true;
+const bool isItInt2 = maybeInt2 is int ? true : false;
+const maybeInt3 = z ? 42 : null;
+const bool isItInt3 = maybeInt3 is int ? true : false;
+const dynamic listOfNull = [null];
+const bool isListOfNull = listOfNull is List<Null>;
+const dynamic listOfInt = [42];
+const bool isListOfInt = listOfInt is List<int>;
+const bool isList = listOfInt is List;
+const dynamic setOfInt = {42};
+const bool isSetOfInt = setOfInt is Set<int>;
+const dynamic mapOfInt = {42: 42};
+const bool isMapOfInt = mapOfInt is Map<int, int>;
+const dynamic listOfListOfInt = [
+  [42]
+];
+const bool isListOfListOfInt = listOfListOfInt is List<List<int>>;
+const dynamic setOfSetOfInt = {
+  {42}
+};
+const bool isSetOfSetOfInt = setOfSetOfInt is Set<Set<int>>;
+const dynamic mapOfMapOfInt1 = {
+  {42: 42}: 42
+};
+const dynamic mapOfMapOfInt2 = {
+  42: {42: 42}
+};
+const bool isMapOfMapOfInt1 = mapOfMapOfInt1 is Map<Map<int, int>, int>;
+const bool isMapOfMapOfInt2 = mapOfMapOfInt2 is Map<int, Map<int, int>>;
+const Symbol symbolWithUnevaluatedParameter =
+    const Symbol(String.fromEnvironment("foo"));
+const Symbol symbolWithInvalidName = const Symbol("42");
+
+class A {
+  const A();
+  A operator -() => this;
+}
+
+class B implements A {
+  const B();
+  B operator -() => this;
+}
+
+class C implements A {
+  const C();
+  C operator -() => this;
+}
+
+class Class<T extends A> {
+  const Class(T t);
+  const Class.redirect(dynamic t) : this(t);
+  const Class.method(T t) : this(-t);
+}
+
+class Subclass<T extends A> extends Class<T> {
+  const Subclass(dynamic t) : super(t);
+}
+
+const c0 = bool.fromEnvironment("x") ? null : const Class<B>.redirect(C());
+const c1 = bool.fromEnvironment("x") ? null : const Class<A>.method(A());
+const c2 = bool.fromEnvironment("x") ? null : const Subclass<B>(C());
+const c3 = bool.fromEnvironment("x") ? null : const Class<A>(A());
+const c4 = bool.fromEnvironment("x") ? null : const Class<B>.redirect(B());
+const c5 = bool.fromEnvironment("x") ? null : const Subclass<A>(A());
+const c6 = bool.fromEnvironment("x") ? null : const Subclass<B>(B());
+typedef F = int Function(int, {int named});
+const f = F;
+
+class ConstClassWithF {
+  final F foo;
+  const ConstClassWithF(this.foo);
+}
+
+int procedure(int i, {int named}) => i;
+ConstClassWithF constClassWithF1 = const ConstClassWithF(procedure);
+const ConstClassWithF constClassWithF2 = const ConstClassWithF(procedure);
+const bool unevaluatedBool = bool.fromEnvironment("foo");
+const bool notUnevaluatedBool = !unevaluatedBool;
+const bool? unevaluatedBoolOrNull =
+    bool.fromEnvironment("bar") ? unevaluatedBool : null;
+const bool unevaluatedBoolNotNull = unevaluatedBoolOrNull!;
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..80ce452
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.textual_outline_modelled.expect
@@ -0,0 +1,115 @@
+import "various_lib.dart" deferred as lib;
+
+ConstClassWithF constClassWithF1 = const ConstClassWithF(procedure);
+
+class A {
+  A operator -() => this;
+  const A();
+}
+
+class B implements A {
+  B operator -() => this;
+  const B();
+}
+
+class C implements A {
+  C operator -() => this;
+  const C();
+}
+
+class Class<T extends A> {
+  const Class(T t);
+  const Class.method(T t) : this(-t);
+  const Class.redirect(dynamic t) : this(t);
+}
+
+class ConstClassWithF {
+  const ConstClassWithF(this.foo);
+  final F foo;
+}
+
+class Foo<E> {
+  const Foo(this.value,
+      {this.saved2: const bool.fromEnvironment("foo", defaultValue: barFromEnv),
+      bool x: const bool.fromEnvironment("foo", defaultValue: barFromEnv)})
+      : saved = x;
+  const bool initialized =
+      const bool.fromEnvironment("foo", defaultValue: barFromEnv);
+  final E value;
+  final bool saved;
+  final bool saved2;
+}
+
+class Subclass<T extends A> extends Class<T> {
+  const Subclass(dynamic t) : super(t);
+}
+
+const ConstClassWithF constClassWithF2 = const ConstClassWithF(procedure);
+const Symbol symbolWithInvalidName = const Symbol("42");
+const Symbol symbolWithUnevaluatedParameter =
+    const Symbol(String.fromEnvironment("foo"));
+const bool? barFromEnvOrNull0 = const bool.fromEnvironment("bar") ? true : null;
+const bool? unevaluatedBoolOrNull =
+    bool.fromEnvironment("bar") ? unevaluatedBool : null;
+const bool? y = true;
+const bool andOnNull = barFromEnvOrNull && true;
+const bool andOnNull2 = true && barFromEnvOrNull;
+const bool barFromEnv = const bool.fromEnvironment("bar");
+const bool barFromEnvOrNull =
+    const bool.fromEnvironment("bar", defaultValue: barFromEnvOrNull0!);
+const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+const bool hasBarEnv = const bool.hasEnvironment("bar");
+const bool isItInt = maybeInt is int ? true : false;
+const bool isItInt2 = maybeInt2 is int ? true : false;
+const bool isItInt3 = maybeInt3 is int ? true : false;
+const bool isList = listOfInt is List;
+const bool isListOfInt = listOfInt is List<int>;
+const bool isListOfListOfInt = listOfListOfInt is List<List<int>>;
+const bool isListOfNull = listOfNull is List<Null>;
+const bool isMapOfInt = mapOfInt is Map<int, int>;
+const bool isMapOfMapOfInt1 = mapOfMapOfInt1 is Map<Map<int, int>, int>;
+const bool isMapOfMapOfInt2 = mapOfMapOfInt2 is Map<int, Map<int, int>>;
+const bool isSetOfInt = setOfInt is Set<int>;
+const bool isSetOfSetOfInt = setOfSetOfInt is Set<Set<int>>;
+const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+const bool notUnevaluatedBool = !unevaluatedBool;
+const bool nullAwareOnNull = barFromEnvOrNull ?? true;
+const bool orOnNull = barFromEnvOrNull || true;
+const bool orOnNull2 = barFromEnvOrNull || false;
+const bool orOnNull3 = true || barFromEnvOrNull;
+const bool orOnNull4 = false || barFromEnvOrNull;
+const bool unevaluatedBool = bool.fromEnvironment("foo");
+const bool unevaluatedBoolNotNull = unevaluatedBoolOrNull!;
+const bool z = !(y!);
+const c0 = bool.fromEnvironment("x") ? null : const Class<B>.redirect(C());
+const c1 = bool.fromEnvironment("x") ? null : const Class<A>.method(A());
+const c2 = bool.fromEnvironment("x") ? null : const Subclass<B>(C());
+const c3 = bool.fromEnvironment("x") ? null : const Class<A>(A());
+const c4 = bool.fromEnvironment("x") ? null : const Class<B>.redirect(B());
+const c5 = bool.fromEnvironment("x") ? null : const Subclass<A>(A());
+const c6 = bool.fromEnvironment("x") ? null : const Subclass<B>(B());
+const dynamic listOfInt = [42];
+const dynamic listOfListOfInt = [
+  [42]
+];
+const dynamic listOfNull = [null];
+const dynamic mapOfInt = {42: 42};
+const dynamic mapOfMapOfInt1 = {
+  {42: 42}: 42
+};
+const dynamic mapOfMapOfInt2 = {
+  42: {42: 42}
+};
+const dynamic setOfInt = {42};
+const dynamic setOfSetOfInt = {
+  {42}
+};
+const f = F;
+const fromDeferredLib = lib.x;
+const maybeInt = bool.fromEnvironment("foo") ? 42 : true;
+const maybeInt2 = z ? 42 : true;
+const maybeInt3 = z ? 42 : null;
+const x = const Foo<int>(42);
+int procedure(int i, {int named}) => i;
+main() {}
+typedef F = int Function(int, {int named});
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart
new file mode 100644
index 0000000..f8da5a4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2020, 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.
+
+import 'various_2_lib.dart' as lib;
+
+typedef F1<T> = T Function(T);
+typedef F2 = T Function<T>(T);
+
+const objectTypeLiteral = Object;
+const int Function(int) partialInstantiation = lib.id1;
+const instance = const lib.Class<int>(0);
+const instance2 = const lib.Class<dynamic>([42]);
+
+const functionTypeLiteral = F1;
+const genericFunctionTypeLiteral = F2;
+const listLiteral = <int>[0];
+const listLiteral2 = <dynamic>[
+  <int>[42]
+];
+const setLiteral = <int>{0};
+const setLiteral2 = <dynamic>{
+  <int>[42]
+};
+const mapLiteral = <int, String>{0: 'foo'};
+const mapLiteral2 = <dynamic, dynamic>{
+  <int>[42]: 'foo',
+  null: <int>[42]
+};
+const listConcatenation = <int>[...listLiteral];
+const setConcatenation = <int>{...setLiteral};
+const mapConcatenation = <int, String>{...mapLiteral};
+
+const objectTypeLiteralIdentical =
+    identical(objectTypeLiteral, lib.objectTypeLiteral);
+const partialInstantiationIdentical =
+    identical(partialInstantiation, lib.partialInstantiation);
+const instanceIdentical = identical(instance, lib.instance);
+const instance2Identical = identical(instance2, lib.instance2);
+const functionTypeLiteralIdentical =
+    identical(functionTypeLiteral, lib.functionTypeLiteral);
+const genericFunctionTypeLiteralIdentical =
+    identical(genericFunctionTypeLiteral, lib.genericFunctionTypeLiteral);
+const listLiteralIdentical = identical(listLiteral, lib.listLiteral);
+const listLiteral2Identical = identical(listLiteral2, lib.listLiteral2);
+const setLiteralIdentical = identical(setLiteral, lib.setLiteral);
+const setLiteral2Identical = identical(setLiteral2, lib.setLiteral2);
+const mapLiteralIdentical = identical(mapLiteral, lib.mapLiteral);
+const mapLiteral2Identical = identical(mapLiteral2, lib.mapLiteral2);
+const listConcatenationIdentical =
+    identical(listConcatenation, lib.listConcatenation);
+const setConcatenationIdentical =
+    identical(setConcatenation, lib.setConcatenation);
+const mapConcatenationIdentical =
+    identical(mapConcatenation, lib.mapConcatenation);
+
+main() {
+  test(objectTypeLiteral, lib.objectTypeLiteral);
+  test(partialInstantiation, lib.partialInstantiation);
+  test(instance, lib.instance);
+  test(functionTypeLiteral, lib.functionTypeLiteral);
+  test(genericFunctionTypeLiteral, lib.genericFunctionTypeLiteral);
+  test(listLiteral, lib.listLiteral);
+  test(setLiteral, lib.setLiteral);
+  test(mapLiteral, lib.mapLiteral);
+  test(listConcatenation, lib.listConcatenation);
+  test(setConcatenation, lib.setConcatenation);
+  test(mapConcatenation, lib.mapConcatenation);
+
+  test(true, objectTypeLiteralIdentical);
+  test(true, partialInstantiationIdentical);
+  test(true, instanceIdentical);
+  test(true, functionTypeLiteralIdentical);
+  test(true, genericFunctionTypeLiteralIdentical);
+  test(true, listLiteralIdentical);
+  test(true, setLiteralIdentical);
+  test(true, mapLiteralIdentical);
+  test(true, listConcatenationIdentical);
+  test(true, setConcatenationIdentical);
+  test(true, mapConcatenationIdentical);
+}
+
+test(expected, actual) {
+  print('test($expected, $actual)');
+  if (!identical(expected, actual)) {
+    throw 'Expected $expected, actual $actual';
+  }
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.outline.expect
new file mode 100644
index 0000000..5f4b31d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.outline.expect
@@ -0,0 +1,133 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "various_2_lib.dart" as var;
+
+import "org-dartlang-testcase:///various_2_lib.dart" as lib;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+static const field core::Type objectTypeLiteral = core::Object;
+static const field (core::int) → core::int partialInstantiation = var::id1<core::int>;
+static const field var::Class<core::int> instance = const var::Class::•<core::int>(0);
+static const field var::Class<dynamic> instance2 = const var::Class::•<dynamic>(const <core::int>[42]);
+static const field core::Type functionTypeLiteral = (dynamic) → dynamic;
+static const field core::Type genericFunctionTypeLiteral = <T extends core::Object? = dynamic>(T%) → T%;
+static const field core::List<core::int> listLiteral = const <core::int>[0];
+static const field core::List<dynamic> listLiteral2 = const <dynamic>[const <core::int>[42]];
+static const field core::Set<core::int> setLiteral = const <core::int>{0};
+static const field core::Set<dynamic> setLiteral2 = const <dynamic>{const <core::int>[42]};
+static const field core::Map<core::int, core::String> mapLiteral = const <core::int, core::String>{0: "foo"};
+static const field core::Map<dynamic, dynamic> mapLiteral2 = const <dynamic, dynamic>{const <core::int>[42]: "foo", null: const <core::int>[42]};
+static const field core::List<core::int> listConcatenation = self::listLiteral;
+static const field core::Set<core::int> setConcatenation = self::setLiteral;
+static const field core::Map<core::int, core::String> mapConcatenation = self::mapLiteral;
+static const field core::bool objectTypeLiteralIdentical = core::identical(self::objectTypeLiteral, var::objectTypeLiteral);
+static const field core::bool partialInstantiationIdentical = core::identical(self::partialInstantiation, var::partialInstantiation);
+static const field core::bool instanceIdentical = core::identical(self::instance, var::instance);
+static const field core::bool instance2Identical = core::identical(self::instance2, var::instance2);
+static const field core::bool functionTypeLiteralIdentical = core::identical(self::functionTypeLiteral, var::functionTypeLiteral);
+static const field core::bool genericFunctionTypeLiteralIdentical = core::identical(self::genericFunctionTypeLiteral, var::genericFunctionTypeLiteral);
+static const field core::bool listLiteralIdentical = core::identical(self::listLiteral, var::listLiteral);
+static const field core::bool listLiteral2Identical = core::identical(self::listLiteral2, var::listLiteral2);
+static const field core::bool setLiteralIdentical = core::identical(self::setLiteral, var::setLiteral);
+static const field core::bool setLiteral2Identical = core::identical(self::setLiteral2, var::setLiteral2);
+static const field core::bool mapLiteralIdentical = core::identical(self::mapLiteral, var::mapLiteral);
+static const field core::bool mapLiteral2Identical = core::identical(self::mapLiteral2, var::mapLiteral2);
+static const field core::bool listConcatenationIdentical = core::identical(self::listConcatenation, var::listConcatenation);
+static const field core::bool setConcatenationIdentical = core::identical(self::setConcatenation, var::setConcatenation);
+static const field core::bool mapConcatenationIdentical = core::identical(self::mapConcatenation, var::mapConcatenation);
+static method main() → dynamic
+  ;
+static method test(dynamic expected, dynamic actual) → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as var;
+import "dart:core" as core;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field var::Class::T% field;
+  const constructor •(var::Class::T% field) → var::Class<var::Class::T%>
+    : var::Class::field = field, super core::Object::•()
+    ;
+}
+static const field core::Type objectTypeLiteral = core::Object;
+static const field (core::Object?, core::Object?) → core::bool c2 = core::identical;
+static const field (core::int) → core::int partialInstantiation = const core::bool::fromEnvironment("foo") ?{(core::int) → core::int} var::id1<core::int> : var::id2<core::int>;
+static const field var::Class<core::int> instance = const var::Class::•<core::int>(0);
+static const field var::Class<dynamic> instance2 = const var::Class::•<dynamic>(const <core::int>[42]);
+static const field core::Type functionTypeLiteral = (dynamic) → dynamic;
+static const field core::Type genericFunctionTypeLiteral = <T extends core::Object? = dynamic>(T%) → T%;
+static const field core::List<core::int> listLiteral = const <core::int>[0];
+static const field core::List<dynamic> listLiteral2 = const <dynamic>[const <core::int>[42]];
+static const field core::Set<core::int> setLiteral = const <core::int>{0};
+static const field core::Set<dynamic> setLiteral2 = const <dynamic>{const <core::int>[42]};
+static const field core::Map<core::int, core::String> mapLiteral = const <core::int, core::String>{0: "foo"};
+static const field core::Map<dynamic, dynamic> mapLiteral2 = const <dynamic, dynamic>{const <core::int>[42]: "foo", null: const <core::int>[42]};
+static const field core::List<core::int> listConcatenation = var::listLiteral;
+static const field core::Set<core::int> setConcatenation = var::setLiteral;
+static const field core::Map<core::int, core::String> mapConcatenation = var::mapLiteral;
+static method id1<T extends core::Object? = dynamic>(var::id1::T% t) → var::id1::T%
+  ;
+static method id2<T extends core::Object? = dynamic>(var::id2::T% t) → var::id2::T%
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///various_2.dart:10:27 -> TypeLiteralConstant(Object)
+Evaluated: Instantiation @ org-dartlang-testcase:///various_2.dart:11:52 -> PartialInstantiationConstant(id1<int>)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various_2.dart:12:24 -> InstanceConstant(const Class<int>{Class.field: 0})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various_2.dart:13:25 -> InstanceConstant(const Class<dynamic>{Class.field: const <int>[42]})
+Evaluated: TypeLiteral @ org-dartlang-testcase:///various_2.dart:15:29 -> TypeLiteralConstant(dynamic Function(dynamic))
+Evaluated: TypeLiteral @ org-dartlang-testcase:///various_2.dart:16:36 -> TypeLiteralConstant(T% Function<T>(T%))
+Evaluated: ListLiteral @ org-dartlang-testcase:///various_2.dart:17:26 -> ListConstant(const <int>[0])
+Evaluated: ListLiteral @ org-dartlang-testcase:///various_2.dart:18:31 -> ListConstant(const <dynamic>[const <int>[42]])
+Evaluated: SetLiteral @ org-dartlang-testcase:///various_2.dart:21:25 -> SetConstant(const <int>{0})
+Evaluated: SetLiteral @ org-dartlang-testcase:///various_2.dart:22:30 -> SetConstant(const <dynamic>{const <int>[42]})
+Evaluated: MapLiteral @ org-dartlang-testcase:///various_2.dart:25:33 -> MapConstant(const <int, String>{0: "foo"})
+Evaluated: MapLiteral @ org-dartlang-testcase:///various_2.dart:26:39 -> MapConstant(const <dynamic, dynamic>{const <int>[42]: "foo", null: const <int>[42]})
+Evaluated: ListConcatenation @ org-dartlang-testcase:///various_2.dart:30:32 -> ListConstant(const <int>[0])
+Evaluated: SetConcatenation @ org-dartlang-testcase:///various_2.dart:31:31 -> SetConstant(const <int>{0})
+Evaluated: MapConcatenation @ org-dartlang-testcase:///various_2.dart:32:7 -> MapConstant(const <int, String>{0: "foo"})
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:35:5 -> BoolConstant(true)
+Evaluated with empty environment: StaticInvocation @ org-dartlang-testcase:///various_2.dart:37:5 -> BoolConstant(false)
+Evaluated: StaticGet @ org-dartlang-testcase:///various_2.dart:37:15 -> PartialInstantiationConstant(id1<int>)
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various_2.dart:37:41 -> PartialInstantiationConstant(id2<int>)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:38:27 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:39:28 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:41:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:43:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:44:30 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:45:31 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:46:29 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:47:30 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:48:29 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:49:30 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:51:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:53:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///various_2.dart:55:5 -> BoolConstant(true)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///various_2_lib.dart:17:27 -> TypeLiteralConstant(Object)
+Evaluated: StaticGet @ org-dartlang-testcase:///various_2_lib.dart:18:12 -> TearOffConstant(identical)
+Evaluated with empty environment: ConditionalExpression @ org-dartlang-testcase:///various_2_lib.dart:20:39 -> PartialInstantiationConstant(id2<int>)
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various_2_lib.dart:20:11 -> BoolConstant(false)
+Evaluated with empty environment: Instantiation @ org-dartlang-testcase:///various_2_lib.dart:20:41 -> PartialInstantiationConstant(id1<int>)
+Evaluated: StaticGet @ org-dartlang-testcase:///various_2_lib.dart:20:41 -> TearOffConstant(id1)
+Evaluated with empty environment: Instantiation @ org-dartlang-testcase:///various_2_lib.dart:20:47 -> PartialInstantiationConstant(id2<int>)
+Evaluated: StaticGet @ org-dartlang-testcase:///various_2_lib.dart:20:47 -> TearOffConstant(id2)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various_2_lib.dart:21:24 -> InstanceConstant(const Class<int>{Class.field: 0})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various_2_lib.dart:22:25 -> InstanceConstant(const Class<dynamic>{Class.field: const <int>[42]})
+Evaluated: TypeLiteral @ org-dartlang-testcase:///various_2_lib.dart:23:29 -> TypeLiteralConstant(dynamic Function(dynamic))
+Evaluated: TypeLiteral @ org-dartlang-testcase:///various_2_lib.dart:24:36 -> TypeLiteralConstant(T% Function<T>(T%))
+Evaluated: ListLiteral @ org-dartlang-testcase:///various_2_lib.dart:25:26 -> ListConstant(const <int>[0])
+Evaluated: ListLiteral @ org-dartlang-testcase:///various_2_lib.dart:26:31 -> ListConstant(const <dynamic>[const <int>[42]])
+Evaluated: SetLiteral @ org-dartlang-testcase:///various_2_lib.dart:29:25 -> SetConstant(const <int>{0})
+Evaluated: SetLiteral @ org-dartlang-testcase:///various_2_lib.dart:30:30 -> SetConstant(const <dynamic>{const <int>[42]})
+Evaluated: MapLiteral @ org-dartlang-testcase:///various_2_lib.dart:33:33 -> MapConstant(const <int, String>{0: "foo"})
+Evaluated: MapLiteral @ org-dartlang-testcase:///various_2_lib.dart:34:39 -> MapConstant(const <dynamic, dynamic>{const <int>[42]: "foo", null: const <int>[42]})
+Evaluated: ListConcatenation @ org-dartlang-testcase:///various_2_lib.dart:38:32 -> ListConstant(const <int>[0])
+Evaluated: SetConcatenation @ org-dartlang-testcase:///various_2_lib.dart:39:31 -> SetConstant(const <int>{0})
+Evaluated: MapConcatenation @ org-dartlang-testcase:///various_2_lib.dart:40:7 -> MapConstant(const <int, String>{0: "foo"})
+Extra constant evaluation: tries: 54, successes: 53
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.expect
new file mode 100644
index 0000000..95db2f1
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.expect
@@ -0,0 +1,130 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "various_2_lib.dart" as var;
+
+import "org-dartlang-testcase:///various_2_lib.dart" as lib;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::int) → core::int partialInstantiation = #C3;
+static const field var::Class<core::int> instance = #C5;
+static const field var::Class<dynamic> instance2 = #C8;
+static const field core::Type functionTypeLiteral = #C9;
+static const field core::Type genericFunctionTypeLiteral = #C10;
+static const field core::List<core::int> listLiteral = #C11;
+static const field core::List<dynamic> listLiteral2 = #C12;
+static const field core::Set<core::int> setLiteral = #C13;
+static const field core::Set<dynamic> setLiteral2 = #C14;
+static const field core::Map<core::int, core::String> mapLiteral = #C16;
+static const field core::Map<dynamic, dynamic> mapLiteral2 = #C18;
+static const field core::List<core::int> listConcatenation = #C11;
+static const field core::Set<core::int> setConcatenation = #C13;
+static const field core::Map<core::int, core::String> mapConcatenation = #C16;
+static const field core::bool objectTypeLiteralIdentical = #C19;
+static const field core::bool partialInstantiationIdentical = #C21;
+static const field core::bool instanceIdentical = #C19;
+static const field core::bool instance2Identical = #C19;
+static const field core::bool functionTypeLiteralIdentical = #C19;
+static const field core::bool genericFunctionTypeLiteralIdentical = #C19;
+static const field core::bool listLiteralIdentical = #C19;
+static const field core::bool listLiteral2Identical = #C19;
+static const field core::bool setLiteralIdentical = #C19;
+static const field core::bool setLiteral2Identical = #C19;
+static const field core::bool mapLiteralIdentical = #C19;
+static const field core::bool mapLiteral2Identical = #C19;
+static const field core::bool listConcatenationIdentical = #C19;
+static const field core::bool setConcatenationIdentical = #C19;
+static const field core::bool mapConcatenationIdentical = #C19;
+static method main() → dynamic {
+  self::test(#C1, #C1);
+  self::test(#C3, #C22);
+  self::test(#C5, #C5);
+  self::test(#C9, #C9);
+  self::test(#C10, #C10);
+  self::test(#C11, #C11);
+  self::test(#C13, #C13);
+  self::test(#C16, #C16);
+  self::test(#C11, #C11);
+  self::test(#C13, #C13);
+  self::test(#C16, #C16);
+  self::test(true, #C19);
+  self::test(true, #C23);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+}
+static method test(dynamic expected, dynamic actual) → dynamic {
+  core::print("test(${expected}, ${actual})");
+  if(!core::identical(expected, actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
+
+library /*isNonNullableByDefault*/;
+import self as var;
+import "dart:core" as core;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field var::Class::T% field;
+  const constructor •(var::Class::T% field) → var::Class<var::Class::T%>
+    : var::Class::field = field, super core::Object::•()
+    ;
+}
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::Object?, core::Object?) → core::bool c2 = #C24;
+static const field (core::int) → core::int partialInstantiation = #C25;
+static const field var::Class<core::int> instance = #C5;
+static const field var::Class<dynamic> instance2 = #C8;
+static const field core::Type functionTypeLiteral = #C9;
+static const field core::Type genericFunctionTypeLiteral = #C10;
+static const field core::List<core::int> listLiteral = #C11;
+static const field core::List<dynamic> listLiteral2 = #C12;
+static const field core::Set<core::int> setLiteral = #C13;
+static const field core::Set<dynamic> setLiteral2 = #C14;
+static const field core::Map<core::int, core::String> mapLiteral = #C16;
+static const field core::Map<dynamic, dynamic> mapLiteral2 = #C18;
+static const field core::List<core::int> listConcatenation = #C11;
+static const field core::Set<core::int> setConcatenation = #C13;
+static const field core::Map<core::int, core::String> mapConcatenation = #C16;
+static method id1<T extends core::Object? = dynamic>(var::id1::T% t) → var::id1::T%
+  return t;
+static method id2<T extends core::Object? = dynamic>(var::id2::T% t) → var::id2::T%
+  return t;
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Object)
+  #C2 = tearoff var::id1
+  #C3 = partial-instantiation var::id1 <core::int>
+  #C4 = 0
+  #C5 = var::Class<core::int> {field:#C4}
+  #C6 = 42
+  #C7 = <core::int>[#C6]
+  #C8 = var::Class<dynamic> {field:#C7}
+  #C9 = TypeLiteralConstant((dynamic) → dynamic)
+  #C10 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
+  #C11 = <core::int>[#C4]
+  #C12 = <dynamic>[#C7]
+  #C13 = <core::int>{#C4}
+  #C14 = <dynamic>{#C7}
+  #C15 = "foo"
+  #C16 = <core::int, core::String>{#C4:#C15)
+  #C17 = null
+  #C18 = <dynamic, dynamic>{#C7:#C15, #C17:#C7)
+  #C19 = true
+  #C20 = tearoff var::id2
+  #C21 = eval const core::identical(#C3, const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>)
+  #C22 = eval const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>
+  #C23 = eval const core::identical(#C3, const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>)
+  #C24 = tearoff core::identical
+  #C25 = eval const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.transformed.expect
new file mode 100644
index 0000000..52f3aa3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.transformed.expect
@@ -0,0 +1,137 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "various_2_lib.dart" as var;
+
+import "org-dartlang-testcase:///various_2_lib.dart" as lib;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::int) → core::int partialInstantiation = #C3;
+static const field var::Class<core::int> instance = #C5;
+static const field var::Class<dynamic> instance2 = #C8;
+static const field core::Type functionTypeLiteral = #C9;
+static const field core::Type genericFunctionTypeLiteral = #C10;
+static const field core::List<core::int> listLiteral = #C11;
+static const field core::List<dynamic> listLiteral2 = #C12;
+static const field core::Set<core::int> setLiteral = #C13;
+static const field core::Set<dynamic> setLiteral2 = #C14;
+static const field core::Map<core::int, core::String> mapLiteral = #C16;
+static const field core::Map<dynamic, dynamic> mapLiteral2 = #C18;
+static const field core::List<core::int> listConcatenation = #C11;
+static const field core::Set<core::int> setConcatenation = #C13;
+static const field core::Map<core::int, core::String> mapConcatenation = #C16;
+static const field core::bool objectTypeLiteralIdentical = #C19;
+static const field core::bool partialInstantiationIdentical = #C21;
+static const field core::bool instanceIdentical = #C19;
+static const field core::bool instance2Identical = #C19;
+static const field core::bool functionTypeLiteralIdentical = #C19;
+static const field core::bool genericFunctionTypeLiteralIdentical = #C19;
+static const field core::bool listLiteralIdentical = #C19;
+static const field core::bool listLiteral2Identical = #C19;
+static const field core::bool setLiteralIdentical = #C19;
+static const field core::bool setLiteral2Identical = #C19;
+static const field core::bool mapLiteralIdentical = #C19;
+static const field core::bool mapLiteral2Identical = #C19;
+static const field core::bool listConcatenationIdentical = #C19;
+static const field core::bool setConcatenationIdentical = #C19;
+static const field core::bool mapConcatenationIdentical = #C19;
+static method main() → dynamic {
+  self::test(#C1, #C1);
+  self::test(#C3, #C22);
+  self::test(#C5, #C5);
+  self::test(#C9, #C9);
+  self::test(#C10, #C10);
+  self::test(#C11, #C11);
+  self::test(#C13, #C13);
+  self::test(#C16, #C16);
+  self::test(#C11, #C11);
+  self::test(#C13, #C13);
+  self::test(#C16, #C16);
+  self::test(true, #C19);
+  self::test(true, #C23);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+}
+static method test(dynamic expected, dynamic actual) → dynamic {
+  core::print("test(${expected}, ${actual})");
+  if(!core::identical(expected, actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
+
+library /*isNonNullableByDefault*/;
+import self as var;
+import "dart:core" as core;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field var::Class::T% field;
+  const constructor •(var::Class::T% field) → var::Class<var::Class::T%>
+    : var::Class::field = field, super core::Object::•()
+    ;
+}
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::Object?, core::Object?) → core::bool c2 = #C24;
+static const field (core::int) → core::int partialInstantiation = #C25;
+static const field var::Class<core::int> instance = #C5;
+static const field var::Class<dynamic> instance2 = #C8;
+static const field core::Type functionTypeLiteral = #C9;
+static const field core::Type genericFunctionTypeLiteral = #C10;
+static const field core::List<core::int> listLiteral = #C11;
+static const field core::List<dynamic> listLiteral2 = #C12;
+static const field core::Set<core::int> setLiteral = #C13;
+static const field core::Set<dynamic> setLiteral2 = #C14;
+static const field core::Map<core::int, core::String> mapLiteral = #C16;
+static const field core::Map<dynamic, dynamic> mapLiteral2 = #C18;
+static const field core::List<core::int> listConcatenation = #C11;
+static const field core::Set<core::int> setConcatenation = #C13;
+static const field core::Map<core::int, core::String> mapConcatenation = #C16;
+static method id1<T extends core::Object? = dynamic>(var::id1::T% t) → var::id1::T%
+  return t;
+static method id2<T extends core::Object? = dynamic>(var::id2::T% t) → var::id2::T%
+  return t;
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Object)
+  #C2 = tearoff var::id1
+  #C3 = partial-instantiation var::id1 <core::int>
+  #C4 = 0
+  #C5 = var::Class<core::int> {field:#C4}
+  #C6 = 42
+  #C7 = <core::int>[#C6]
+  #C8 = var::Class<dynamic> {field:#C7}
+  #C9 = TypeLiteralConstant((dynamic) → dynamic)
+  #C10 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
+  #C11 = <core::int>[#C4]
+  #C12 = <dynamic>[#C7]
+  #C13 = <core::int>{#C4}
+  #C14 = <dynamic>{#C7}
+  #C15 = "foo"
+  #C16 = <core::int, core::String>{#C4:#C15)
+  #C17 = null
+  #C18 = <dynamic, dynamic>{#C7:#C15, #C17:#C7)
+  #C19 = true
+  #C20 = tearoff var::id2
+  #C21 = eval const core::identical(#C3, const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>)
+  #C22 = eval const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>
+  #C23 = eval const core::identical(#C3, const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>)
+  #C24 = tearoff core::identical
+  #C25 = eval const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>
+}
+
+Extra constant evaluation status:
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various_2.dart:15:28 -> PartialInstantiationConstant(id2<int>)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various_2.dart:37:5 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various_2.dart:37:5 -> BoolConstant(false)
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///various_2_lib.dart:20:39 -> PartialInstantiationConstant(id2<int>)
+Extra constant evaluation: tries: 41, successes: 4
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.textual_outline.expect
new file mode 100644
index 0000000..ba7ed46
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.textual_outline.expect
@@ -0,0 +1,50 @@
+import 'various_2_lib.dart' as lib;
+
+typedef F1<T> = T Function(T);
+typedef F2 = T Function<T>(T);
+const objectTypeLiteral = Object;
+const int Function(int) partialInstantiation = lib.id1;
+const instance = const lib.Class<int>(0);
+const instance2 = const lib.Class<dynamic>([42]);
+const functionTypeLiteral = F1;
+const genericFunctionTypeLiteral = F2;
+const listLiteral = <int>[0];
+const listLiteral2 = <dynamic>[
+  <int>[42]
+];
+const setLiteral = <int>{0};
+const setLiteral2 = <dynamic>{
+  <int>[42]
+};
+const mapLiteral = <int, String>{0: 'foo'};
+const mapLiteral2 = <dynamic, dynamic>{
+  <int>[42]: 'foo',
+  null: <int>[42]
+};
+const listConcatenation = <int>[...listLiteral];
+const setConcatenation = <int>{...setLiteral};
+const mapConcatenation = <int, String>{...mapLiteral};
+const objectTypeLiteralIdentical =
+    identical(objectTypeLiteral, lib.objectTypeLiteral);
+const partialInstantiationIdentical =
+    identical(partialInstantiation, lib.partialInstantiation);
+const instanceIdentical = identical(instance, lib.instance);
+const instance2Identical = identical(instance2, lib.instance2);
+const functionTypeLiteralIdentical =
+    identical(functionTypeLiteral, lib.functionTypeLiteral);
+const genericFunctionTypeLiteralIdentical =
+    identical(genericFunctionTypeLiteral, lib.genericFunctionTypeLiteral);
+const listLiteralIdentical = identical(listLiteral, lib.listLiteral);
+const listLiteral2Identical = identical(listLiteral2, lib.listLiteral2);
+const setLiteralIdentical = identical(setLiteral, lib.setLiteral);
+const setLiteral2Identical = identical(setLiteral2, lib.setLiteral2);
+const mapLiteralIdentical = identical(mapLiteral, lib.mapLiteral);
+const mapLiteral2Identical = identical(mapLiteral2, lib.mapLiteral2);
+const listConcatenationIdentical =
+    identical(listConcatenation, lib.listConcatenation);
+const setConcatenationIdentical =
+    identical(setConcatenation, lib.setConcatenation);
+const mapConcatenationIdentical =
+    identical(mapConcatenation, lib.mapConcatenation);
+main() {}
+test(expected, actual) {}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a390688
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.textual_outline_modelled.expect
@@ -0,0 +1,50 @@
+import 'various_2_lib.dart' as lib;
+
+const functionTypeLiteral = F1;
+const functionTypeLiteralIdentical =
+    identical(functionTypeLiteral, lib.functionTypeLiteral);
+const genericFunctionTypeLiteral = F2;
+const genericFunctionTypeLiteralIdentical =
+    identical(genericFunctionTypeLiteral, lib.genericFunctionTypeLiteral);
+const instance = const lib.Class<int>(0);
+const instance2 = const lib.Class<dynamic>([42]);
+const instance2Identical = identical(instance2, lib.instance2);
+const instanceIdentical = identical(instance, lib.instance);
+const int Function(int) partialInstantiation = lib.id1;
+const listConcatenation = <int>[...listLiteral];
+const listConcatenationIdentical =
+    identical(listConcatenation, lib.listConcatenation);
+const listLiteral = <int>[0];
+const listLiteral2 = <dynamic>[
+  <int>[42]
+];
+const listLiteral2Identical = identical(listLiteral2, lib.listLiteral2);
+const listLiteralIdentical = identical(listLiteral, lib.listLiteral);
+const mapConcatenation = <int, String>{...mapLiteral};
+const mapConcatenationIdentical =
+    identical(mapConcatenation, lib.mapConcatenation);
+const mapLiteral = <int, String>{0: 'foo'};
+const mapLiteral2 = <dynamic, dynamic>{
+  <int>[42]: 'foo',
+  null: <int>[42]
+};
+const mapLiteral2Identical = identical(mapLiteral2, lib.mapLiteral2);
+const mapLiteralIdentical = identical(mapLiteral, lib.mapLiteral);
+const objectTypeLiteral = Object;
+const objectTypeLiteralIdentical =
+    identical(objectTypeLiteral, lib.objectTypeLiteral);
+const partialInstantiationIdentical =
+    identical(partialInstantiation, lib.partialInstantiation);
+const setConcatenation = <int>{...setLiteral};
+const setConcatenationIdentical =
+    identical(setConcatenation, lib.setConcatenation);
+const setLiteral = <int>{0};
+const setLiteral2 = <dynamic>{
+  <int>[42]
+};
+const setLiteral2Identical = identical(setLiteral2, lib.setLiteral2);
+const setLiteralIdentical = identical(setLiteral, lib.setLiteral);
+main() {}
+test(expected, actual) {}
+typedef F1<T> = T Function(T);
+typedef F2 = T Function<T>(T);
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2_lib.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2_lib.dart
new file mode 100644
index 0000000..7a06e11
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2_lib.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2020, 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 Class<T> {
+  final T field;
+
+  const Class(this.field);
+}
+
+T id1<T>(T t) => t;
+T id2<T>(T t) => t;
+
+typedef F1<T> = T Function(T);
+typedef F2 = T Function<T>(T);
+
+const objectTypeLiteral = Object;
+const c2 = identical;
+const int Function(int) partialInstantiation =
+    const bool.fromEnvironment("foo") ? id1 : id2;
+const instance = const Class<int>(0);
+const instance2 = const Class<dynamic>([42]);
+const functionTypeLiteral = F1;
+const genericFunctionTypeLiteral = F2;
+const listLiteral = <int>[0];
+const listLiteral2 = <dynamic>[
+  <int>[42]
+];
+const setLiteral = <int>{0};
+const setLiteral2 = <dynamic>{
+  <int>[42]
+};
+const mapLiteral = <int, String>{0: 'foo'};
+const mapLiteral2 = <dynamic, dynamic>{
+  <int>[42]: 'foo',
+  null: <int>[42]
+};
+const listConcatenation = <int>[...listLiteral];
+const setConcatenation = <int>{...setLiteral};
+const mapConcatenation = <int, String>{...mapLiteral};
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_lib.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_lib.dart
new file mode 100644
index 0000000..06d2cb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+const x = 42;
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
index a4cb425..342b8af 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
@@ -100,3 +100,11 @@
 }
 static method oracle() → dynamic
   return true;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:9:26 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:18:26 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:27:29 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:27:33 -> IntConstant(-1)
+Extra constant evaluation: tries: 160, successes: 4
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
index 7c34544..d10ce88 100644
--- a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
@@ -47,3 +47,9 @@
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
   fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:42:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:43:31 -> DoubleConstant(2.5)
+Extra constant evaluation: tries: 58, successes: 2
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
index 1e544ed..58691fd 100644
--- a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
@@ -559,3 +559,30 @@
 
 library;
 import self as self2;
+
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_declarations_part.dart:86:6 -> ListConstant(const <Enum#4*>[const Enum#4{Enum#4.index: 0, Enum#4._name: "Enum.a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations_part.dart:87:3 -> InstanceConstant(const Enum#4{Enum#4.index: 0, Enum#4._name: "Enum.a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_declarations_part.dart:80:6 -> ListConstant(const <Enum#3*>[const Enum#3{Enum#3.index: 0, Enum#3._name: "Enum.a"}, const Enum#3{Enum#3.index: 1, Enum#3._name: "Enum.b"}, const Enum#3{Enum#3.index: 2, Enum#3._name: "Enum.c"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations_part.dart:81:3 -> InstanceConstant(const Enum#3{Enum#3.index: 0, Enum#3._name: "Enum.a"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations_part.dart:82:3 -> InstanceConstant(const Enum#3{Enum#3.index: 1, Enum#3._name: "Enum.b"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations_part.dart:83:3 -> InstanceConstant(const Enum#3{Enum#3.index: 2, Enum#3._name: "Enum.c"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_declarations_part.dart:73:6 -> ListConstant(const <Enum#2*>[const Enum#2{Enum#2.index: 0, Enum#2._name: "Enum.Enum"}, const Enum#2{Enum#2.index: 1, Enum#2._name: "Enum.a"}, const Enum#2{Enum#2.index: 2, Enum#2._name: "Enum.b"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations_part.dart:74:3 -> InstanceConstant(const Enum#2{Enum#2.index: 0, Enum#2._name: "Enum.Enum"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations_part.dart:75:3 -> InstanceConstant(const Enum#2{Enum#2.index: 1, Enum#2._name: "Enum.a"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations_part.dart:77:3 -> InstanceConstant(const Enum#2{Enum#2.index: 2, Enum#2._name: "Enum.b"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_declarations.dart:81:6 -> ListConstant(const <Enum#1*>[const Enum#1{Enum#1.index: 0, Enum#1._name: "Enum.a"}, const Enum#1{Enum#1.index: 1, Enum#1._name: "Enum.b"}, const Enum#1{Enum#1.index: 2, Enum#1._name: "Enum.c"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:82:3 -> InstanceConstant(const Enum#1{Enum#1.index: 0, Enum#1._name: "Enum.a"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:83:3 -> InstanceConstant(const Enum#1{Enum#1.index: 1, Enum#1._name: "Enum.b"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:84:3 -> InstanceConstant(const Enum#1{Enum#1.index: 2, Enum#1._name: "Enum.c"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_declarations.dart:74:6 -> ListConstant(const <Enum*>[const Enum{Enum.index: 0, Enum._name: "Enum.Enum"}, const Enum{Enum.index: 1, Enum._name: "Enum.a"}, const Enum{Enum.index: 2, Enum._name: "Enum.b"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:75:3 -> InstanceConstant(const Enum{Enum.index: 0, Enum._name: "Enum.Enum"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:76:3 -> InstanceConstant(const Enum{Enum.index: 1, Enum._name: "Enum.a"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:78:3 -> InstanceConstant(const Enum{Enum.index: 2, Enum._name: "Enum.b"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_declarations.dart:87:6 -> ListConstant(const <AnotherEnum*>[const AnotherEnum{AnotherEnum.index: 0, AnotherEnum._name: "AnotherEnum.a"}, const AnotherEnum{AnotherEnum.index: 1, AnotherEnum._name: "AnotherEnum.b"}, const AnotherEnum{AnotherEnum.index: 2, AnotherEnum._name: "AnotherEnum.c"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:88:3 -> InstanceConstant(const AnotherEnum{AnotherEnum.index: 0, AnotherEnum._name: "AnotherEnum.a"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:89:3 -> InstanceConstant(const AnotherEnum{AnotherEnum.index: 1, AnotherEnum._name: "AnotherEnum.b"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///duplicated_declarations.dart:90:3 -> InstanceConstant(const AnotherEnum{AnotherEnum.index: 2, AnotherEnum._name: "AnotherEnum.c"})
+Extra constant evaluation: tries: 46, successes: 22
diff --git a/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
index 8dbe328..1d3085a 100644
--- a/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
@@ -10,3 +10,8 @@
 static method main() → dynamic {
   core::print(dev::UserTag*);
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///export_test.dart:14:9 -> TypeLiteralConstant(UserTag*)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index ff7bf3c..c522059 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -93,3 +93,12 @@
   #C1 = null
   #C2 = core::Object {}
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///expressions.dart:21:8 -> StringConstant("foobar")
+Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:70:10 -> TypeLiteralConstant(int*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:71:9 -> TypeLiteralConstant(int*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int*)
+Evaluated: VariableGetImpl @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int*)
+Evaluated: VariableGet @ org-dartlang-testcase:///expressions.dart:72:9 -> TypeLiteralConstant(int*)
+Extra constant evaluation: tries: 138, successes: 6
diff --git a/pkg/front_end/testcases/general/external_import.dart.outline.expect b/pkg/front_end/testcases/general/external_import.dart.outline.expect
index b0af5d4..a83c46c 100644
--- a/pkg/front_end/testcases/general/external_import.dart.outline.expect
+++ b/pkg/front_end/testcases/general/external_import.dart.outline.expect
@@ -7,3 +7,10 @@
 
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ null -> InstanceConstant(const ExternalName{ExternalName.name: "dart-ext:here"})
+Evaluated: ConstructorInvocation @ null -> InstanceConstant(const ExternalName{ExternalName.name: "dart-ext:foo/../there"})
+Evaluated: ConstructorInvocation @ null -> InstanceConstant(const ExternalName{ExternalName.name: "dart-ext:/usr/local/somewhere"})
+Extra constant evaluation: tries: 3, successes: 3
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
index 30a39ac..7e4abd5 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
@@ -28,3 +28,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_sample.dart:13:4 -> InstanceConstant(const Double{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_sample.dart:16:4 -> InstanceConstant(const Double{})
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect b/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect
index 256e84e..bcd0feb 100644
--- a/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/getter_call.dart.strong.transformed.expect
@@ -185,3 +185,23 @@
   #C7 = tearoff self::method7
   #C8 = 0
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:7:45 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:130:10 -> IntConstant(-42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:131:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:133:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:136:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:138:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:141:10 -> IntConstant(-23)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:142:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:143:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:149:10 -> IntConstant(-42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:150:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:152:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:155:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:157:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:160:10 -> IntConstant(-23)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:161:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:162:10 -> IntConstant(-11)
+Extra constant evaluation: tries: 354, successes: 17
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
index f041292..4f4f2ae 100644
--- a/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
@@ -57,3 +57,9 @@
 static method main() → dynamic {
   self::ImplicitScopeTest::testMain();
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:11:18 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:32:49 -> BoolConstant(false)
+Extra constant evaluation: tries: 28, successes: 2
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
index eee2023..0311446 100644
--- a/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
@@ -46,3 +46,8 @@
        ^^^";
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: AsExpression @ org-dartlang-testcase:///invalid_type.dart:12:9 -> NullConstant(null)
+Extra constant evaluation: tries: 3, successes: 1
diff --git a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
index b39c1af..5509ab3 100644
--- a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
@@ -83,3 +83,9 @@
   if(!expected.{core::Object::==}(actual))
     throw "Expected ${expected}, actual ${actual}";
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///issue40662.dart:8:10 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///issue40662.dart:9:10 -> IntConstant(-1)
+Extra constant evaluation: tries: 99, successes: 2
diff --git a/pkg/front_end/testcases/general/issue40744.dart.outline.expect b/pkg/front_end/testcases/general/issue40744.dart.outline.expect
index 373527d..38f3347 100644
--- a/pkg/front_end/testcases/general/issue40744.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue40744.dart.outline.expect
@@ -7,3 +7,8 @@
   ;
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: MapLiteral @ org-dartlang-testcase:///issue40744.dart:5:53 -> InstanceConstant(const _ImmutableMap<String*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>["a", 1]})
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
index 9151654..90269fa 100644
--- a/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
@@ -81,3 +81,8 @@
 }
 static method main() → dynamic {}
 static abstract method PropertyState() → dynamic;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///issue42997.dart:12:24 -> TypeLiteralConstant(Object*)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect b/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
index 28519d4..2db3815 100644
--- a/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
@@ -69,3 +69,7 @@
 constants  {
   #C1 = self::Constant {}
 }
+
+Extra constant evaluation status:
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///magic_const.dart:21:8 -> BoolConstant(false)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect b/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
index 0c6825b..7e99438 100644
--- a/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
@@ -28,3 +28,12 @@
 static const field dynamic a = null;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///metadata_enum.dart:7:2 -> NullConstant(null)
+Evaluated: ListLiteral @ org-dartlang-testcase:///metadata_enum.dart:8:6 -> ListConstant(const <E*>[const E{E.index: 0, E._name: "E.E1"}, const E{E.index: 1, E._name: "E.E2"}, const E{E.index: 2, E._name: "E.E3"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///metadata_enum.dart:8:10 -> InstanceConstant(const E{E.index: 0, E._name: "E.E1"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///metadata_enum.dart:8:14 -> InstanceConstant(const E{E.index: 1, E._name: "E.E2"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///metadata_enum.dart:8:18 -> InstanceConstant(const E{E.index: 2, E._name: "E.E3"})
+Extra constant evaluation: tries: 9, successes: 5
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
index eaf663b..270cae4 100644
--- a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
@@ -39,3 +39,8 @@
 static const field dynamic a = null;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///metadata_named_mixin_application.dart:7:2 -> NullConstant(null)
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect b/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
index 17fdfdc..cc645b3 100644
--- a/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
@@ -4,3 +4,8 @@
 
 static method main() → dynamic
   return core::print(-9223372036854775808.{core::int::unary-}());
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///minimum_int.dart:1:17 -> IntConstant(-9223372036854775808)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
index 7bd99d8..b1f8f15 100644
--- a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
@@ -129,3 +129,12 @@
 var missingPropertySet = emptyClass.property = 42;
                                     ^^^^^^^^";
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:28:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:28:48 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:28:48 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:29:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:29:48 -> IntConstant(2)
+Extra constant evaluation: tries: 37, successes: 5
diff --git a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect
index 33957ce..26ebb28 100644
--- a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.outline.expect
@@ -46,3 +46,11 @@
   constructor unpatched() → self2::SubClass
     ;
 }
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:20 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:14:3 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:16:19 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: tries: 5, successes: 4
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.outline.expect b/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
index 03096a5..664a1ec 100644
--- a/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
+++ b/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
@@ -74,3 +74,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///native_as_name.dart:26:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
index f0a7f09..092472c 100644
--- a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
@@ -53,3 +53,8 @@
 static const field core::int* foo = const core::int::fromEnvironment("fisk");
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///nested_implicit_const_with_env_var.dart:5:23 -> IntConstant(0)
+Extra constant evaluation: tries: 3, successes: 1
diff --git a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect
index 3968a64..9f79d7f 100644
--- a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.outline.expect
@@ -41,3 +41,15 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:6:8 -> SymbolConstant(#_foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:6:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:6:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:6:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:11:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:11:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:11:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///no_such_method_forwarder.dart:11:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 16, successes: 8
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
index 28f8656..320288b 100644
--- a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
@@ -47,3 +47,14 @@
 }
 static method baz(no_::Bar* bar) → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> SymbolConstant(#_x)
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> SymbolConstant(#_x=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///no_such_method_private_setter_lib.dart:8:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 19, successes: 7
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
index 0f69d4e..3710901 100644
--- a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
@@ -365,3 +365,8 @@
   print(foo ~ 2);
             ^");
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///operator_method_not_found.dart:29:18 -> IntConstant(2)
+Extra constant evaluation: tries: 74, successes: 1
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
index 896d6f1d..f15030e 100644
--- a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
@@ -50,3 +50,8 @@
 }
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///override_check_generic_method_f_bounded.dart:15:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
index 5565e30..a24b28f 100644
--- a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
@@ -60,3 +60,9 @@
 
 library;
 import self as self6;
+
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
index a58a056..2face8d 100644
--- a/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
@@ -50,3 +50,11 @@
 }
 static method baz(pri::Bar* bar) → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///private_method_tearoff_lib.dart:8:8 -> SymbolConstant(#_f)
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_method_tearoff_lib.dart:8:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_method_tearoff_lib.dart:8:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///private_method_tearoff_lib.dart:8:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
index 87f83fc..1261412 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
@@ -25,3 +25,8 @@
 static const field core::int* anotherForParameter = 3;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///redirecting_factory_metadata.dart:13:4 -> IntConstant(2)
+Extra constant evaluation: tries: 5, successes: 1
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.outline.expect b/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
index a0a61fb..070a084 100644
--- a/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
@@ -44,3 +44,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///super_nsm.dart:6:3 -> SymbolConstant(#interfaceMethod)
+Evaluated: ListLiteral @ org-dartlang-testcase:///super_nsm.dart:6:3 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///super_nsm.dart:6:3 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///super_nsm.dart:6:3 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 9, successes: 4
diff --git a/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect b/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect
index da86440..5e8e20d 100644
--- a/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_literal_as_metadata.dart.outline.expect
@@ -43,3 +43,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literal_as_metadata.dart:9:2 -> TypeLiteralConstant(A*)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
index 1222789..4149d44 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
@@ -112,3 +112,7 @@
   #C5 = <core::Object*>[#C4]
   #C6 = <core::Object*>[#C1]
 }
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_uses.dart:8:11 -> TypeLiteralConstant(<invalid>)
+Extra constant evaluation: tries: 4, successes: 1
diff --git a/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
index 979f6c8..4be9ba1 100644
--- a/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
@@ -14,3 +14,9 @@
 constants  {
   #C1 = tearoff self::main
 }
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:10:14 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:11:14 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:12:14 -> BoolConstant(false)
+Extra constant evaluation: tries: 6, successes: 3
diff --git a/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect
index 6af752e..a89e08f 100644
--- a/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/void_methods.dart.strong.transformed.expect
@@ -29,3 +29,8 @@
   new self::Foo::•().{self::Foo::[]=}(3, 4);
   new self::Foo::•().{self::Foo::clear}();
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///void_methods.dart:7:24 -> IntConstant(0)
+Extra constant evaluation: tries: 36, successes: 1
diff --git a/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect b/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect
index 693ad97..75bd8af 100644
--- a/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.outline.expect
@@ -53,3 +53,7 @@
   #C2 = "default"
   #C3 = 2.71
 }
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:7:21 -> InstanceConstant(const B{A.d: 2.71, A.s: "default"})
+Extra constant evaluation: tries: 6, successes: 1
diff --git a/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect b/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect
index 663835f..c2f0c15 100644
--- a/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.strong.transformed.expect
@@ -14,3 +14,8 @@
 import "dart:core" as core;
 
 typedef F<unrelated T extends core::Object* = dynamic> = () →* dynamic;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///variance_from_dill.dart:5:9 -> TypeLiteralConstant(dynamic Function(dynamic Function()*)*)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
index e7f6876..f3b14c5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
@@ -84,3 +84,7 @@
   #C1 = self::_FailingTest {}
   #C2 = #foo
 }
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///bug33099.dart:23:42 -> TypeLiteralConstant(MyTest2*)
+Extra constant evaluation: tries: 33, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect
index 4ea32aa..e0df656 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/casts.dart.weak.transformed.expect
@@ -16,3 +16,16 @@
   core::print(1.0 is core::int*);
   core::print(1.0 is core::double*);
 }
+
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:12:12 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:13:12 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:14:12 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:16:11 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:17:11 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:18:11 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:20:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:21:13 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///casts.dart:22:13 -> BoolConstant(true)
+Extra constant evaluation: tries: 21, successes: 9
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect
index 992e106..e6aa634 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_read_type.dart.weak.transformed.expect
@@ -35,3 +35,8 @@
 static field core::int* x = 0;
 static method m(dynamic x) → dynamic
   return null;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///check_deferred_read_type.dart:11:13 -> TypeLiteralConstant(C*)
+Extra constant evaluation: tries: 4, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect
index c425212..3af0af0 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/compound_binary_implicit_as.dart.weak.transformed.expect
@@ -38,3 +38,9 @@
   on dynamic catch(final dynamic _) {
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:18:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///compound_binary_implicit_as.dart:18:9 -> IntConstant(0)
+Extra constant evaluation: tries: 16, successes: 2
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
index a4cb425..006c2cc 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
@@ -100,3 +100,11 @@
 }
 static method oracle() → dynamic
   return true;
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:11:26 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:20:26 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:29:29 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///control_flow_collection.dart:29:33 -> IntConstant(-1)
+Extra constant evaluation: tries: 160, successes: 4
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
index 7c34544..224b225 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
@@ -47,3 +47,9 @@
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
   fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:45:31 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///covariant_generic.dart:46:31 -> DoubleConstant(2.5)
+Extra constant evaluation: tries: 58, successes: 2
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect
index 8dbe328..3ecf074 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/export_test.dart.weak.transformed.expect
@@ -10,3 +10,8 @@
 static method main() → dynamic {
   core::print(dev::UserTag*);
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///export_test.dart:16:9 -> TypeLiteralConstant(UserTag*)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
index 7e9b65e..ce07630 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
@@ -93,3 +93,12 @@
   #C1 = null
   #C2 = core::Object {}
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///expressions.dart:23:8 -> StringConstant("foobar")
+Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:72:10 -> TypeLiteralConstant(int*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:73:9 -> TypeLiteralConstant(int*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///expressions.dart:74:9 -> TypeLiteralConstant(int*)
+Evaluated: VariableGetImpl @ org-dartlang-testcase:///expressions.dart:74:9 -> TypeLiteralConstant(int*)
+Evaluated: VariableGet @ org-dartlang-testcase:///expressions.dart:74:9 -> TypeLiteralConstant(int*)
+Extra constant evaluation: tries: 138, successes: 6
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect
index f041292..5135233 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/implicit_scope_test.dart.weak.transformed.expect
@@ -57,3 +57,9 @@
 static method main() → dynamic {
   self::ImplicitScopeTest::testMain();
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:14:18 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///implicit_scope_test.dart:35:49 -> BoolConstant(false)
+Extra constant evaluation: tries: 28, successes: 2
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
index 383580e..70af76d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
@@ -46,3 +46,8 @@
        ^^^";
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: AsExpression @ org-dartlang-testcase:///invalid_type.dart:14:9 -> NullConstant(null)
+Extra constant evaluation: tries: 3, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect
index ce8e878..ffb08b7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/magic_const.dart.weak.transformed.expect
@@ -69,3 +69,7 @@
 constants  {
   #C1 = self::Constant {}
 }
+
+Extra constant evaluation status:
+Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///magic_const.dart:23:8 -> BoolConstant(false)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect
index d2f6483..6bf610e 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/minimum_int.dart.weak.transformed.expect
@@ -4,3 +4,8 @@
 
 static method main() → dynamic
   return core::print(-9223372036854775808.{core::int::unary-}());
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///minimum_int.dart:1:17 -> IntConstant(-9223372036854775808)
+Extra constant evaluation: tries: 2, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
index 725a362..bc1404b 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
@@ -129,3 +129,12 @@
 var missingPropertySet = emptyClass.property = 42;
                                     ^^^^^^^^";
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:30:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:30:48 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:30:48 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:31:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///missing_toplevel.dart:31:48 -> IntConstant(2)
+Extra constant evaluation: tries: 37, successes: 5
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
index 6717947..4f7e0a0 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
@@ -365,3 +365,8 @@
   print(foo ~ 2);
             ^");
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///operator_method_not_found.dart:31:18 -> IntConstant(2)
+Extra constant evaluation: tries: 74, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect
index 3f3a1f0..1680081 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_uses.dart.weak.transformed.expect
@@ -112,3 +112,7 @@
   #C5 = <core::Object*>[#C4]
   #C6 = <core::Object*>[#C1]
 }
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_uses.dart:10:11 -> TypeLiteralConstant(<invalid>)
+Extra constant evaluation: tries: 4, successes: 1
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect
index 979f6c8..801da4f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/typedef.dart.weak.transformed.expect
@@ -14,3 +14,9 @@
 constants  {
   #C1 = tearoff self::main
 }
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:12:14 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:13:14 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///typedef.dart:14:14 -> BoolConstant(false)
+Extra constant evaluation: tries: 6, successes: 3
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect
index 6af752e..c00d5b7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/void_methods.dart.weak.transformed.expect
@@ -29,3 +29,8 @@
   new self::Foo::•().{self::Foo::[]=}(3, 4);
   new self::Foo::•().{self::Foo::clear}();
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///void_methods.dart:9:24 -> IntConstant(0)
+Extra constant evaluation: tries: 36, successes: 1
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect
index 4321535..c3f99a8 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.strong.transformed.expect
@@ -185,3 +185,23 @@
   #C7 = tearoff self::method7
   #C8 = 0
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:7:45 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:130:10 -> IntConstant(-42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:131:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:133:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:136:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:138:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:141:10 -> IntConstant(-23)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:142:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:143:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:149:10 -> IntConstant(-42)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:150:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:152:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:155:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:157:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:160:10 -> IntConstant(-23)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:161:10 -> IntConstant(-11)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///getter_call.dart:162:10 -> IntConstant(-11)
+Extra constant evaluation: tries: 322, successes: 17
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
index 9af8d7f..7b083ef 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml
@@ -14,8 +14,8 @@
         main() {
           dynamic x;
           print(x >>> 2);
-          Class? c = new Class();
+          Class? c = new Class() as Class?;
           print(c!);
         }
         class Class {}
-    expectedLibraryCount: 1
\ No newline at end of file
+    expectedLibraryCount: 1
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
index a0d1c29..2981516 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
@@ -46,3 +46,7 @@
   #C1 = null
   #C2 = tearoff self::C::_default
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///bug30624.dart:40:35 -> IntConstant(-1)
+Extra constant evaluation: tries: 47, successes: 1
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
index 7008291..9385400 100644
--- a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
@@ -6,3 +6,9 @@
   core::List<core::int*>* foo = <core::int*>[1, 2, 3];
   core::print(let final core::List<core::int*>* #t1 = foo in let final core::int* #t2 = 0 in let final core::int* #t3 = #t1.{core::List::[]}(#t2).{core::num::-}(1) in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3) in #t3);
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///complex_predecrement.dart:10:75 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///complex_predecrement.dart:10:75 -> IntConstant(0)
+Extra constant evaluation: tries: 16, successes: 2
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
index bd2330c..f717ce5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
@@ -52,3 +52,9 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations.dart:13:2 -> InstanceConstant(const Foo{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations.dart:16:2 -> InstanceConstant(const Foo{})
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
index c11d438..c319b9f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
@@ -38,3 +38,10 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:13:4 -> InstanceConstant(const Foo{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:19:4 -> InstanceConstant(const Foo{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:16:4 -> InstanceConstant(const Foo{})
+Extra constant evaluation: tries: 3, successes: 3
diff --git a/pkg/front_end/testcases/inference/future_then.dart.outline.expect b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
index 9f214cc..ec42741 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
index 9f214cc..ac1e337 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_2.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
index 9f214cc..d64ec98 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_3.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
index 9f214cc..4cb8414 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_4.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
index 9f214cc..94fdb61 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_5.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
index 9f214cc..0a04fa8 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_6.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
index 9f214cc..2f91f22 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
index 9f214cc..83b70a3 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_2.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
index 9f214cc..c6dbbe3 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_3.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
index 9f214cc..980c668 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_4.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
index 9f214cc..c2895c0 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_5.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
index 9f214cc..19d530b 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_conditional_6.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
index 9f214cc..3d435d2 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_ifNull.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
index 52a1a8c..dfeda7b 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method foo() → self::MyFuture<dynamic>*
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
index 52a1a8c..0a65e79 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
@@ -36,3 +36,20 @@
   ;
 static method foo() → self::MyFuture<dynamic>*
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_2.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
index 5e50ec9..8b87fb7 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
@@ -38,3 +38,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_then_upwards_3.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
index fc9743f..5cc3d38 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
@@ -40,3 +40,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
index fc9743f..81ac385 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
@@ -40,3 +40,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_async_conditional_2.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
index 68e6a5c..b9cf624 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
@@ -41,3 +41,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
index 68e6a5c..9b8efa6 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
@@ -41,3 +41,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_2.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
index be78378..b1257cb 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
@@ -41,3 +41,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_3.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
index be78378..4c1cf46 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
@@ -41,3 +41,20 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///future_union_downwards_4.dart:10:7 -> SymbolConstant(#onTimeout)
+Extra constant evaluation: tries: 46, successes: 13
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
index 258cc6e..c7dfb50 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
@@ -125,3 +125,34 @@
   #C1 = tearoff math::max
   #C2 = tearoff math::min
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:16:16 -> PartialInstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:17:16 -> PartialInstantiationConstant(max<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:18:16 -> PartialInstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:19:16 -> PartialInstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:20:16 -> PartialInstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:21:16 -> PartialInstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:22:16 -> PartialInstantiationConstant(max<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:23:16 -> PartialInstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:24:16 -> PartialInstantiationConstant(max<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:26:70 -> PartialInstantiationConstant(max<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:28:73 -> PartialInstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:30:73 -> PartialInstantiationConstant(max<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:31:70 -> PartialInstantiationConstant(max<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:32:70 -> PartialInstantiationConstant(max<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:35:11 -> PartialInstantiationConstant(min<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:36:11 -> PartialInstantiationConstant(min<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:37:11 -> PartialInstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:38:11 -> PartialInstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:39:11 -> PartialInstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:40:11 -> PartialInstantiationConstant(min<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:41:11 -> PartialInstantiationConstant(min<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:42:11 -> PartialInstantiationConstant(min<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:43:11 -> PartialInstantiationConstant(min<double*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:45:65 -> PartialInstantiationConstant(min<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:46:72 -> PartialInstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:47:72 -> PartialInstantiationConstant(min<num*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:48:65 -> PartialInstantiationConstant(min<Object*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_infer_generic_instantiation.dart:49:65 -> PartialInstantiationConstant(min<Object*>)
+Extra constant evaluation: tries: 133, successes: 28
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
index 76dfdff..369ced0 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
@@ -46,3 +46,8 @@
 constants  {
   #C1 = tearoff math::max
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_nested_generic_instantiation.dart:28:71 -> PartialInstantiationConstant(max<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///generic_methods_nested_generic_instantiation.dart:29:67 -> PartialInstantiationConstant(max<int*>)
+Extra constant evaluation: tries: 16, successes: 2
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
index ce38bb7..34352bf 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
@@ -28,3 +28,19 @@
   self::a_lessEqual;
   self::a_modulo;
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:8:38 -> BoolConstant(false)
+Evaluated: Not @ org-dartlang-testcase:///infer_binary_double_double.dart:9:41 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:10:38 -> DoubleConstant(3.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:11:43 -> DoubleConstant(-1.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:12:43 -> DoubleConstant(2.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:13:42 -> DoubleConstant(0.5)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:14:48 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:15:39 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:16:36 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:17:45 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:18:42 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_double.dart:19:41 -> DoubleConstant(1.0)
+Extra constant evaluation: tries: 24, successes: 12
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
index 4fb5e69..efbfc78 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
@@ -28,3 +28,19 @@
   self::a_lessEqual;
   self::a_modulo;
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:8:38 -> BoolConstant(false)
+Evaluated: Not @ org-dartlang-testcase:///infer_binary_double_int.dart:9:41 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:10:38 -> DoubleConstant(3.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:11:43 -> DoubleConstant(-1.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:12:43 -> DoubleConstant(2.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:13:42 -> DoubleConstant(0.5)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:14:48 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:15:39 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:16:36 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:17:45 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:18:42 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_double_int.dart:19:41 -> DoubleConstant(1.0)
+Extra constant evaluation: tries: 24, successes: 12
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
index 29ba83c..f75e4f5 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
@@ -28,3 +28,19 @@
   self::a_lessEqual;
   self::a_modulo;
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:8:36 -> BoolConstant(false)
+Evaluated: Not @ org-dartlang-testcase:///infer_binary_int_double.dart:9:39 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:10:33 -> DoubleConstant(3.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:11:38 -> DoubleConstant(-1.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:12:38 -> DoubleConstant(2.0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:13:37 -> DoubleConstant(0.5)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:14:43 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:15:37 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:16:34 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:17:43 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:18:40 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_double.dart:19:36 -> DoubleConstant(1.0)
+Extra constant evaluation: tries: 24, successes: 12
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
index bee4a3d..b8f9738 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
@@ -38,3 +38,24 @@
   self::a_lessEqual;
   self::a_modulo;
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:8:36 -> BoolConstant(false)
+Evaluated: Not @ org-dartlang-testcase:///infer_binary_int_int.dart:9:39 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:10:36 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:11:36 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:12:35 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:13:44 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:14:43 -> IntConstant(4)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:15:33 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:16:38 -> IntConstant(-1)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:17:38 -> IntConstant(2)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:18:37 -> DoubleConstant(0.5)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:19:43 -> IntConstant(0)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:20:37 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:21:34 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:22:43 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:23:40 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_binary_int_int.dart:24:36 -> IntConstant(1)
+Extra constant evaluation: tries: 34, successes: 17
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
index d539e95..63741d8 100644
--- a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
@@ -8,3 +8,9 @@
   self::a;
   self::b;
 }
+
+
+Extra constant evaluation status:
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///infer_conditional.dart:8:35 -> DoubleConstant(2.0)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///infer_conditional.dart:9:35 -> IntConstant(2)
+Extra constant evaluation: tries: 4, successes: 2
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
index d58d84f..d35e13b 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
@@ -33,3 +33,11 @@
 static const field core::int* b1 = 2;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2.dart:10:12 -> IntConstant(2)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2.dart:11:12 -> IntConstant(2)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2_a.dart:10:12 -> IntConstant(2)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2_a.dart:11:12 -> IntConstant(2)
+Extra constant evaluation: tries: 4, successes: 4
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
index cb88599..8355e57 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
@@ -33,3 +33,11 @@
 static const field core::int* b1 = 2;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2_a.dart:10:12 -> IntConstant(2)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2_a.dart:11:12 -> IntConstant(2)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2.dart:10:12 -> IntConstant(2)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_consts_transitively_2.dart:11:12 -> IntConstant(2)
+Extra constant evaluation: tries: 4, successes: 4
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 6d4396b..f97ff69 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -185,3 +185,8 @@
 constants  {
   #C1 = <dynamic>[]
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_from_complex_expressions_if_outer_most_value_is_precise.dart:27:25 -> IntConstant(5)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_from_complex_expressions_if_outer_most_value_is_precise.dart:30:32 -> IntConstant(-3)
+Extra constant evaluation: tries: 74, successes: 2
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
index 4d5f369..a232a1b 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
@@ -10,3 +10,10 @@
   self::a_complement;
   self::a_negate;
 }
+
+
+Extra constant evaluation status:
+Evaluated: Not @ org-dartlang-testcase:///infer_prefix_expression.dart:8:13 -> BoolConstant(false)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_prefix_expression.dart:9:38 -> IntConstant(-2)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///infer_prefix_expression.dart:10:39 -> IntConstant(-1)
+Extra constant evaluation: tries: 6, successes: 3
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
index af46292..5180a33 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
@@ -40,3 +40,12 @@
 static const field core::int* a2 = 4;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:12:12 -> IntConstant(1)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:13:12 -> IntConstant(3)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:14:14 -> IntConstant(4)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:15:14 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///infer_statics_transitively3.dart:16:16 -> NullConstant(null)
+Extra constant evaluation: tries: 5, successes: 5
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
index 7ca1ec1..457bfee 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
@@ -25,3 +25,9 @@
 static final field self::E* x;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///inferred_type_is_enum.dart:8:6 -> ListConstant(const <E*>[const E{E.index: 0, E._name: "E.v1"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inferred_type_is_enum.dart:8:10 -> InstanceConstant(const E{E.index: 0, E._name: "E.v1"})
+Extra constant evaluation: tries: 6, successes: 2
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
index 48cce61..ed56360 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
@@ -25,3 +25,9 @@
 static final field core::List<self::E*>* x;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///inferred_type_is_enum_values.dart:8:6 -> ListConstant(const <E*>[const E{E.index: 0, E._name: "E.v1"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inferred_type_is_enum_values.dart:8:10 -> InstanceConstant(const E{E.index: 0, E._name: "E.v1"})
+Extra constant evaluation: tries: 6, successes: 2
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
index d6804b7..c809710 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
@@ -47,3 +47,8 @@
   #C1 = tearoff self::f
   #C2 = tearoff self::C::g
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///instantiate_tearoff.dart:25:10 -> PartialInstantiationConstant(f<int*>)
+Evaluated: Instantiation @ org-dartlang-testcase:///instantiate_tearoff.dart:27:12 -> PartialInstantiationConstant(C.g<int*>)
+Extra constant evaluation: tries: 18, successes: 2
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
index 0ab95b6..a23d9ae 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
@@ -28,3 +28,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///override_equals.dart:9:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
index e08b136..84f9764 100644
--- a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
@@ -5,3 +5,8 @@
 typedef F = () →* void;
 static final field core::Type* x = () →* void;
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///reference_to_typedef.dart:9:11 -> TypeLiteralConstant(void Function()*)
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
index 0327fcf..bb135a1 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
@@ -21,3 +21,8 @@
 static const field (core::String*) →* core::int* v = self::C::f;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///static_method_tear_off.dart:8:13 -> TearOffConstant(C.f)
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
index 9bd9561..4565d72 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
@@ -123,3 +123,19 @@
   self::A* x = let final self::G* #t17 = g in let final core::int* #t18 = 0 in let final self::A* #t19 = #t17.{self::G::[]}(#t18) in let final void #t20 = #t17.{self::G::[]=}(#t18, #t19.{self::A::+}(1)) in #t19;
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:36:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:36:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:37:64 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:37:64 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:43:59 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:43:59 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:45:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:45:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:49:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:49:41 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:51:45 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///indexed_assign_combiner.dart:51:45 -> IntConstant(0)
+Extra constant evaluation: tries: 78, successes: 12
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
index 7d38c0b..d866bd3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
@@ -5,3 +5,10 @@
 static field core::List<core::double*>* a = <core::double*>[];
 static field core::double* b = let final core::List<core::double*>* #t1 = self::a in let final core::int* #t2 = 0 in let final core::double* #t3 = 1.0 in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3) in #t3;
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_assign_to_index.dart:9:34 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_assign_to_index.dart:9:39 -> DoubleConstant(1.0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_assign_to_index.dart:9:39 -> DoubleConstant(1.0)
+Extra constant evaluation: tries: 11, successes: 3
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
index b69e0ea..7c2c33b 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -95,13 +95,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -141,13 +141,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -161,7 +161,7 @@
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
   #local4#set.call(0);
-  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 };
@@ -196,13 +196,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -242,13 +242,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -262,7 +262,7 @@
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
   #local4#set.call(0);
-  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 }
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
index b69e0ea..7c2c33b 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -95,13 +95,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -141,13 +141,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -161,7 +161,7 @@
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
   #local4#set.call(0);
-  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 };
@@ -196,13 +196,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -242,13 +242,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -262,7 +262,7 @@
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
   #local4#set.call(0);
-  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 }
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
index a1f4e93..fcbfeb4 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -101,13 +101,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -153,13 +153,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -176,7 +176,7 @@
       return local4 = #t13;
     }
   #local4#set.call(0);
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 };
@@ -217,13 +217,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -269,13 +269,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -292,7 +292,7 @@
       return local4 = #t27;
     }
   #local4#set.call(0);
-  let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 }
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
index a1f4e93..fcbfeb4 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -101,13 +101,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -153,13 +153,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
@@ -176,7 +176,7 @@
       return local4 = #t13;
     }
   #local4#set.call(0);
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 };
@@ -217,13 +217,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -269,13 +269,13 @@
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
-  let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in #local2#set.call(value);
-  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in #local4#set.call(0);
-  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 }
@@ -292,7 +292,7 @@
       return local4 = #t27;
     }
   #local4#set.call(0);
-  let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
 }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
index e653691..b528c5d 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
@@ -101,3 +101,10 @@
   return let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out_lib.dart:7:30: Error: A value of type 'Null' can't be returned from a function with return type 'int'.
 int computeInitialValue() => null;
                              ^" in let core::Null? #t23 = null in #t23.==(null) ?{core::int} #t23 as{TypeError,ForNonNullableByDefault} core::int : #t23{core::int};
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart:7:30 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart:7:30 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart:7:30 -> NullConstant(null)
+Extra constant evaluation: tries: 185, successes: 3
diff --git a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect
index 2996b94..94538ef 100644
--- a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.outline.expect
@@ -23,3 +23,8 @@
   get /* from org-dartlang-testcase:///patch_lib.dart */ foo() → core::int;
   set /* from org-dartlang-testcase:///patch_lib.dart */ foo(core::int #t1) → void;
 }
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
index de879f1..e4dd765 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.outline.expect
@@ -32,3 +32,14 @@
   synthetic constructor •() → iss::B
     ;
 }
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> SymbolConstant(#_#A#x)
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> SymbolConstant(#_#A#x=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///issue41436c_lib.dart:6:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 19, successes: 7
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect
index 4b649e0..52cdbab 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.outline.expect
@@ -113,3 +113,41 @@
 static get Extension|finalExtensionStaticFieldWithInitializer() → core::int;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:19:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:19:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:22:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:22:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:25:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:28:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:28:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:31:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:31:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:34:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:34:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:37:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:42:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:42:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:45:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:45:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:48:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:51:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:51:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:54:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:54:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:57:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:57:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:60:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:9:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:9:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:12:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:12:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:15:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:65:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:65:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:68:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:68:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_annotations.dart:71:4 -> InstanceConstant(const Annotation{})
+Extra constant evaluation: tries: 34, successes: 34
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
index 44d325d..8bde560 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
@@ -170,3 +170,12 @@
 constants  {
   #C1 = self::Annotation {}
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:26:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:38:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:49:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:61:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:16:16 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_annotations.dart:72:25 -> IntConstant(0)
+Extra constant evaluation: tries: 268, successes: 6
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart
index 559ee5e..494d850 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart
@@ -6,7 +6,12 @@
   late final int? lateLocal;
 
   throws(() => lateLocal, 'Read value from uninitialized lateLocal');
-  expect(123, lateLocal = 123);
+  // This `if` test prevents flow analysis from realizing that we
+  // unconditionally write to `lateLocal`, so that we can write to it again
+  // later without a static error.
+  if (1 == 1) {
+    expect(123, lateLocal = 123);
+  }
   expect(123, lateLocal);
   throws(() => lateLocal = 124, 'Write value to initialized lateLocal');
 
@@ -15,7 +20,12 @@
 
     throws(() => lateGenericLocal,
         'Read value from uninitialized lateGenericLocal');
-    expect(value, lateGenericLocal = value);
+    // This `if` test prevents flow analysis from realizing that we
+    // unconditionally write to `lateLocal`, so that we can write to it again
+    // later without a static error.
+    if (1 == 1) {
+      expect(value, lateGenericLocal = value);
+    }
     expect(value, lateGenericLocal);
     throws(() => lateGenericLocal = value,
         'Write value to initialized lateGenericLocal');
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
index 3d8ddf1..b04eb47 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
@@ -16,7 +16,9 @@
       return lateLocal = #t1;
     }
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
-  self::expect(123, #lateLocal#set.call(123));
+  if(1.{core::num::==}(1)) {
+    self::expect(123, #lateLocal#set.call(123));
+  }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
   function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
@@ -32,7 +34,9 @@
         return lateGenericLocal = #t2;
       }
     self::throws(() → T? => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
+    if(1.{core::num::==}(1)) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+    }
     self::expect(value, #lateGenericLocal#get.call());
     self::throws(() → T? => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
index 3d8ddf1..3306393 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
@@ -16,7 +16,9 @@
       return lateLocal = #t1;
     }
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
-  self::expect(123, #lateLocal#set.call(123));
+  if(1.{core::num::==}(1)) {
+    self::expect(123, #lateLocal#set.call(123));
+  }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
   function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
@@ -32,7 +34,9 @@
         return lateGenericLocal = #t2;
       }
     self::throws(() → T? => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
+    if(1.{core::num::==}(1)) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+    }
     self::expect(value, #lateGenericLocal#get.call());
     self::throws(() → T? => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
@@ -56,3 +60,9 @@
   }
   throw "${message}: ${value}";
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:12:9 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:26:11 -> BoolConstant(true)
+Extra constant evaluation: tries: 81, successes: 2
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
index 3d8ddf1..b04eb47 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
@@ -16,7 +16,9 @@
       return lateLocal = #t1;
     }
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
-  self::expect(123, #lateLocal#set.call(123));
+  if(1.{core::num::==}(1)) {
+    self::expect(123, #lateLocal#set.call(123));
+  }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
   function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
@@ -32,7 +34,9 @@
         return lateGenericLocal = #t2;
       }
     self::throws(() → T? => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
+    if(1.{core::num::==}(1)) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+    }
     self::expect(value, #lateGenericLocal#get.call());
     self::throws(() → T? => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
index 3d8ddf1..3306393 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
@@ -16,7 +16,9 @@
       return lateLocal = #t1;
     }
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
-  self::expect(123, #lateLocal#set.call(123));
+  if(1.{core::num::==}(1)) {
+    self::expect(123, #lateLocal#set.call(123));
+  }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
   function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
@@ -32,7 +34,9 @@
         return lateGenericLocal = #t2;
       }
     self::throws(() → T? => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
+    if(1.{core::num::==}(1)) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+    }
     self::expect(value, #lateGenericLocal#get.call());
     self::throws(() → T? => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
@@ -56,3 +60,9 @@
   }
   throw "${message}: ${value}";
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:12:9 -> BoolConstant(true)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///late_final_nullable_local_without_initializer.dart:26:11 -> BoolConstant(true)
+Extra constant evaluation: tries: 81, successes: 2
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.outline.expect b/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
index a6cb6f6..871c4c8 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
@@ -53,3 +53,8 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///later.dart:46:18 -> IntConstant(42)
+Extra constant evaluation: tries: 17, successes: 1
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
index 1129833..ddeb453 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
@@ -268,3 +268,7 @@
 constants  {
   #C1 = tearoff self::fisk
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///later.dart:46:18 -> IntConstant(42)
+Extra constant evaluation: tries: 216, successes: 1
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
index 33bd143..27673f7 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
@@ -215,3 +215,28 @@
   }
   throw "Missing exception";
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:10:19 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:10:19 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:10:19 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:14:21 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:14:21 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:14:21 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:16:28 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:16:28 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:16:28 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:17:33 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:17:33 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:17:33 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:19:23 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:19:23 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:19:23 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:33:46 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:33:46 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:33:46 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:36:16 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:36:16 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///non_nullable_from_opt_out.dart:36:16 -> NullConstant(null)
+Extra constant evaluation: tries: 291, successes: 21
diff --git a/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
index 8e2fcee..98d7c8d 100644
--- a/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
@@ -119,3 +119,8 @@
   }
   throw "${message}: ${value}";
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///override.dart:16:18 -> IntConstant(0)
+Extra constant evaluation: tries: 232, successes: 1
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
index 6e5f0ef..886c804 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
@@ -87,3 +87,8 @@
   }
   throw "${message}: ${value}";
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///override_getter_setter.dart:18:18 -> IntConstant(2)
+Extra constant evaluation: tries: 119, successes: 1
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
index 2bd9072..41b22c9 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
@@ -46,3 +46,9 @@
 static get nonNullableFinalTopLevelFieldWithInitializer() → core::int
   return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t15{core::int};
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:11:17 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:12:16 -> IntConstant(0)
+Extra constant evaluation: tries: 98, successes: 2
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
index 2bd9072..41b22c9 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
@@ -46,3 +46,9 @@
 static get nonNullableFinalTopLevelFieldWithInitializer() → core::int
   return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t15{core::int};
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:11:17 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_fields.dart:12:16 -> IntConstant(0)
+Extra constant evaluation: tries: 98, successes: 2
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
index dd6eff2..fb310aa 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
@@ -25,3 +25,8 @@
   new self::A::•(foo);
   new self::A::•(5.{core::num::+}(foo));
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///simple.dart:15:7 -> IntConstant(10)
+Extra constant evaluation: tries: 9, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect
index dc7afba..a0aea49 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.outline.expect
@@ -18,3 +18,11 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
+
+
+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: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:17:29 -> NullConstant(null)
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
index e959da7..d4cc82b 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
@@ -49,3 +49,32 @@
   ;
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:9:17 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:10:17 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:11:17 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:12:17 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:13:17 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:14:17 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:15:17 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:16:17 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:17:17 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:18:17 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:19:18 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:20:18 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:21:18 -> BoolConstant(true)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:22:18 -> InstanceConstant(const Class<int>{Class.field: false})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:23:18 -> InstanceConstant(const Class<int?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:24:18 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:25:18 -> InstanceConstant(const Class<int>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:26:18 -> InstanceConstant(const Class<int?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:27:18 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:28:18 -> InstanceConstant(const Class<int>{Class.field: false})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:29:18 -> InstanceConstant(const Class<int?>{Class.field: false})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:30:18 -> InstanceConstant(const Class<Null?>{Class.field: false})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:31:19 -> InstanceConstant(const Class<int>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:32:19 -> InstanceConstant(const Class<int?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:33:19 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Extra constant evaluation: tries: 33, successes: 25
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
index 38d97af..ed5849f 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
@@ -91,3 +91,20 @@
   #C8 = self::Class<core::int?> {field:#C3}
   #C9 = self::Class<core::Null?> {field:#C3}
 }
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:45:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:46:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:47:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:48:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:49:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:50:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:51:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:52:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:53:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:54:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:55:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:56:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:57:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:7:40 -> BoolConstant(false)
+Extra constant evaluation: tries: 102, successes: 14
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
index 1c2af1f..de05935 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
@@ -89,3 +89,20 @@
   #C6 = self::Class<core::int*> {field:#C2}
   #C7 = self::Class<core::Null?> {field:#C3}
 }
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:45:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:46:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:47:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:48:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:49:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:50:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:51:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:52:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:53:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:54:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:55:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:56:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:57:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:7:40 -> BoolConstant(true)
+Extra constant evaluation: tries: 102, successes: 14
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
index ec25785..e3c22f4 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
@@ -60,3 +60,41 @@
 static const field core::Map<core::int, core::String> mapConcatenation = con::mapLiteral;
 static method id<T extends core::Object? = dynamic>(con::id::T% t) → con::id::T%
   ;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///constants.dart:10:27 -> TypeLiteralConstant(Object)
+Evaluated: Instantiation @ org-dartlang-testcase:///constants.dart:11:52 -> PartialInstantiationConstant(id<int>)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constants.dart:12:24 -> InstanceConstant(const Class<int>{Class.field: 0})
+Evaluated: TypeLiteral @ org-dartlang-testcase:///constants.dart:13:29 -> TypeLiteralConstant(dynamic Function(dynamic))
+Evaluated: TypeLiteral @ org-dartlang-testcase:///constants.dart:14:36 -> TypeLiteralConstant(T% Function<T>(T%))
+Evaluated: ListLiteral @ org-dartlang-testcase:///constants.dart:15:26 -> ListConstant(const <int>[0])
+Evaluated: SetLiteral @ org-dartlang-testcase:///constants.dart:16:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: MapLiteral @ org-dartlang-testcase:///constants.dart:17:33 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
+Evaluated: ListConcatenation @ org-dartlang-testcase:///constants.dart:18:32 -> ListConstant(const <int>[0])
+Evaluated: SetConcatenation @ org-dartlang-testcase:///constants.dart:19:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: MapConcatenation @ org-dartlang-testcase:///constants.dart:20:7 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:23:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:25:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:26:27 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:28:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:30:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:31:30 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:32:29 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:33:29 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:35:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:37:5 -> BoolConstant(true)
+Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:39:5 -> BoolConstant(true)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///constants_lib.dart:16:27 -> TypeLiteralConstant(Object)
+Evaluated: StaticGet @ org-dartlang-testcase:///constants_lib.dart:17:12 -> TearOffConstant(identical)
+Evaluated: Instantiation @ org-dartlang-testcase:///constants_lib.dart:18:48 -> PartialInstantiationConstant(id<int>)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constants_lib.dart:19:24 -> InstanceConstant(const Class<int>{Class.field: 0})
+Evaluated: TypeLiteral @ org-dartlang-testcase:///constants_lib.dart:20:29 -> TypeLiteralConstant(dynamic Function(dynamic))
+Evaluated: TypeLiteral @ org-dartlang-testcase:///constants_lib.dart:21:36 -> TypeLiteralConstant(T% Function<T>(T%))
+Evaluated: ListLiteral @ org-dartlang-testcase:///constants_lib.dart:22:26 -> ListConstant(const <int>[0])
+Evaluated: SetLiteral @ org-dartlang-testcase:///constants_lib.dart:23:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: MapLiteral @ org-dartlang-testcase:///constants_lib.dart:24:33 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
+Evaluated: ListConcatenation @ org-dartlang-testcase:///constants_lib.dart:25:32 -> ListConstant(const <int>[0])
+Evaluated: SetConcatenation @ org-dartlang-testcase:///constants_lib.dart:26:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: MapConcatenation @ org-dartlang-testcase:///constants_lib.dart:27:7 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
+Extra constant evaluation: tries: 35, successes: 34
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
index fefe271f..31532b7 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -70,13 +70,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
@@ -92,20 +92,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
 static field () → core::Null? fieldCompound = () → core::Null? {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 };
@@ -116,13 +116,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
@@ -138,20 +138,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
 static method methodCompound() → dynamic {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 }
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
index fefe271f..31532b7 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -70,13 +70,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
@@ -92,20 +92,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
 static field () → core::Null? fieldCompound = () → core::Null? {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 };
@@ -116,13 +116,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
@@ -138,20 +138,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
 static method methodCompound() → dynamic {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 }
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
index fefe271f..31532b7 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -70,13 +70,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
@@ -92,20 +92,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
 static field () → core::Null? fieldCompound = () → core::Null? {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 };
@@ -116,13 +116,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
@@ -138,20 +138,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
 static method methodCompound() → dynamic {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 }
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
index fefe271f..31532b7 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
 //   local2 = value; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
 //   local6 = 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
 //   local4 += 0; // error
 //   ^^^^^^
 //
@@ -70,13 +70,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
@@ -92,20 +92,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
 static field () → core::Null? fieldCompound = () → core::Null? {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 };
@@ -116,13 +116,13 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
@@ -138,20 +138,20 @@
   local2 = value;
   local4 = 0;
   local6 = 0;
-  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
   local2 = value; // error
   ^^^^^^" in local2 = value;
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
   local4 = 0; // error
   ^^^^^^" in local4 = 0;
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 }
 static method methodCompound() → dynamic {
   late final core::int local4;
   local4 = 0;
-  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
   ^^^^^^" in local4 = local4.{core::num::+}(0);
 }
diff --git a/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect b/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect
index 85c4e95..eb118e8 100644
--- a/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.outline.expect
@@ -16,3 +16,9 @@
   ;
 static method test() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///dynamic_object_call.dart:6:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///dynamic_object_call.dart:9:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
index 3a6dda73..2486d51 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
@@ -118,3 +118,32 @@
 external static get Extension|untypedFinalExtensionStaticField() → dynamic;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:21:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:21:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:24:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:27:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:27:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:30:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:30:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:33:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:48:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:48:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:51:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:54:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:54:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:57:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:57:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:60:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:10:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:10:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:13:2 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:75:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:75:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:78:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:81:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:81:4 -> InstanceConstant(const Annotation{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_fields.dart:84:4 -> InstanceConstant(const Annotation{})
+Extra constant evaluation: tries: 25, successes: 25
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
index decf707..38f9bc7 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
@@ -24,3 +24,11 @@
   #C1 = <core::int>[]
   #C2 = <core::int?>[]
 }
+
+Extra constant evaluation status:
+Evaluated: StaticInvocation @ org-dartlang-testcase:///from_agnostic.dart:7:12 -> BoolConstant(false)
+Evaluated: MapLiteral @ org-dartlang-testcase:///from_agnostic.dart:8:12 -> InstanceConstant(const _ImmutableMap<List<int?>, int>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], 0, const <int?>[], 1]})
+Evaluated: SetLiteral @ org-dartlang-testcase:///from_agnostic.dart:9:12 -> InstanceConstant(const _UnmodifiableSet<List<int?>>{_UnmodifiableSet._map: const _ImmutableMap<List<int?>, Null?>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], null, const <int?>[], null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:10:12 -> ListConstant(const <int>[])
+Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:11:12 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 5, successes: 5
diff --git a/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect
index ac0794c..9b4d8c9 100644
--- a/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_if_null.dart.strong.transformed.expect
@@ -67,3 +67,21 @@
   core::String? s2 = let final self::A7? #t22 = a in #t22.{core::Object::==}(null) ?{core::String?} null : let final core::String? #t23 = #t22.{self::A7::bar} in #t23.{core::String::==}(null) ?{core::String} #t22.{self::A7::bar} = "bar" : #t23{core::String};
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:27 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:27 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:17 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:17 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:24 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:24 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:15 -> DoubleConstant(3.14)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:21 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:15 -> DoubleConstant(3.14)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:21 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
+Extra constant evaluation: tries: 112, successes: 14
diff --git a/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect
index ac0794c..9b4d8c9 100644
--- a/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.transformed.expect
@@ -67,3 +67,21 @@
   core::String? s2 = let final self::A7? #t22 = a in #t22.{core::Object::==}(null) ?{core::String?} null : let final core::String? #t23 = #t22.{self::A7::bar} in #t23.{core::String::==}(null) ?{core::String} #t22.{self::A7::bar} = "bar" : #t23{core::String};
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:27 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:49:27 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:17 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:17 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:24 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:38:24 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:15 -> DoubleConstant(3.14)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:21 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:15 -> DoubleConstant(3.14)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:21 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
+Evaluated: VariableGet @ org-dartlang-testcase:///infer_if_null.dart:60:28 -> StringConstant("bar")
+Extra constant evaluation: tries: 112, successes: 14
diff --git a/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect
index ca304c6..c810721 100644
--- a/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.outline.expect
@@ -21,3 +21,8 @@
   constructor baz(core::int foo) → self2::Class
     ;
 }
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
index d6311c9..7daa8f5 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -130,3 +130,9 @@
   #C2 = 1
   #C3 = ""
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:15 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
+Extra constant evaluation: tries: 55, successes: 3
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
index d6311c9..7daa8f5 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -130,3 +130,9 @@
   #C2 = 1
   #C3 = ""
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:15 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41102.dart:37:20 -> IntConstant(0)
+Extra constant evaluation: tries: 55, successes: 3
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart b/pkg/front_end/testcases/nnbd/issue41114.dart
index 7db889f..3929126 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() async {
-  List<String>? a = <String>[];
+  List<String>? a = <String>[] as List<String>?;
   Iterable<String>? b = a?.map((e) => e);
   Iterable<String>? i = b ?? a;
   print(i);
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect
index 4b2167b..6fb76f5 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic async {
-  core::List<core::String>? a = <core::String>[];
+  core::List<core::String>? a = <core::String>[] as{ForNonNullableByDefault} core::List<core::String>?;
   core::Iterable<core::String>? b = let final core::List<core::String>? #t1 = a in #t1.{core::List::==}(null) ?{core::Iterable<core::String>?} null : #t1{core::List<core::String>}.{core::Iterable::map}<core::String>((core::String e) → core::String => e);
   core::Iterable<core::String>? i = let final core::Iterable<core::String>? #t2 = b in #t2.{core::Object::==}(null) ?{core::Iterable<core::String>?} a : #t2{core::Iterable<core::String>};
   core::print(i);
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect
index 4b2167b..6fb76f5 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic async {
-  core::List<core::String>? a = <core::String>[];
+  core::List<core::String>? a = <core::String>[] as{ForNonNullableByDefault} core::List<core::String>?;
   core::Iterable<core::String>? b = let final core::List<core::String>? #t1 = a in #t1.{core::List::==}(null) ?{core::Iterable<core::String>?} null : #t1{core::List<core::String>}.{core::Iterable::map}<core::String>((core::String e) → core::String => e);
   core::Iterable<core::String>? i = let final core::Iterable<core::String>? #t2 = b in #t2.{core::Object::==}(null) ?{core::Iterable<core::String>?} a : #t2{core::Iterable<core::String>};
   core::print(i);
diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
index eff260bc..14f079a 100644
--- a/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
@@ -29,3 +29,8 @@
 static method main() → dynamic {
   self::test(null);
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///issue41273.dart:16:21 -> TypeLiteralConstant(Object)
+Extra constant evaluation: tries: 49, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
index 8c49c0f..c59851f 100644
--- a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
@@ -30,3 +30,8 @@
 static method main() → dynamic {
   self::test(null);
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///issue41273.dart:16:21 -> TypeLiteralConstant(Object)
+Extra constant evaluation: tries: 175, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart b/pkg/front_end/testcases/nnbd/issue41495.dart
index ceaf89a..cca6995 100644
--- a/pkg/front_end/testcases/nnbd/issue41495.dart
+++ b/pkg/front_end/testcases/nnbd/issue41495.dart
@@ -10,7 +10,7 @@
 main() {}
 
 errors() {
-  A? a1 = new A();
+  A? a1 = new A() as A?;
   a1.c1;
   a1.test;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect
index ecc36781..4df1b52 100644
--- a/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41495.dart.strong.expect
@@ -27,7 +27,7 @@
 }
 static method main() → dynamic {}
 static method errors() → dynamic {
-  self::A? a1 = new self::A::•();
+  self::A? a1 = new self::A::•() as{ForNonNullableByDefault} self::A?;
   let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41495.dart:14:6: Error: Property 'c1' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
 Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect
index ecc36781..4df1b52 100644
--- a/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41495.dart.weak.expect
@@ -27,7 +27,7 @@
 }
 static method main() → dynamic {}
 static method errors() → dynamic {
-  self::A? a1 = new self::A::•();
+  self::A? a1 = new self::A::•() as{ForNonNullableByDefault} self::A?;
   let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41495.dart:14:6: Error: Property 'c1' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
 Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
index a9091d4..0c7badc 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
@@ -12,3 +12,11 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:6:38 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:8:38 -> BoolConstant(false)
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:10:38 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:12:38 -> ListConstant(const <int?>[])
+Extra constant evaluation: tries: 6, successes: 4
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
index 93245c26..3e924b7 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
@@ -47,3 +47,10 @@
     ^^^";
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///issue41700b.dart:8:12 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41700b.dart:8:12 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue41700b.dart:8:12 -> NullConstant(null)
+Extra constant evaluation: tries: 7, successes: 3
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
index db8fd3e..02ed204 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -16,3 +16,7 @@
 constants  {
   #C1 = tearoff self::checkme
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> PartialInstantiationConstant(checkme<X>)
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
index db8fd3e..1757a97 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -16,3 +16,7 @@
 constants  {
   #C1 = tearoff self::checkme
 }
+
+Extra constant evaluation status:
+Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> PartialInstantiationConstant(checkme<X*>)
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
index 0f8217b..0fcadb3 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
@@ -29,3 +29,21 @@
 constants  {
   #C1 = null
 }
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:661:13 -> SymbolConstant(#catchError)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:661:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:661:13 -> SymbolConstant(#test)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:698:13 -> SymbolConstant(#whenComplete)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:698:13 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:698:13 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:725:13 -> SymbolConstant(#timeout)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:725:13 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:725:13 -> SymbolConstant(#onTimeout)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:622:13 -> SymbolConstant(#then)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:622:13 -> SymbolConstant(#onError)
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> SymbolConstant(#asStream)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:709:13 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 61, successes: 15
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart b/pkg/front_end/testcases/nnbd/null_aware_chain.dart
index a53cacf..ff589af 100644
--- a/pkg/front_end/testcases/nnbd/null_aware_chain.dart
+++ b/pkg/front_end/testcases/nnbd/null_aware_chain.dart
@@ -11,6 +11,6 @@
 }
 
 main() {
-  Class? c = new Class();
+  Class? c = new Class() as Class?;
   c?.getter1.getter2?.getter1.getter2?.field = c;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect
index 267161a..4c16033 100644
--- a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.strong.expect
@@ -13,7 +13,7 @@
     return this.{self::Class::field};
 }
 static method main() → dynamic {
-  self::Class? c = new self::Class::•();
+  self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t2 = #t1{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t2.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t3 = #t2{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t3.{core::Object::==}(null) ?{self::Class?} null : #t3{self::Class}.{self::Class::field} = c{self::Class};
 }
 
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect
index 267161a..4c16033 100644
--- a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.expect
@@ -13,7 +13,7 @@
     return this.{self::Class::field};
 }
 static method main() → dynamic {
-  self::Class? c = new self::Class::•();
+  self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t2 = #t1{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t2.{core::Object::==}(null) ?{self::Class?} null : let final self::Class? #t3 = #t2{self::Class}.{self::Class::getter1}.{self::Class::getter2} in #t3.{core::Object::==}(null) ?{self::Class?} null : #t3{self::Class}.{self::Class::field} = c{self::Class};
 }
 
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart b/pkg/front_end/testcases/nnbd/null_check.dart
index 110d74f..4cef88b 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart
+++ b/pkg/front_end/testcases/nnbd/null_check.dart
@@ -9,7 +9,7 @@
 }
 
 main() {
-  Class? c = new Class();
+  Class? c = new Class() as Class?;
   c!;
   c!.field;
   c!.field = 42;
@@ -22,7 +22,7 @@
   c + c!;
   (c + c)!;
 
-  bool? o = true;
+  bool? o = true as bool?;
   !o! ? !o! : !!o!!;
   !(o!) ? (!o)! : (!(!o)!)!;
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
index 26ca627..a1827fa 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_check.dart.strong.expect
@@ -99,7 +99,7 @@
     return new self::Class::•();
 }
 static method main() → dynamic {
-  self::Class? c = new self::Class::•();
+  self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
   c!;
   c{self::Class}!.{self::Class::field};
   c{self::Class}!.{self::Class::field} = 42;
@@ -111,7 +111,7 @@
   c{self::Class}!.{self::Class::+}(c{self::Class}!);
   c{self::Class}.{self::Class::+}(c{self::Class}!);
   c{self::Class}.{self::Class::+}(c{self::Class})!;
-  core::bool? o = true;
+  core::bool? o = true as{ForNonNullableByDefault} core::bool?;
   !o! ?{core::bool} !o{core::bool}! : !!o{core::bool}!!;
   !o{core::bool}! ?{core::bool} (!o{core::bool})! : (!(!o{core::bool})!)!;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect
index 26ca627..a1827fa 100644
--- a/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_check.dart.weak.expect
@@ -99,7 +99,7 @@
     return new self::Class::•();
 }
 static method main() → dynamic {
-  self::Class? c = new self::Class::•();
+  self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
   c!;
   c{self::Class}!.{self::Class::field};
   c{self::Class}!.{self::Class::field} = 42;
@@ -111,7 +111,7 @@
   c{self::Class}!.{self::Class::+}(c{self::Class}!);
   c{self::Class}.{self::Class::+}(c{self::Class}!);
   c{self::Class}.{self::Class::+}(c{self::Class})!;
-  core::bool? o = true;
+  core::bool? o = true as{ForNonNullableByDefault} core::bool?;
   !o! ?{core::bool} !o{core::bool}! : !!o{core::bool}!!;
   !o{core::bool}! ?{core::bool} (!o{core::bool})! : (!(!o{core::bool})!)!;
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
index 96a333d..796847e 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.strong.transformed.expect
@@ -131,3 +131,67 @@
   let final self::Class1? #t102 = c1 in #t102.{core::Object::==}(null) ?{core::int?} null : let final self::Class2? #t103 = #t102{self::Class1}.{self::Class1::field} in #t103.{core::Object::==}(null) ?{core::int?} null : let final core::int #t104 = 0 in self::Extension|[](#t103{self::Class2}, #t104).{core::num::==}(null) ?{core::int} self::Extension|[]=(#t103{self::Class2}, #t104, 1) : null;
   let final self::Class1? #t105 = c1 in #t105.{core::Object::==}(null) ?{core::int?} null : let final self::Class2? #t106 = #t105{self::Class1}.{self::Class1::field} in #t106.{core::Object::==}(null) ?{core::int?} null : let final core::int #t107 = 0 in self::Extension|[](#t106{self::Class2}, #t107).{core::num::==}(null) ?{core::int} self::Extension|[]=(#t106{self::Class2}, #t107, 1.{core::num::+}(let core::int? #t108 = let final self::Class2? #t109 = c2 in #t109.{core::Object::==}(null) ?{core::int?} null : self::Extension|[](#t109{self::Class2}, 1)! in #t108.==(null) ?{core::int} #t108 as{ForNonNullableByDefault} core::int : #t108{core::int})) : null;
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:27:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:27:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:28:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:28:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:29:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:29:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:30:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:30:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:31:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:31:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:32:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:32:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:38:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:38:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:39:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:39:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:40:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:40:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:41:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:41:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:42:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:42:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:43:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:43:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:48:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:48:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:49:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:49:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:50:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:50:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:51:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:51:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:52:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:52:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:53:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:53:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:58:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:58:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:59:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:59:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:60:16 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:60:16 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:61:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:61:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:62:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:62:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:63:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:63:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:68:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:68:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:69:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:69:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:70:27 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:70:27 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:71:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:71:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:72:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:72:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
+Extra constant evaluation: tries: 723, successes: 60
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect
index aeb32c1..11ed800 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.transformed.expect
@@ -131,3 +131,67 @@
   let final self::Class1? #t100 = c1 in #t100.{core::Object::==}(null) ?{core::int?} null : let final self::Class2? #t101 = #t100{self::Class1}.{self::Class1::field} in #t101.{core::Object::==}(null) ?{core::int?} null : let final core::int #t102 = 0 in self::Extension|[](#t101{self::Class2}, #t102).{core::num::==}(null) ?{core::int} self::Extension|[]=(#t101{self::Class2}, #t102, 1) : null;
   let final self::Class1? #t103 = c1 in #t103.{core::Object::==}(null) ?{core::int?} null : let final self::Class2? #t104 = #t103{self::Class1}.{self::Class1::field} in #t104.{core::Object::==}(null) ?{core::int?} null : let final core::int #t105 = 0 in self::Extension|[](#t104{self::Class2}, #t105).{core::num::==}(null) ?{core::int} self::Extension|[]=(#t104{self::Class2}, #t105, 1.{core::num::+}(let final self::Class2? #t106 = c2 in #t106.{core::Object::==}(null) ?{core::int?} null : self::Extension|[](#t106{self::Class2}, 1)!)) : null;
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:27:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:27:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:28:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:28:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:29:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:29:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:30:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:30:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:31:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:31:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:32:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:32:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:38:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:38:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:39:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:39:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:40:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:40:9 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:41:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:41:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:42:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:42:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:43:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:43:7 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:48:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:48:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:49:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:49:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:50:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:50:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:51:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:51:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:52:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:52:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:53:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:53:18 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:58:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:58:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:59:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:59:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:60:16 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:60:16 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:61:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:61:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:62:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:62:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:63:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:63:14 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:68:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:68:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:69:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:69:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:70:27 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:70:27 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:71:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:71:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:72:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:72:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_shorting_index.dart:73:25 -> IntConstant(0)
+Extra constant evaluation: tries: 702, successes: 60
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
index 701d5d6..0e67f9e 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
@@ -22,3 +22,7 @@
 constants  {
   #C1 = null
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///nullable_param.dart:19:23 -> IntConstant(-1)
+Extra constant evaluation: tries: 20, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect
index 701d5d6..0e67f9e 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.transformed.expect
@@ -22,3 +22,7 @@
 constants  {
   #C1 = null
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///nullable_param.dart:19:23 -> IntConstant(-1)
+Extra constant evaluation: tries: 20, successes: 1
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart b/pkg/front_end/testcases/nnbd/nullable_setter.dart
index 8e9d230..f644300 100644
--- a/pkg/front_end/testcases/nnbd/nullable_setter.dart
+++ b/pkg/front_end/testcases/nnbd/nullable_setter.dart
@@ -19,7 +19,7 @@
 }
 
 main() {
-  C? c = new C();
+  C? c = new C() as C?;
   expect("", c?.m);
   c.setter = "42";
   expect("42", c?.m);
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect
index d367854..ac016f2 100644
--- a/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_setter.dart.strong.expect
@@ -21,7 +21,7 @@
   let final self::C? #t2 = #this in #t2.{core::Object::==}(null) ?{core::String?} null : #t2{self::C}.{self::C::m} = "${index}${value}";
 }
 static method main() → dynamic {
-  self::C? c = new self::C::•();
+  self::C? c = new self::C::•() as{ForNonNullableByDefault} self::C?;
   self::expect("", let final self::C? #t3 = c in #t3.{core::Object::==}(null) ?{core::String?} null : #t3{self::C}.{self::C::m});
   self::_extension#0|set#setter(c, "42");
   self::expect("42", let final self::C? #t4 = c in #t4.{core::Object::==}(null) ?{core::String?} null : #t4{self::C}.{self::C::m});
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect
index d367854..ac016f2 100644
--- a/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.expect
@@ -21,7 +21,7 @@
   let final self::C? #t2 = #this in #t2.{core::Object::==}(null) ?{core::String?} null : #t2{self::C}.{self::C::m} = "${index}${value}";
 }
 static method main() → dynamic {
-  self::C? c = new self::C::•();
+  self::C? c = new self::C::•() as{ForNonNullableByDefault} self::C?;
   self::expect("", let final self::C? #t3 = c in #t3.{core::Object::==}(null) ?{core::String?} null : #t3{self::C}.{self::C::m});
   self::_extension#0|set#setter(c, "42");
   self::expect("42", let final self::C? #t4 = c in #t4.{core::Object::==}(null) ?{core::String?} null : #t4{self::C}.{self::C::m});
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
index 1d570f5..5ac5185 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.outline.expect
@@ -38,3 +38,11 @@
 external static method patchedMethod(core::int a) → void;
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:9:5 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:9:43 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:15:19 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:28:17 -> InstanceConstant(const _Patch{})
+Extra constant evaluation: tries: 6, successes: 4
diff --git a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect
index 461cb26..8aaaafa 100644
--- a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.outline.expect
@@ -35,3 +35,9 @@
   constructor constructor1() → self2::Class2
     ;
 }
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
index 85646dd..b15b586 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
@@ -61,3 +61,10 @@
 external static method patchedMethod([core::int i]) → void;
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod([core::int i]) → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:22 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:11:2 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: tries: 3, successes: 3
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect
index fa3b2cf..629005d9 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.outline.expect
@@ -45,3 +45,9 @@
   ;
 static method errors() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///potentially_constant_type_as.dart:22:36 -> IntConstant(3)
+Evaluated: Instantiation @ org-dartlang-testcase:///potentially_constant_type_as.dart:11:43 -> PartialInstantiationConstant(idFunction<int>)
+Extra constant evaluation: tries: 11, successes: 2
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect
index 59b2a45..423d7bd 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.outline.expect
@@ -41,3 +41,9 @@
   ;
 static method main() → void
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///potentially_constant_type_is.dart:22:36 -> IntConstant(3)
+Evaluated: Instantiation @ org-dartlang-testcase:///potentially_constant_type_is.dart:11:43 -> PartialInstantiationConstant(idFunction<int>)
+Extra constant evaluation: tries: 11, successes: 2
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
index 3fc7c86..a4a97e5 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
@@ -49,3 +49,10 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///return_null.dart:43:6 -> ListConstant(const <Enum>[const Enum{Enum.index: 0, Enum._name: "Enum.a"}, const Enum{Enum.index: 1, Enum._name: "Enum.b"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///return_null.dart:43:13 -> InstanceConstant(const Enum{Enum.index: 0, Enum._name: "Enum.a"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///return_null.dart:43:16 -> InstanceConstant(const Enum{Enum.index: 1, Enum._name: "Enum.b"})
+Extra constant evaluation: tries: 7, successes: 3
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
index 6f1bd4c..18713fd 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -630,3 +630,18 @@
   #C6 = self::Enum {index:#C4, _name:#C5}
   #C7 = <self::Enum>[#C3, #C6]
 }
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///return_null.dart:13:10 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:13:10 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:13:10 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///return_null.dart:19:12 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:19:12 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:19:12 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///return_null.dart:69:12 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:69:12 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:69:12 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///return_null.dart:75:14 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:75:14 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:75:14 -> NullConstant(null)
+Extra constant evaluation: tries: 428, successes: 12
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
index 609cde0..bb2c387 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
@@ -111,3 +111,11 @@
     f.call();
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:26:13 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:26:13 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
+Extra constant evaluation: tries: 165, successes: 4
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
index 609cde0..bb2c387 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
@@ -111,3 +111,11 @@
     f.call();
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:26:13 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:26:13 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///shorting_stop.dart:27:11 -> IntConstant(0)
+Extra constant evaluation: tries: 165, successes: 4
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
index 3d73f1d..bbb733e 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
@@ -212,3 +212,13 @@
   } =>#t32;
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:22:11 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:22:11 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:42:8 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:42:8 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
+Extra constant evaluation: tries: 221, successes: 6
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
index 3d73f1d..bbb733e 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
@@ -212,3 +212,13 @@
   } =>#t32;
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:22:11 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:22:11 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:42:8 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:42:8 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///strictly_non_nullable_warnings.dart:43:5 -> IntConstant(42)
+Extra constant evaluation: tries: 221, successes: 6
diff --git a/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect b/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect
index 5316f5a..487e5d5 100644
--- a/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.outline.expect
@@ -28,3 +28,10 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///switch_nullable_enum.dart:5:6 -> ListConstant(const <Enum>[const Enum{Enum.index: 0, Enum._name: "Enum.e1"}, const Enum{Enum.index: 1, Enum._name: "Enum.e2"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///switch_nullable_enum.dart:5:13 -> InstanceConstant(const Enum{Enum.index: 0, Enum._name: "Enum.e1"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///switch_nullable_enum.dart:5:17 -> InstanceConstant(const Enum{Enum.index: 1, Enum._name: "Enum.e2"})
+Extra constant evaluation: tries: 7, successes: 3
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
index 32d138d..cfc2836 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
@@ -91,3 +91,10 @@
                           ^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///tearoff_from_nullable_receiver.dart:14:24 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///tearoff_from_nullable_receiver.dart:14:24 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///tearoff_from_nullable_receiver.dart:14:24 -> NullConstant(null)
+Extra constant evaluation: tries: 58, successes: 3
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
index f25f680..32ed016 100644
--- a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
@@ -24,3 +24,10 @@
              ^" in x as{TypeError,ForNonNullableByDefault} core::String;
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///type_constraint_solving_closures_in_upper_and_lower_bounds.dart:10:3 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///type_constraint_solving_closures_in_upper_and_lower_bounds.dart:10:15 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///type_constraint_solving_closures_in_upper_and_lower_bounds.dart:10:3 -> NullConstant(null)
+Extra constant evaluation: tries: 12, successes: 3
diff --git a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
index 2a5dc83..e3474fe 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
@@ -123,3 +123,22 @@
   #C6 = self::Class<core::int*> {field:#C2}
   #C7 = self::Class<core::Null?> {field:#C3}
 }
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:46:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:47:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:48:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:49:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:50:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:51:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:52:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:53:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:54:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:55:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:56:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:57:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:58:15 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:8:40 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is_lib.dart:24:15 -> BoolConstant(false)
+Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is_lib.dart:25:15 -> BoolConstant(true)
+Extra constant evaluation: tries: 139, successes: 16
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
index d562933..87f8f14 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
@@ -26,3 +26,8 @@
   #C2 = true
   #C3 = <core::int*>[]
 }
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:5:44 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:7:44 -> BoolConstant(true)
+Extra constant evaluation: tries: 18, successes: 2
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
index 211e16d..17acc60 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
@@ -488,11 +488,11 @@
   new uns::OptInClass4::•().{uns::OptInClass4::methodForEffect}(i);
 }
 static method nullAwareIfNullSetOptIn(core::int i) → dynamic {
-  uns::OptInClass5? o = new uns::OptInClass5::•(i);
+  uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
   return let final uns::OptInClass5? #t66 = o in #t66.{core::Object::==}(null) ?{core::int?} null : let final core::int #t67 = #t66.{uns::OptInClass5::field} in #t67.{core::num::==}(null) ?{core::int} #t66.{uns::OptInClass5::field} = 42 : #t67;
 }
 static method nullAwareIfNullSetOptInForEffect(core::int i) → dynamic {
-  uns::OptInClass5? o = new uns::OptInClass5::•(i);
+  uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
   let final uns::OptInClass5? #t68 = o in #t68.{core::Object::==}(null) ?{core::int?} null : #t68.{uns::OptInClass5::field}.{core::num::==}(null) ?{core::int} #t68.{uns::OptInClass5::field} = 42 : null;
 }
 static method isTestOptIn(core::int i) → dynamic
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
index 211e16d..8d00f15 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
@@ -619,3 +619,24 @@
   #C7 = null
   #C8 = <uns::E*>[#C3, #C6]
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:73:33 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:73:33 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:26:77 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:26:77 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:32:60 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:32:60 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:43:58 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks.dart:43:58 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:69:33 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:69:33 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:22:74 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:22:74 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:28:58 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:28:58 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:39:56 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:39:56 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:134:5 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///unsound_checks_lib.dart:134:5 -> IntConstant(0)
+Extra constant evaluation: tries: 720, successes: 18
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart b/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart
index 6dd9b47..738e03a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart
@@ -85,12 +85,12 @@
 }
 
 nullAwareIfNullSetOptIn(int i) {
-  OptInClass5? o = new OptInClass5(i);
+  OptInClass5? o = new OptInClass5(i) as OptInClass5?;
   return o?.field ??= 42;
 }
 
 nullAwareIfNullSetOptInForEffect(int i) {
-  OptInClass5? o = new OptInClass5(i);
+  OptInClass5? o = new OptInClass5(i) as OptInClass5?;
   o?.field ??= 42;
 }
 
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
index 55520c5..2cd194d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
@@ -44,3 +44,14 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> SymbolConstant(#foo=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field.dart:18:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 19, successes: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
index fb37b2b..be8c3ef 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
@@ -61,3 +61,14 @@
 static field core::int* count;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> SymbolConstant(#foo=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_arent_mixed_in.dart:12:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 19, successes: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
index 05b41eb..228826a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
@@ -67,3 +67,14 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> SymbolConstant(#foo=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_one_defined.dart:17:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 19, successes: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
index 874eb21..7f8e4b5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
@@ -40,3 +40,14 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> SymbolConstant(#foo=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_accessors_from_field_with_substitution.dart:18:11 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 19, successes: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
index 80872a0..85a5331 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
@@ -40,3 +40,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_interface_nsm_inherited.dart:16:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_interface_nsm_inherited.dart:16:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_interface_nsm_inherited.dart:16:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_interface_nsm_inherited.dart:16:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect
index 18732e96..d42519a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.outline.expect
@@ -35,3 +35,19 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:8:7 -> SymbolConstant(#push=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:8:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:8:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:9:7 -> SymbolConstant(#float=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:9:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:9:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:16:7 -> SymbolConstant(#push=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:16:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:17:7 -> SymbolConstant(#float=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:17:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_override_abstract_different_type.dart:17:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 40, successes: 12
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
index 6db64b7..a7aa057 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.outline.expect
@@ -69,3 +69,17 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:8:8 -> SymbolConstant(#eatFood)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:8:8 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:8:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:23:8 -> SymbolConstant(#eatFood)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:23:8 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:23:8 -> SymbolConstant(#amount)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:26:7 -> SymbolConstant(#eatFood)
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:26:7 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:26:7 -> SymbolConstant(#amount)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///abstract_override_with_different_signature.dart:26:7 -> SymbolConstant(#yetAnother)
+Extra constant evaluation: tries: 39, successes: 10
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
index ebb3cd0..fb783b9 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
@@ -61,3 +61,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///concrete_method_over_forwarder_in_mixin_application.dart:10:3 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///concrete_method_over_forwarder_in_mixin_application.dart:10:3 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///concrete_method_over_forwarder_in_mixin_application.dart:10:3 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///concrete_method_over_forwarder_in_mixin_application.dart:10:3 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 9, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
index eb0cac0..9d3cb8e 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
@@ -29,3 +29,14 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///default_argument_values.dart:21:10 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///default_argument_values.dart:21:10 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///default_argument_values.dart:21:10 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///default_argument_values.dart:21:10 -> SymbolConstant(#bar)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///default_argument_values.dart:22:7 -> SymbolConstant(#hest)
+Evaluated: ListLiteral @ org-dartlang-testcase:///default_argument_values.dart:22:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///default_argument_values.dart:22:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 22, successes: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
index a0f19c9..aab9b99 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
@@ -51,3 +51,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect
index 47c4e4a..30955c5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.outline.expect
@@ -100,3 +100,36 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:12:11 -> SymbolConstant(#bar)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:12:11 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:12:11 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:12:11 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:13:8 -> SymbolConstant(#baz)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:13:8 -> ListConstant(const <Type*>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:13:8 -> SymbolConstant(#y)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:13:8 -> SymbolConstant(#z)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:11:12 -> SymbolConstant(#foo=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:11:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation.dart:11:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:7:11 -> SymbolConstant(#_privateGetter)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:7:11 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:7:11 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:7:11 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> SymbolConstant(#_privateField)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:9:8 -> SymbolConstant(#_privateMethod)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:9:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:9:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:9:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:8:12 -> SymbolConstant(#_privateSetter=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:8:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:8:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> SymbolConstant(#_privateField=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarder_propagation_lib.dart:6:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 79, successes: 29
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
index f5c8765..6e1c5fd 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
@@ -56,3 +56,15 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///forwarders_not_assumed_from_mixin.dart:10:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 16, successes: 8
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
index 4e3645c..bd80008 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
@@ -41,3 +41,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///interface_with_concrete.dart:16:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_concrete.dart:16:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_concrete.dart:16:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///interface_with_concrete.dart:16:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
index facaaaf..f8bacc6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
@@ -76,3 +76,19 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///interface_with_nsm.dart:15:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 24, successes: 12
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
index a5ebee0..f723036 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
@@ -77,3 +77,14 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:17:12 -> SymbolConstant(#bar)
+Evaluated: ListLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:17:12 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:17:12 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:17:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:16:12 -> SymbolConstant(#foo=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:16:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///multiple_abstract_setters.dart:16:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 19, successes: 7
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
index 16b6208..a0cdefd 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
@@ -26,3 +26,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes.dart:13:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes.dart:13:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes.dart:13:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes.dart:13:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
index 81d064a..0a63c6f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
@@ -34,3 +34,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes_chain.dart:14:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes_chain.dart:14:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes_chain.dart:14:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///no_forwarders_for_abstract_classes_chain.dart:14:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
index a3ab6a8..878ce86 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
@@ -25,3 +25,10 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_inherited.dart:13:8 -> SymbolConstant(#call)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_inherited.dart:13:8 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_inherited.dart:13:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 10, successes: 3
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
index 936234c..f44fb74 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
@@ -39,3 +39,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_mixed_in.dart:15:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_mixed_in.dart:15:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_mixed_in.dart:15:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_mixed_in.dart:15:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
index 67632eb..43a5a8b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
@@ -58,3 +58,15 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> SymbolConstant(#_hest)
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> SymbolConstant(#_hest)
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///private_module.dart:11:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 16, successes: 8
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
index 247243b..8a438d1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
@@ -27,3 +27,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///private_same.dart:10:8 -> SymbolConstant(#_foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_same.dart:10:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///private_same.dart:10:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///private_same.dart:10:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
index c3c56f4..228bf79 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
@@ -21,3 +21,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///same.dart:14:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///same.dart:14:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///same.dart:14:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///same.dart:14:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 8, successes: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
index 7e60f4f..d34c55c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
@@ -33,3 +33,10 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///setter_not_shadowed_by_method.dart:12:12 -> SymbolConstant(#foo=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///setter_not_shadowed_by_method.dart:12:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///setter_not_shadowed_by_method.dart:12:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 10, successes: 3
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index a62df4b..f3f2e8b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -54,3 +54,11 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///subst_on_forwarder.dart:10:5 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///subst_on_forwarder.dart:10:5 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///subst_on_forwarder.dart:10:5 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///subst_on_forwarder.dart:10:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 9, successes: 4
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 3c00bd1..82835d3 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -14,6 +14,7 @@
 general_nnbd_opt_out/override_setter_with_field: TypeCheckError
 general/abstract_members: TypeCheckError
 general/bug30695: TypeCheckError
+general/constants/const_collections: TypeCheckError
 general/covariant_field: TypeCheckError
 general/infer_field_from_multiple: TypeCheckError
 general/invalid_operator: TypeCheckError
diff --git a/pkg/front_end/testcases/rasta/enum.dart.outline.expect b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
index 1d69d48..ee249a7 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
@@ -25,3 +25,10 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///enum.dart:5:6 -> ListConstant(const <Foo*>[const Foo{Foo.index: 0, Foo._name: "Foo.ec1"}, const Foo{Foo.index: 1, Foo._name: "Foo.ec2"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum.dart:6:3 -> InstanceConstant(const Foo{Foo.index: 0, Foo._name: "Foo.ec1"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum.dart:7:3 -> InstanceConstant(const Foo{Foo.index: 1, Foo._name: "Foo.ec2"})
+Extra constant evaluation: tries: 7, successes: 3
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
index b3330742..8a4fbe0 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
@@ -42,3 +42,9 @@
   new self::C::•();
   new self::D::•();
 }
+
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///issue_000026.dart:8:13 -> IntConstant(3)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///issue_000026.dart:14:13 -> IntConstant(-1)
+Extra constant evaluation: tries: 4, successes: 2
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
index 62fa768..27bb674 100644
--- a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
@@ -19,3 +19,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///issue_000043.dart:6:14 -> TypeLiteralConstant(C*)
+Extra constant evaluation: tries: 3, successes: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
index 2622c42..0a88a49 100644
--- a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
@@ -17,3 +17,9 @@
 static method main() → dynamic
   return "${1}
 \"\"\"";
+
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///issue_000045.dart:6:1 -> StringConstant("1
+\"\"\"")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
index 8b5453f..a99869d 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -50,3 +50,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue_000070.dart:22:33 -> ListConstant(const <Null?>[null])
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
index bf1076a..6eb4bee 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
@@ -33,3 +33,9 @@
   core::List<core::Null?>* l = <core::Null?>[null];
   let final core::List<core::Null?>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} core::Null?) : null;
 }
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///issue_000081.dart:22:5 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///issue_000081.dart:22:5 -> IntConstant(0)
+Extra constant evaluation: tries: 33, successes: 2
diff --git a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
index b43a9e5..531daa2 100644
--- a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
@@ -337,3 +337,12 @@
   #C1 = 42
   #C2 = tearoff self::Foo::staticFunction
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///static.dart:32:13 -> IntConstant(42)
+Evaluated: VariableGet @ org-dartlang-testcase:///static.dart:36:13 -> TearOffConstant(Foo.staticFunction)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///static.dart:75:24 -> NullConstant(null)
+Evaluated: Let @ org-dartlang-testcase:///static.dart:76:28 -> IntConstant(42)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///static.dart:79:24 -> NullConstant(null)
+Evaluated: Let @ org-dartlang-testcase:///static.dart:80:28 -> TearOffConstant(Foo.staticFunction)
+Extra constant evaluation: tries: 122, successes: 6
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
index ad8084b..a1307d9 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
@@ -530,3 +530,19 @@
 static method main() → dynamic {
   new self::C::•<dynamic>().{self::C::test}();
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literals.dart:11:5 -> TypeLiteralConstant(C<dynamic>*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literals.dart:12:9 -> TypeLiteralConstant(C<dynamic>*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literals.dart:13:5 -> TypeLiteralConstant(dynamic)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literals.dart:14:9 -> TypeLiteralConstant(dynamic)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literals.dart:17:5 -> TypeLiteralConstant(void Function()*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_literals.dart:18:9 -> TypeLiteralConstant(void Function()*)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///type_literals.dart:74:7 -> NullConstant(null)
+Evaluated: Let @ org-dartlang-testcase:///type_literals.dart:75:11 -> TypeLiteralConstant(C<dynamic>*)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///type_literals.dart:76:13 -> NullConstant(null)
+Evaluated: Let @ org-dartlang-testcase:///type_literals.dart:77:17 -> TypeLiteralConstant(dynamic)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///type_literals.dart:80:10 -> NullConstant(null)
+Evaluated: Let @ org-dartlang-testcase:///type_literals.dart:81:14 -> TypeLiteralConstant(void Function()*)
+Extra constant evaluation: tries: 72, successes: 12
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
index 36ac25e..c70ff3c 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
@@ -30,3 +30,9 @@
   Foo();
   ^^^";
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///typedef.dart:8:9 -> TypeLiteralConstant(void Function()*)
+Evaluated: ConditionalExpression @ org-dartlang-testcase:///typedef.dart:10:7 -> NullConstant(null)
+Extra constant evaluation: tries: 3, successes: 2
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
index c943cfc..6f30679 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
@@ -258,3 +258,11 @@
     }
   }
 }
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///unresolved_for_in.dart:15:13 -> TypeLiteralConstant(Fisk*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///unresolved_for_in.dart:21:13 -> TypeLiteralConstant(void Function()*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///unresolved_for_in.dart:35:11 -> TypeLiteralConstant(Fisk*)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///unresolved_for_in.dart:41:11 -> TypeLiteralConstant(void Function()*)
+Extra constant evaluation: tries: 85, successes: 4
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
index e570118..29d84c1 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
@@ -34,3 +34,7 @@
 constants  {
   #C1 = tearoff self::foo
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///issue_30838.dart:15:15 -> StringConstant("hello")
+Extra constant evaluation: tries: 7, successes: 1
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
index 261ed57..2bb9e3f 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
@@ -14,3 +14,8 @@
   return let final<BottomType> #t1 = null in #t1.{core::Object::==}(null) ?{dynamic} null : #t1.[](1);
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: Let @ org-dartlang-testcase:///issue_31180.dart:6:10 -> NullConstant(null)
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
index a9152eb..c697a08 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
@@ -15,3 +15,7 @@
 constants  {
   #C1 = tearoff self::main
 }
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///issue_31846.dart:6:14 -> BoolConstant(true)
+Extra constant evaluation: tries: 26, successes: 1
diff --git a/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect
index 321df68..a5f5964 100644
--- a/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35220.dart.strong.transformed.expect
@@ -32,3 +32,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: Not @ org-dartlang-testcase:///issue_35220.dart:6:25 -> BoolConstant(true)
+Extra constant evaluation: tries: 3, successes: 1
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
index 99368e0..969fc91 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
@@ -17,3 +17,8 @@
 static field core::int* x;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///issue_36793.dart:7:2 -> IntConstant(42)
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
index a081cbc..013a7ab 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
@@ -26,3 +26,8 @@
   let final self::C<core::num*>* #t2 = c in let final core::double* #t3 = 1.5 in (#t2.{self::C::y} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t3);
 }
 static method main() → void {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_getter.dart:18:49 -> DoubleConstant(1.5)
+Extra constant evaluation: tries: 14, successes: 1
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
index 89e5e57..d832e66 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
@@ -30,3 +30,7 @@
 constants  {
   #C1 = tearoff self::h
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///dynamic_invocation_of_getter.dart:14:7 -> DoubleConstant(1.5)
+Extra constant evaluation: tries: 10, successes: 1
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
index 9b11bf0c..2a5053a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
@@ -57,3 +57,11 @@
   self::B<core::num*, (core::num*) →* void>* x = self::C::y = self::C::y.{self::B::+}(2) as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*;
 }
 static method main() → void {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_combiner.dart:27:5 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_combiner.dart:27:5 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_combiner.dart:28:13 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_combiner.dart:28:13 -> IntConstant(0)
+Extra constant evaluation: tries: 58, successes: 4
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 59b4ef8..45354e3 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -89,3 +89,7 @@
   #C1 = tearoff self::numToInt
   #C2 = tearoff self::numToNum
 }
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_generic_return_with_compound_assign_implicit_downcast.dart:50:21 -> IntConstant(0)
+Extra constant evaluation: tries: 58, successes: 1
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
index 890a09c..1b209c7 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
@@ -46,3 +46,15 @@
   self::B<(core::num*) →* void>* y = let final self::C<core::num*>* #t9 = c in let final core::int* #t10 = 0 in let final self::B<(core::num*) →* void>* #t11 = #t9.{self::C::[]}(#t10) as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>* in #t11.{self::B::==}(null) ?{self::B<(core::num*) →* void>*} let final self::B<(core::num*) →* void>* #t12 = new self::B::•<(core::num*) →* void>() in let final void #t13 = #t9.{self::C::[]=}(#t10, #t12) in #t12 : #t11;
 }
 static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:21:45 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:21:45 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:22:53 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:22:53 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:23:45 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:23:45 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:24:53 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_index_assign.dart:24:53 -> IntConstant(0)
+Extra constant evaluation: tries: 64, successes: 8
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 07eb30c..5515dcd 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -24,6 +24,10 @@
 general/callable_type_variable: TypeCheckError
 general/candidate_found: TypeCheckError
 general/cascade: RuntimeError
+general/constants/with_unevaluated_agnostic/const_asserts: TextSerializationFailure
+general/constants/with_unevaluated_agnostic/const_collections: TextSerializationFailure
+general/constants/with_unevaluated_agnostic/various: TextSerializationFailure
+general/constants/with_unevaluated_agnostic/various_2: TextSerializationFailure
 general/constructor_initializer_invalid: RuntimeError
 general/covariant_field: TypeCheckError
 general/covariant_generic: RuntimeError
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 545d83e..1619610 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -87,6 +87,9 @@
 general/bad_setter_abstract: FormatterCrash
 general/bug31124: FormatterCrash
 general/clone_function_type: FormatterCrash
+general/constants/js_semantics/number_folds: FormatterCrash
+general/constants/number_folds: FormatterCrash
+general/constants/various: FormatterCrash
 general/constructor_initializer_invalid: FormatterCrash
 general/duplicated_declarations: FormatterCrash
 general/error_recovery/annotations: FormatterCrash
diff --git a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
index 930929b..47b50a0 100644
--- a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
@@ -11,3 +11,9 @@
       #t1.{core::List::add}("cd");
   } =>#t1;
 }
+
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///string_concatenation.dart:7:3 -> StringConstant("ab")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///string_concatenation.dart:7:18 -> StringConstant("cd")
+Extra constant evaluation: tries: 10, successes: 2
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect
index 0e4993f..97e851f 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.outline.expect
@@ -32,3 +32,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///copy_with_call_sites.dart:12:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/value_class/empty.dart.outline.expect b/pkg/front_end/testcases/value_class/empty.dart.outline.expect
index 8eabbff..7f28314 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.outline.expect
@@ -26,3 +26,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///empty.dart:7:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
index 1186e41..492c803 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
@@ -50,3 +50,9 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///explicit_mixin.dart:7:2 -> StringConstant("valueClass")
+Evaluated: StaticGet @ org-dartlang-testcase:///explicit_mixin.dart:17:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
index c7f8eba..844ecde 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
@@ -27,3 +27,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///non_final_field_error.dart:7:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
index cabfc54..83976fb 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
@@ -31,3 +31,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///non_value_extends_value_error.dart:7:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
index 26f4715..e21ab6e 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
@@ -32,3 +32,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///non_value_implements_value_error.dart:7:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/value_class/simple.dart.outline.expect b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
index ffcabdf..133d2e8 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
@@ -29,3 +29,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///simple.dart:7:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
index 6cdbfae..b9fa359 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
@@ -34,3 +34,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///value_extends_non_value.dart:12:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
index a6a74a9..817542e 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
@@ -41,3 +41,9 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///value_extends_non_value_error.dart:11:2 -> StringConstant("valueClass")
+Evaluated: StaticGet @ org-dartlang-testcase:///value_extends_non_value_error.dart:18:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
index 858458c..09d9e5f 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
@@ -80,3 +80,9 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///value_implements_non_value.dart:12:2 -> StringConstant("valueClass")
+Evaluated: StaticGet @ org-dartlang-testcase:///value_implements_non_value.dart:22:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 2, successes: 2
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
index 3210673..e4f0339 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
@@ -48,3 +48,8 @@
     ;
 }
 static const field core::String valueClass = "valueClass";
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///value_mixin_error.dart:7:2 -> StringConstant("valueClass")
+Extra constant evaluation: tries: 1, successes: 1
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
index 436ada2..217885d 100644
--- a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.outline.expect
@@ -164,3 +164,20 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> SymbolConstant(#x)
+Evaluated: ListLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:23:5 -> SymbolConstant(#method)
+Evaluated: ListLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:23:5 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:23:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:24:12 -> SymbolConstant(#y=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:24:12 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:24:12 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> SymbolConstant(#x=)
+Evaluated: ListLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_covariance_sound_variance.dart:22:5 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Extra constant evaluation: tries: 42, successes: 13
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index 2a47606..5eeb061 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -246,6 +246,13 @@
         conversions.add("name4 = demangleMixinApplicationName(name4);");
         break;
 
+      case "nameOKEmpty":
+        parameters.add("String nameOKEmpty");
+        conversions.add("if (nameOKEmpty == null || nameOKEmpty.isEmpty) "
+            "nameOKEmpty = '(unnamed)';");
+        arguments.add("'nameOKEmpty': nameOKEmpty");
+        break;
+
       case "names":
         parameters.add("List<String> _names");
         conversions.add("if (_names.isEmpty) throw 'No names provided';");
@@ -283,6 +290,13 @@
         arguments.add("'string3': string3");
         break;
 
+      case "stringOKEmpty":
+        parameters.add("String stringOKEmpty");
+        conversions.add("if (stringOKEmpty == null || stringOKEmpty.isEmpty) "
+            "stringOKEmpty = '(empty)';");
+        arguments.add("'stringOKEmpty': stringOKEmpty");
+        break;
+
       case "type":
       case "type2":
       case "type3":
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 9e583c2..dc92143 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -1151,8 +1151,10 @@
   /// The resulting class name is written as a String to
   /// `_kernelBinaryFilename`.widget_cache, or else the file is deleted
   /// if it exists.
+  ///
+  /// Should not run if a full component is requested.
   void _updateWidgetCache(Component partialComponent) {
-    if (_widgetCache == null) {
+    if (_widgetCache == null || _generator.fullComponent) {
       return;
     }
     final String singleModifiedClassName =
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 9a2682b..c0f3e48 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -4342,6 +4342,7 @@
 /// Expression of form `x && y` or `x || y`
 class LogicalExpression extends Expression {
   Expression left;
+  // TODO(jensj): `??` is not supported and we shouldn't say so.
   String operator; // && or || or ??
   Expression right;
 
@@ -8952,6 +8953,8 @@
     printer.write(escapeString(value));
     printer.write('"');
   }
+
+  String toString() => 'StringConstant(${toStringInternal()})';
 }
 
 class SymbolConstant extends Constant {
@@ -8966,7 +8969,7 @@
   R acceptReference<R>(Visitor<R> v) => v.visitSymbolConstantReference(this);
 
   @override
-  String toString() => 'StringConstant(${toStringInternal()})';
+  String toString() => 'SymbolConstant(${toStringInternal()})';
 
   int get hashCode => _Hash.hash2(name, libraryReference);
 
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 5a8f2bb..2140235 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -4626,7 +4626,7 @@
   // here non-null is OK.
   int i1 = 0, i2 = i1.gcd(2);
   // here non-null is not OK.
-  int? i3 = 0, i4 = i3!.gcd(2), i5 = null;
+  int? i3 = 0, i4 = i3.gcd(2), i5 = null;
 }
 ''';
 
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index bdf51ec..1c89c6d 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -196,7 +196,7 @@
       if (result.IsSmi()) {
         return result.raw();
       }
-      return result.CheckAndCanonicalize(thread, NULL);
+      return result.Canonicalize(thread);
     }
   }
   return default_value.raw();
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 0bed69c..34ccc5b 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -707,7 +707,7 @@
   ASSERT(type.IsCanonical() || type.IsTypeParameter());
 
   if (type.IsInstantiated()) {
-    return type.Canonicalize();
+    return type.Canonicalize(Thread::Current(), nullptr);
   }
   TypeArguments& instantiator_type_args = TypeArguments::Handle();
   if (!instantiator.IsNull()) {
@@ -718,7 +718,7 @@
       instantiator_type_args, Object::null_type_arguments(), kAllFree,
       Heap::kOld));
   ASSERT(result.IsFinalized());
-  return result.Canonicalize();
+  return result.Canonicalize(Thread::Current(), nullptr);
 }
 
 DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0, 0) {
@@ -985,7 +985,7 @@
   ASSERT(!func.IsNull());
   AbstractType& type = AbstractType::Handle(func.result_type());
   // Signatures of function types are instantiated, but not canonical.
-  return type.Canonicalize();
+  return type.Canonicalize(thread, nullptr);
 }
 
 DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 0, 1) {
@@ -1332,7 +1332,7 @@
   const AbstractType& type = AbstractType::Handle(instance.GetType(Heap::kNew));
   // The static type of null is specified to be the bottom type, however, the
   // runtime type of null is the Null type, which we correctly return here.
-  return type.Canonicalize();
+  return type.Canonicalize(thread, nullptr);
 }
 
 DEFINE_NATIVE_ENTRY(ClosureMirror_function, 0, 1) {
@@ -1487,7 +1487,7 @@
       ASSERT(redirect_type.IsInstantiated(kFunctions));
       redirect_type ^= redirect_type.InstantiateFrom(
           type_arguments, Object::null_type_arguments(), kNoneFree, Heap::kOld);
-      redirect_type ^= redirect_type.Canonicalize();
+      redirect_type ^= redirect_type.Canonicalize(thread, nullptr);
     }
 
     type = redirect_type.raw();
@@ -1638,7 +1638,8 @@
   // We handle constructors in Dart code.
   ASSERT(!func.IsGenerativeConstructor());
   AbstractType& type = AbstractType::Handle(func.result_type());
-  type = type.Canonicalize();  // Instantiated signatures are not canonical.
+  type = type.Canonicalize(
+      thread, nullptr);  // Instantiated signatures are not canonical.
   return InstantiateType(type, instantiator);
 }
 
@@ -1756,7 +1757,8 @@
   const Function& func = Function::Handle(ref.GetFunctionReferent());
   AbstractType& type = AbstractType::Handle(
       func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value()));
-  type = type.Canonicalize();  // Instantiated signatures are not canonical.
+  type = type.Canonicalize(
+      thread, nullptr);  // Instantiated signatures are not canonical.
   return InstantiateType(type, instantiator);
 }
 
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 7dd5823..9710b64 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -367,7 +367,8 @@
         type_arg = interface_type_args.TypeAt(offset + i);
         extracted_type_args.SetTypeAt(i, type_arg);
       }
-      extracted_type_args = extracted_type_args.Canonicalize();  // Can be null.
+      extracted_type_args =
+          extracted_type_args.Canonicalize(thread, nullptr);  // Can be null.
     }
   }
   // Call the closure 'extract'.
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index e2c1435..8d02cbb 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -680,7 +680,7 @@
   if (type.IsFinalized()) {
     // Ensure type is canonical if canonicalization is requested.
     if ((finalization >= kCanonicalize) && !type.IsCanonical()) {
-      return type.Canonicalize();
+      return type.Canonicalize(Thread::Current(), nullptr);
     }
     return type.raw();
   }
@@ -737,7 +737,7 @@
       ASSERT(type_parameter.IsCanonical());
       return type_parameter.raw();
     }
-    return type_parameter.Canonicalize();
+    return type_parameter.Canonicalize(Thread::Current(), nullptr);
   }
 
   // At this point, we can only have a Type.
@@ -821,13 +821,13 @@
     if (FLAG_trace_type_finalization) {
       THR_Print("Canonicalizing type '%s'\n",
                 String::Handle(zone, type.Name()).ToCString());
-      AbstractType& canonical_type =
-          AbstractType::Handle(zone, type.Canonicalize());
+      AbstractType& canonical_type = AbstractType::Handle(
+          zone, type.Canonicalize(Thread::Current(), nullptr));
       THR_Print("Done canonicalizing type '%s'\n",
                 String::Handle(zone, canonical_type.Name()).ToCString());
       return canonical_type.raw();
     }
-    return type.Canonicalize();
+    return type.Canonicalize(Thread::Current(), nullptr);
   } else {
     return type.raw();
   }
@@ -1273,8 +1273,7 @@
   enum_value = Instance::New(enum_cls, Heap::kOld);
   enum_value.SetField(index_field, Smi::Handle(zone, Smi::New(-1)));
   enum_value.SetField(name_field, enum_ident);
-  const char* error_msg = NULL;
-  enum_value = enum_value.CheckAndCanonicalize(thread, &error_msg);
+  enum_value = enum_value.Canonicalize(thread);
   ASSERT(!enum_value.IsNull());
   ASSERT(enum_value.IsCanonical());
   const Field& sentinel = Field::Handle(
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 8447788..0468cab 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -276,7 +276,7 @@
     // mode.
     if (cls->ptr()->host_type_arguments_field_offset_in_words_ ==
             Class::kNoTypeArguments ||
-        cls->ptr()->constants_ == Object::empty_array().raw()) {
+        cls->ptr()->constants_ == Array::null()) {
       return false;
     }
     Zone* zone = Thread::Current()->zone();
@@ -3974,7 +3974,7 @@
     if (is_canonical && (d->isolate() != Dart::vm_isolate())) {
       const Class& mint_cls = Class::Handle(
           d->zone(), Isolate::Current()->object_store()->mint_class());
-      mint_cls.set_constants(Object::empty_array());
+      mint_cls.set_constants(Object::null_array());
       Object& number = Object::Handle(d->zone());
       for (intptr_t i = start_index_; i < stop_index_; i++) {
         number = refs.At(i);
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 1f31fd0..62c6dd0 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2073,31 +2073,33 @@
 
       constants = cls.constants();
       retained_constants = GrowableObjectArray::New();
-      for (intptr_t j = 0; j < constants.Length(); j++) {
-        constant ^= constants.At(j);
-        bool retain = consts_to_retain_.HasKey(&constant);
-        if (retain) {
-          retained_constants.Add(constant);
+      if (!constants.IsNull()) {
+        for (intptr_t j = 0; j < constants.Length(); j++) {
+          constant ^= constants.At(j);
+          bool retain = consts_to_retain_.HasKey(&constant);
+          if (retain) {
+            retained_constants.Add(constant);
+          }
         }
       }
       intptr_t cid = cls.id();
       if (cid == kDoubleCid) {
         // Rehash.
-        cls.set_constants(Object::empty_array());
+        cls.set_constants(Object::null_array());
         for (intptr_t j = 0; j < retained_constants.Length(); j++) {
           constant ^= retained_constants.At(j);
           cls.InsertCanonicalDouble(Z, Double::Cast(constant));
         }
       } else if (cid == kMintCid) {
         // Rehash.
-        cls.set_constants(Object::empty_array());
+        cls.set_constants(Object::null_array());
         for (intptr_t j = 0; j < retained_constants.Length(); j++) {
           constant ^= retained_constants.At(j);
           cls.InsertCanonicalMint(Z, Mint::Cast(constant));
         }
       } else {
         // Rehash.
-        cls.set_constants(Object::empty_array());
+        cls.set_constants(Object::null_array());
         for (intptr_t j = 0; j < retained_constants.Length(); j++) {
           constant ^= retained_constants.At(j);
           cls.InsertCanonicalConstant(Z, constant);
@@ -2271,7 +2273,7 @@
 
     ASSERT(!cls.is_allocated());
     constants = cls.constants();
-    ASSERT(constants.Length() == 0);
+    ASSERT(constants.IsNull() || (constants.Length() == 0));
 
     dropped_class_count_++;
     if (FLAG_trace_precompiler) {
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 5ed0188..fc4cfbf 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -1048,7 +1048,7 @@
     result = TypeRef::Cast(result).type();
   }
   ASSERT(result.IsInstantiated());
-  result = result.Canonicalize();
+  result = result.Canonicalize(T, nullptr);
   SetValue(instr, result);
 }
 
@@ -1113,7 +1113,7 @@
       Z, type_arguments.InstantiateFrom(
              instantiator_type_args, function_type_args, kAllFree, Heap::kOld));
   ASSERT(result.IsInstantiated());
-  result = result.Canonicalize();
+  result = result.Canonicalize(T, nullptr);
   SetValue(instr, result);
 }
 
@@ -1709,10 +1709,8 @@
     if ((constant_value_.IsString() || constant_value_.IsMint() ||
          constant_value_.IsDouble()) &&
         !constant_value_.IsCanonical()) {
-      const char* error_str = nullptr;
-      constant_value_ =
-          Instance::Cast(constant_value_).CheckAndCanonicalize(T, &error_str);
-      ASSERT(!constant_value_.IsNull() && (error_str == nullptr));
+      constant_value_ = Instance::Cast(constant_value_).Canonicalize(T);
+      ASSERT(!constant_value_.IsNull());
     }
     if (auto call = defn->AsStaticCall()) {
       ASSERT(!call->HasPushArguments());
diff --git a/runtime/vm/compiler/backend/evaluator.cc b/runtime/vm/compiler/backend/evaluator.cc
index 18e9856..ce4660c 100644
--- a/runtime/vm/compiler/backend/evaluator.cc
+++ b/runtime/vm/compiler/backend/evaluator.cc
@@ -115,11 +115,7 @@
       // specialized instructions that use this value under this assumption.
       return Integer::null();
     }
-    const char* error_str = NULL;
-    result ^= result.CheckAndCanonicalize(thread, &error_str);
-    if (error_str != NULL) {
-      FATAL1("Failed to canonicalize: %s", error_str);
-    }
+    result ^= result.Canonicalize(thread);
   }
 
   return result.raw();
@@ -148,11 +144,7 @@
       return Integer::null();
     }
 
-    const char* error_str = NULL;
-    result ^= result.CheckAndCanonicalize(thread, &error_str);
-    if (error_str != NULL) {
-      FATAL1("Failed to canonicalize: %s", error_str);
-    }
+    result ^= result.Canonicalize(thread);
   }
 
   return result.raw();
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 4ba5bd6..05f8a8d 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -3109,7 +3109,7 @@
     if (new_dst_type.IsTypeRef()) {
       new_dst_type = TypeRef::Cast(new_dst_type).type();
     }
-    new_dst_type = new_dst_type.Canonicalize();
+    new_dst_type = new_dst_type.Canonicalize(Thread::Current(), nullptr);
 
     // Successfully instantiated destination type: update the type attached
     // to this instruction and set type arguments to null because we no
diff --git a/runtime/vm/compiler/backend/il_deserializer.cc b/runtime/vm/compiler/backend/il_deserializer.cc
index ca7bd32..f84b7e5 100644
--- a/runtime/vm/compiler/backend/il_deserializer.cc
+++ b/runtime/vm/compiler/backend/il_deserializer.cc
@@ -1529,16 +1529,11 @@
                                                  Object* out) {
   ASSERT(out != nullptr);
   if (!out->IsInstance()) return true;
-  const char* error_str = nullptr;
-  // CheckAndCanonicalize uses the current zone for the passed in thread,
+  // Instance::Canonicalize uses the current zone for the passed in thread,
   // not an explicitly provided zone. This means we cannot be run in a context
   // where [thread()->zone()] does not match [zone()] (e.g., due to StackZone)
   // until this is addressed.
-  *out = Instance::Cast(*out).CheckAndCanonicalize(thread(), &error_str);
-  if (error_str != nullptr) {
-    StoreError(sexp, "error during canonicalization: %s", error_str);
-    return false;
-  }
+  *out = Instance::Cast(*out).Canonicalize(thread());
   return true;
 }
 
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 99da0c4..e0d3ea9 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -1751,7 +1751,7 @@
           Type::Handle(Z, Type::New(cls, type_arguments,
                                     TokenPosition::kNoSource, nullability));
       type.SetIsFinalized();
-      return type.Canonicalize();
+      return type.Canonicalize(thread_, nullptr);
     }
     case kRecursiveGenericType: {
       const intptr_t id = reader_.ReadUInt();
@@ -1789,7 +1789,7 @@
         // as not all TypeRef objects are filled up at this point.
         return type.raw();
       }
-      return type.Canonicalize();
+      return type.Canonicalize(thread_, nullptr);
     }
     case kRecursiveTypeRef: {
       const intptr_t id = reader_.ReadUInt();
@@ -1937,7 +1937,7 @@
     ASSERT(pending_recursive_types_ != nullptr);
     return type_arguments.raw();
   }
-  return type_arguments.Canonicalize();
+  return type_arguments.Canonicalize(thread_, nullptr);
 }
 
 void BytecodeReaderHelper::ReadAttributes(const Object& key) {
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 243478f..981790a 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -278,7 +278,7 @@
       for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
         type_arguments.SetTypeAt(j, type_translator.BuildType());
       }
-      type_arguments = type_arguments.Canonicalize();
+      type_arguments = type_arguments.Canonicalize(Thread::Current(), nullptr);
       // Make a copy of the old closure, and set delayed type arguments.
       Closure& closure = Closure::Handle(Z, Closure::RawCast(constant.raw()));
       Function& function = Function::Handle(Z, closure.function());
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 7b22ac1..71ecb18 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -479,7 +479,7 @@
     }
     helper.Finish();
   }
-  default_types = default_types.Canonicalize();
+  default_types = default_types.Canonicalize(thread(), nullptr);
   parsed_function()->SetDefaultFunctionTypeArguments(default_types);
 }
 
@@ -3417,7 +3417,7 @@
       TypeArguments& canonicalized_type_arguments =
           TypeArguments::ZoneHandle(Z, type.arguments());
       canonicalized_type_arguments =
-          canonicalized_type_arguments.Canonicalize();
+          canonicalized_type_arguments.Canonicalize(thread(), nullptr);
       instructions += Constant(canonicalized_type_arguments);
     } else {
       const TypeArguments& type_arguments =
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5ff3f43..5944069 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -3371,7 +3371,7 @@
   // do not appear in the type arguments to a any Pointer classes in an FFI
   // signature.
   ASSERT(args.IsNull() || args.IsInstantiated());
-  args = args.Canonicalize();
+  args = args.Canonicalize(thread_, nullptr);
 
   Fragment code;
   code += Constant(args);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index da62873..22acd1c 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -340,12 +340,7 @@
 InstancePtr TranslationHelper::Canonicalize(const Instance& instance) {
   if (instance.IsNull()) return instance.raw();
 
-  const char* error_str = NULL;
-  InstancePtr result = instance.CheckAndCanonicalize(thread(), &error_str);
-  if (result == Object::null()) {
-    ReportError("Invalid const object %s", error_str);
-  }
-  return result;
+  return instance.Canonicalize(thread());
 }
 
 const String& TranslationHelper::DartString(const char* content,
@@ -3263,7 +3258,7 @@
     }
 
     if (finalize_) {
-      type_arguments = type_arguments.Canonicalize();
+      type_arguments = type_arguments.Canonicalize(Thread::Current(), nullptr);
     }
   }
   return type_arguments;
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 7044628..e9f8516a 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -192,7 +192,7 @@
   V(::, reachabilityFence, ReachabilityFence, 0xad39d0a6)                      \
   V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x78f44c3c)                          \
   V(_Future, timeout, FutureTimeout, 0x010f8ad4)                               \
-  V(Future, wait, FutureWait, 0x9a812df7)                                      \
+  V(Future, wait, FutureWait, 0x6c0c3295)                                      \
 
 // List of intrinsics:
 // (class-name, function-name, intrinsification method, fingerprint).
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index e8bcf03..d638bcf 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -2547,7 +2547,7 @@
   }
   const AbstractType& type =
       AbstractType::Handle(Instance::Cast(obj).GetType(Heap::kNew));
-  return Api::NewHandle(T, type.Canonicalize());
+  return Api::NewHandle(T, type.Canonicalize(T, nullptr));
 }
 
 DART_EXPORT Dart_Handle Dart_FunctionName(Dart_Handle function) {
@@ -4444,7 +4444,7 @@
       ASSERT(redirect_type.IsInstantiated(kFunctions));
       redirect_type ^= redirect_type.InstantiateFrom(
           type_arguments, Object::null_type_arguments(), kNoneFree, Heap::kNew);
-      redirect_type ^= redirect_type.Canonicalize();
+      redirect_type ^= redirect_type.Canonicalize(T, nullptr);
     }
 
     type_obj = redirect_type.raw();
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 96081a8..0cb0bd6 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -526,11 +526,7 @@
 
   // Share the immutable descriptor when possible by canonicalizing it.
   descriptor.MakeImmutable();
-  const char* error_str = NULL;
-  descriptor ^= descriptor.CheckAndCanonicalize(thread, &error_str);
-  if (error_str != NULL) {
-    FATAL1("Failed to canonicalize: %s", error_str);
-  }
+  descriptor ^= descriptor.Canonicalize(thread);
   ASSERT(!descriptor.IsNull());
   return descriptor.raw();
 }
@@ -584,11 +580,7 @@
   // Share the immutable descriptor when possible by canonicalizing it.
   descriptor.MakeImmutable();
   if (canonicalize) {
-    const char* error_str = NULL;
-    descriptor ^= descriptor.CheckAndCanonicalize(thread, &error_str);
-    if (error_str != NULL) {
-      FATAL1("Failed to canonicalize: %s", error_str);
-    }
+    descriptor ^= descriptor.Canonicalize(thread);
   }
   ASSERT(!descriptor.IsNull());
   return descriptor.raw();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index e835735..c9be18c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -550,6 +550,7 @@
     null_ = static_cast<InstancePtr>(address + kHeapObjectTag);
     // The call below is using 'null_' to initialize itself.
     InitializeObject(address, kNullCid, Instance::InstanceSize());
+    null_->ptr()->SetCanonical();
   }
 
   // Allocate and initialize the bool instances.
@@ -1740,7 +1741,7 @@
         Type::New(Class::Handle(zone, cls.raw()), TypeArguments::Handle(zone),
                   TokenPosition::kNoSource, Nullability::kNonNullable);
     type.SetIsFinalized();
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(thread, nullptr);
     object_store->set_array_type(type);
     type = type.ToNullability(Nullability::kLegacy, Heap::kOld);
     object_store->set_legacy_array_type(type);
@@ -2195,7 +2196,7 @@
     type = Type::New(cls, Object::null_type_arguments(),
                      TokenPosition::kNoSource, Nullability::kNullable);
     type.SetIsFinalized();
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(thread, nullptr);
     object_store->set_null_type(type);
     ASSERT(type.IsNullable());
 
@@ -2207,7 +2208,7 @@
     type = Type::New(cls, Object::null_type_arguments(),
                      TokenPosition::kNoSource, Nullability::kNonNullable);
     type.SetIsFinalized();
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(thread, nullptr);
     object_store->set_never_type(type);
 
     // Create and cache commonly used type arguments <int>, <double>,
@@ -2215,87 +2216,87 @@
     type_args = TypeArguments::New(1);
     type = object_store->int_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_int(type_args);
     type_args = TypeArguments::New(1);
     type = object_store->legacy_int_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_legacy_int(type_args);
     type_args = TypeArguments::New(1);
     type = object_store->non_nullable_int_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_non_nullable_int(type_args);
 
     type_args = TypeArguments::New(1);
     type = object_store->double_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_double(type_args);
     type_args = TypeArguments::New(1);
     type = object_store->legacy_double_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_legacy_double(type_args);
     type_args = TypeArguments::New(1);
     type = object_store->non_nullable_double_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_non_nullable_double(type_args);
 
     type_args = TypeArguments::New(1);
     type = object_store->string_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_string(type_args);
     type_args = TypeArguments::New(1);
     type = object_store->legacy_string_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_legacy_string(type_args);
     type_args = TypeArguments::New(1);
     type = object_store->non_nullable_string_type();
     type_args.SetTypeAt(0, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_non_nullable_string(type_args);
 
     type_args = TypeArguments::New(2);
     type = object_store->string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, Object::dynamic_type());
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_string_dynamic(type_args);
     type_args = TypeArguments::New(2);
     type = object_store->legacy_string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, Object::dynamic_type());
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_legacy_string_dynamic(type_args);
     type_args = TypeArguments::New(2);
     type = object_store->non_nullable_string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, Object::dynamic_type());
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_non_nullable_string_dynamic(type_args);
 
     type_args = TypeArguments::New(2);
     type = object_store->string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_string_string(type_args);
     type_args = TypeArguments::New(2);
     type = object_store->legacy_string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_legacy_string_legacy_string(type_args);
     type_args = TypeArguments::New(2);
     type = object_store->non_nullable_string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(thread, nullptr);
     object_store->set_type_argument_non_nullable_string_non_nullable_string(
         type_args);
 
@@ -2900,7 +2901,7 @@
     return;
   }
   StorePointer(&raw_ptr()->interfaces_, Object::empty_array().raw());
-  StorePointer(&raw_ptr()->constants_, Object::empty_array().raw());
+  StorePointer(&raw_ptr()->constants_, Object::null_array().raw());
   StorePointer(&raw_ptr()->functions_, Object::empty_array().raw());
   StorePointer(&raw_ptr()->fields_, Object::empty_array().raw());
   StorePointer(&raw_ptr()->invocation_dispatcher_cache_,
@@ -4992,7 +4993,6 @@
 }
 
 void Class::set_constants(const Array& value) const {
-  ASSERT(!value.IsNull());
   StorePointer(&raw_ptr()->constants_, value.raw());
 }
 
@@ -5654,7 +5654,7 @@
 // Returns an instance of Double or Double::null().
 DoublePtr Class::LookupCanonicalDouble(Zone* zone, double value) const {
   ASSERT(this->raw() == Isolate::Current()->object_store()->double_class());
-  if (this->constants() == Object::empty_array().raw()) return Double::null();
+  if (this->constants() == Array::null()) return Double::null();
 
   Double& canonical_value = Double::Handle(zone);
   CanonicalDoubleSet constants(zone, this->constants());
@@ -5666,7 +5666,7 @@
 // Returns an instance of Mint or Mint::null().
 MintPtr Class::LookupCanonicalMint(Zone* zone, int64_t value) const {
   ASSERT(this->raw() == Isolate::Current()->object_store()->mint_class());
-  if (this->constants() == Object::empty_array().raw()) return Mint::null();
+  if (this->constants() == Array::null()) return Mint::null();
 
   Mint& canonical_value = Mint::Handle(zone);
   CanonicalMintSet constants(zone, this->constants());
@@ -5727,7 +5727,7 @@
   ASSERT(this->raw() == value.clazz());
   ASSERT(is_finalized() || is_prefinalized());
   Instance& canonical_value = Instance::Handle(zone);
-  if (this->constants() != Object::empty_array().raw()) {
+  if (this->constants() != Array::null()) {
     CanonicalInstancesSet constants(zone, this->constants());
     canonical_value ^= constants.GetOrNull(CanonicalInstanceKey(value));
     this->set_constants(constants.Release());
@@ -5739,7 +5739,7 @@
                                            const Instance& constant) const {
   ASSERT(this->raw() == constant.clazz());
   Instance& canonical_value = Instance::Handle(zone);
-  if (this->constants() == Object::empty_array().raw()) {
+  if (this->constants() == Array::null()) {
     CanonicalInstancesSet constants(
         HashTables::New<CanonicalInstancesSet>(128, Heap::kOld));
     canonical_value ^= constants.InsertNewOrGet(CanonicalInstanceKey(constant));
@@ -5754,7 +5754,7 @@
 }
 
 void Class::InsertCanonicalDouble(Zone* zone, const Double& constant) const {
-  if (this->constants() == Object::empty_array().raw()) {
+  if (this->constants() == Array::null()) {
     this->set_constants(Array::Handle(
         zone, HashTables::New<CanonicalDoubleSet>(128, Heap::kOld)));
   }
@@ -5764,7 +5764,7 @@
 }
 
 void Class::InsertCanonicalMint(Zone* zone, const Mint& constant) const {
-  if (this->constants() == Object::empty_array().raw()) {
+  if (this->constants() == Array::null()) {
     this->set_constants(Array::Handle(
         zone, HashTables::New<CanonicalMintSet>(128, Heap::kOld)));
   }
@@ -5782,9 +5782,9 @@
   }
 
   const Array& old_constants = Array::Handle(zone, constants());
-  if (old_constants.Length() == 0) return;
+  if (old_constants.IsNull()) return;
 
-  set_constants(Object::empty_array());
+  set_constants(Object::null_array());
 
   CanonicalInstancesSet set(zone, old_constants.raw());
   Instance& constant = Instance::Handle(zone);
@@ -5915,7 +5915,7 @@
     type = IsNull() ? Type::DynamicType() : TypeAt(i - other_length);
     result.SetTypeAt(i, type);
   }
-  return result.Canonicalize();
+  return result.Canonicalize(Thread::Current(), nullptr);
 }
 
 TypeArgumentsPtr TypeArguments::ConcatenateTypeParameters(
@@ -6397,7 +6397,7 @@
   result = InstantiateFrom(instantiator_type_arguments, function_type_arguments,
                            kAllFree, Heap::kOld);
   // Canonicalize type arguments.
-  result = result.Canonicalize();
+  result = result.Canonicalize(thread, nullptr);
   // InstantiateAndCanonicalizeFrom is not reentrant. It cannot have been called
   // indirectly, so the prior_instantiations array cannot have grown.
   ASSERT(prior_instantiations.raw() == instantiations());
@@ -6476,7 +6476,8 @@
   StoreSmi(&raw_ptr()->length_, Smi::New(value));
 }
 
-TypeArgumentsPtr TypeArguments::Canonicalize(TrailPtr trail) const {
+TypeArgumentsPtr TypeArguments::Canonicalize(Thread* thread,
+                                             TrailPtr trail) const {
   if (IsNull() || IsCanonical()) {
     ASSERT(IsOld());
     return this->raw();
@@ -6485,7 +6486,6 @@
   if (IsRaw(0, num_types)) {
     return TypeArguments::null();
   }
-  Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   ObjectStore* object_store = isolate->object_store();
@@ -6502,7 +6502,7 @@
     AbstractType& type_arg = AbstractType::Handle(zone);
     for (intptr_t i = 0; i < num_types; i++) {
       type_arg = TypeAt(i);
-      type_arg = type_arg.Canonicalize(trail);
+      type_arg = type_arg.Canonicalize(thread, trail);
       if (IsCanonical()) {
         // Canonicalizing this type_arg canonicalized this type.
         ASSERT(IsRecursive());
@@ -18340,42 +18340,26 @@
 };
 #endif  // DEBUG
 
-bool Instance::CheckAndCanonicalizeFields(Thread* thread,
-                                          const char** error_str) const {
-  ASSERT(error_str != NULL);
-  ASSERT(*error_str == NULL);
+void Instance::CanonicalizeFieldsLocked(Thread* thread) const {
   const intptr_t class_id = GetClassId();
   if (class_id >= kNumPredefinedCids) {
     // Iterate over all fields, canonicalize numbers and strings, expect all
     // other instances to be canonical otherwise report error (return false).
     Zone* zone = thread->zone();
-    Object& obj = Object::Handle(zone);
+    Instance& obj = Instance::Handle(zone);
     const intptr_t instance_size = SizeFromClass();
     ASSERT(instance_size != 0);
     const auto unboxed_fields_bitmap =
         thread->isolate()->group()->shared_class_table()->GetUnboxedFieldsMapAt(
-            GetClassId());
+            class_id);
     for (intptr_t offset = Instance::NextFieldOffset(); offset < instance_size;
          offset += kWordSize) {
       if (unboxed_fields_bitmap.Get(offset / kWordSize)) {
         continue;
       }
-      obj = *this->FieldAddrAtOffset(offset);
-      if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
-        if (obj.IsNumber() || obj.IsString()) {
-          obj = Instance::Cast(obj).CheckAndCanonicalize(thread, error_str);
-          if (*error_str != NULL) {
-            return false;
-          }
-          ASSERT(!obj.IsNull());
-          this->SetFieldAtOffset(offset, obj);
-        } else {
-          char* chars = OS::SCreate(zone, "field: %s, owner: %s\n",
-                                    obj.ToCString(), ToCString());
-          *error_str = chars;
-          return false;
-        }
-      }
+      obj ^= *this->FieldAddrAtOffset(offset);
+      obj = obj.CanonicalizeLocked(thread);
+      this->SetFieldAtOffset(offset, obj);
     }
   } else {
 #if defined(DEBUG)
@@ -18385,45 +18369,40 @@
     ASSERT(!has_pointers.has_pointers());
 #endif  // DEBUG
   }
-  return true;
 }
 
 InstancePtr Instance::CopyShallowToOldSpace(Thread* thread) const {
   return Instance::RawCast(Object::Clone(*this, Heap::kOld));
 }
 
-InstancePtr Instance::CheckAndCanonicalize(Thread* thread,
-                                           const char** error_str) const {
-  ASSERT(error_str != NULL);
-  ASSERT(*error_str == NULL);
-  ASSERT(!IsNull());
+InstancePtr Instance::Canonicalize(Thread* thread) const {
+  SafepointMutexLocker ml(thread->isolate()->constant_canonicalization_mutex());
+  return CanonicalizeLocked(thread);
+}
+
+InstancePtr Instance::CanonicalizeLocked(Thread* thread) const {
   if (this->IsCanonical()) {
     return this->raw();
   }
-  if (!CheckAndCanonicalizeFields(thread, error_str)) {
-    return Instance::null();
-  }
+  ASSERT(!IsNull());
+  CanonicalizeFieldsLocked(thread);
   Zone* zone = thread->zone();
-  Isolate* isolate = thread->isolate();
-  Instance& result = Instance::Handle(zone);
   const Class& cls = Class::Handle(zone, this->clazz());
-  {
-    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
-    result = cls.LookupCanonicalInstance(zone, *this);
-    if (!result.IsNull()) {
-      return result.raw();
-    }
-    if (IsNew()) {
-      ASSERT((isolate == Dart::vm_isolate()) || !InVMIsolateHeap());
-      // Create a canonical object in old space.
-      result ^= Object::Clone(*this, Heap::kOld);
-    } else {
-      result = this->raw();
-    }
-    ASSERT(result.IsOld());
-    result.SetCanonical();
-    return cls.InsertCanonicalConstant(zone, result);
+  Instance& result =
+      Instance::Handle(zone, cls.LookupCanonicalInstance(zone, *this));
+  if (!result.IsNull()) {
+    return result.raw();
   }
+  if (IsNew()) {
+    ASSERT((thread->isolate() == Dart::vm_isolate()) || !InVMIsolateHeap());
+    // Create a canonical object in old space.
+    result ^= Object::Clone(*this, Heap::kOld);
+  } else {
+    result = this->raw();
+  }
+  ASSERT(result.IsOld());
+  result.SetCanonical();
+  return cls.InsertCanonicalConstant(zone, result);
 }
 
 #if defined(DEBUG)
@@ -18497,7 +18476,9 @@
   if (IsNull()) {
     return Type::NullType();
   }
-  const Class& cls = Class::Handle(clazz());
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Class& cls = Class::Handle(zone, clazz());
   if (!cls.is_finalized()) {
     // Various predefined classes can be instantiated by the VM or
     // Dart_NewString/Integer/TypedData/... before the class is finalized.
@@ -18505,29 +18486,28 @@
     cls.EnsureDeclarationLoaded();
   }
   if (cls.IsClosureClass()) {
-    Function& signature =
-        Function::Handle(Closure::Cast(*this).GetInstantiatedSignature(
-            Thread::Current()->zone()));
-    Type& type = Type::Handle(signature.SignatureType());
+    Function& signature = Function::Handle(
+        zone, Closure::Cast(*this).GetInstantiatedSignature(zone));
+    Type& type = Type::Handle(zone, signature.SignatureType());
     if (!type.IsFinalized()) {
       type.SetIsFinalized();
     }
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(thread, nullptr);
     return type.raw();
   }
-  Type& type = Type::Handle();
+  Type& type = Type::Handle(zone);
   if (!cls.IsGeneric()) {
     type = cls.DeclarationType();
   }
   if (type.IsNull()) {
-    TypeArguments& type_arguments = TypeArguments::Handle();
+    TypeArguments& type_arguments = TypeArguments::Handle(zone);
     if (cls.NumTypeArguments() > 0) {
       type_arguments = GetTypeArguments();
     }
     type = Type::New(cls, type_arguments, TokenPosition::kNoSource,
                      Nullability::kNonNullable, space);
     type.SetIsFinalized();
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(thread, nullptr);
   }
   return type.raw();
 }
@@ -19155,7 +19135,8 @@
   return NULL;
 }
 
-AbstractTypePtr AbstractType::Canonicalize(TrailPtr trail) const {
+AbstractTypePtr AbstractType::Canonicalize(Thread* thread,
+                                           TrailPtr trail) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return NULL;
@@ -19808,7 +19789,7 @@
                      Object::null_type_arguments(), TokenPosition::kNoSource,
                      Nullability::kNonNullable);
     type.SetIsFinalized();
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(Thread::Current(), nullptr);
     type_class.set_declaration_type(type);
   }
   ASSERT(type.IsFinalized());
@@ -19862,7 +19843,7 @@
   if (IsCanonical()) {
     // Object::Clone does not clone canonical bit.
     ASSERT(!type.IsCanonical());
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(Thread::Current(), nullptr);
   }
   return type.raw();
 }
@@ -20193,13 +20174,12 @@
   return nullability() == Nullability::kNonNullable;
 }
 
-AbstractTypePtr Type::Canonicalize(TrailPtr trail) const {
+AbstractTypePtr Type::Canonicalize(Thread* thread, TrailPtr trail) const {
   ASSERT(IsFinalized());
   if (IsCanonical()) {
     ASSERT(TypeArguments::Handle(arguments()).IsOld());
     return this->raw();
   }
-  Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
 
@@ -20226,7 +20206,7 @@
              (isolate == Dart::vm_isolate()));
       // Canonicalize the type arguments of the supertype, if any.
       TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
-      type_args = type_args.Canonicalize(trail);
+      type_args = type_args.Canonicalize(thread, trail);
       if (IsCanonical()) {
         // Canonicalizing type_args canonicalized this type.
         ASSERT(IsRecursive());
@@ -20292,7 +20272,7 @@
         SetHash(0);  // Flush cached hash value.
       }
     }
-    type_args = type_args.Canonicalize(trail);
+    type_args = type_args.Canonicalize(thread, trail);
     if (IsCanonical()) {
       // Canonicalizing type_args canonicalized this type as a side effect.
       ASSERT(IsRecursive());
@@ -20619,7 +20599,7 @@
 // Consider the type Derived, where class Derived extends Base<Derived>.
 // The first type argument of its flattened type argument vector is Derived,
 // represented by a TypeRef pointing to itself.
-AbstractTypePtr TypeRef::Canonicalize(TrailPtr trail) const {
+AbstractTypePtr TypeRef::Canonicalize(Thread* thread, TrailPtr trail) const {
   if (TestAndAddToTrail(&trail)) {
     return raw();
   }
@@ -20627,7 +20607,7 @@
   // referenced recursive type.
   AbstractType& ref_type = AbstractType::Handle(type());
   ASSERT(!ref_type.IsNull());
-  ref_type = ref_type.Canonicalize(trail);
+  ref_type = ref_type.Canonicalize(thread, trail);
   set_type(ref_type);
   return raw();
 }
@@ -20735,7 +20715,7 @@
     // Object::Clone does not clone canonical bit.
     ASSERT(!type_parameter.IsCanonical());
     if (IsFinalized()) {
-      type_parameter ^= type_parameter.Canonicalize();
+      type_parameter ^= type_parameter.Canonicalize(Thread::Current(), nullptr);
     }
   }
   return type_parameter.raw();
@@ -20955,12 +20935,12 @@
   return result.NormalizeFutureOrType(space);
 }
 
-AbstractTypePtr TypeParameter::Canonicalize(TrailPtr trail) const {
+AbstractTypePtr TypeParameter::Canonicalize(Thread* thread,
+                                            TrailPtr trail) const {
   ASSERT(IsFinalized());
   if (IsCanonical()) {
     return this->raw();
   }
-  Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
 
@@ -21159,16 +21139,15 @@
   return printer.buffer();
 }
 
-InstancePtr Number::CheckAndCanonicalize(Thread* thread,
-                                         const char** error_str) const {
+InstancePtr Number::CanonicalizeLocked(Thread* thread) const {
   intptr_t cid = GetClassId();
   switch (cid) {
     case kSmiCid:
       return static_cast<SmiPtr>(raw_value());
     case kMintCid:
-      return Mint::NewCanonical(Mint::Cast(*this).value());
+      return Mint::NewCanonicalLocked(thread, Mint::Cast(*this).value());
     case kDoubleCid:
-      return Double::NewCanonical(Double::Cast(*this).value());
+      return Double::NewCanonicalLocked(thread, Double::Cast(*this).value());
     default:
       UNREACHABLE();
   }
@@ -21541,33 +21520,28 @@
 }
 
 MintPtr Mint::NewCanonical(int64_t value) {
+  Thread* thread = Thread::Current();
+  SafepointMutexLocker ml(thread->isolate()->constant_canonicalization_mutex());
+  return NewCanonicalLocked(thread, value);
+}
+
+MintPtr Mint::NewCanonicalLocked(Thread* thread, int64_t value) {
   // Do not allocate a Mint if Smi would do.
   ASSERT(!Smi::IsValid(value));
-  Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   const Class& cls = Class::Handle(zone, isolate->object_store()->mint_class());
-  Mint& canonical_value = Mint::Handle(zone);
-  canonical_value = cls.LookupCanonicalMint(zone, value);
+  Mint& canonical_value =
+      Mint::Handle(zone, cls.LookupCanonicalMint(zone, value));
   if (!canonical_value.IsNull()) {
     return canonical_value.raw();
   }
-  {
-    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
-    // Retry lookup.
-    {
-      canonical_value = cls.LookupCanonicalMint(zone, value);
-      if (!canonical_value.IsNull()) {
-        return canonical_value.raw();
-      }
-    }
-    canonical_value = Mint::New(value, Heap::kOld);
-    canonical_value.SetCanonical();
-    // The value needs to be added to the constants list. Grow the list if
-    // it is full.
-    cls.InsertCanonicalMint(zone, canonical_value);
-    return canonical_value.raw();
-  }
+  canonical_value = Mint::New(value, Heap::kOld);
+  canonical_value.SetCanonical();
+  // The value needs to be added to the constants list. Grow the list if
+  // it is full.
+  cls.InsertCanonicalMint(zone, canonical_value);
+  return canonical_value.raw();
 }
 
 bool Mint::Equals(const Instance& other) const {
@@ -21674,32 +21648,27 @@
 
 DoublePtr Double::NewCanonical(double value) {
   Thread* thread = Thread::Current();
+  SafepointMutexLocker ml(thread->isolate()->constant_canonicalization_mutex());
+  return NewCanonicalLocked(thread, value);
+}
+
+DoublePtr Double::NewCanonicalLocked(Thread* thread, double value) {
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
-  const Class& cls = Class::Handle(isolate->object_store()->double_class());
+  const Class& cls =
+      Class::Handle(zone, isolate->object_store()->double_class());
   // Linear search to see whether this value is already present in the
   // list of canonicalized constants.
-  Double& canonical_value = Double::Handle(zone);
-
-  canonical_value = cls.LookupCanonicalDouble(zone, value);
+  Double& canonical_value =
+      Double::Handle(zone, cls.LookupCanonicalDouble(zone, value));
   if (!canonical_value.IsNull()) {
     return canonical_value.raw();
   }
-  {
-    SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
-    // Retry lookup.
-    {
-      canonical_value = cls.LookupCanonicalDouble(zone, value);
-      if (!canonical_value.IsNull()) {
-        return canonical_value.raw();
-      }
-    }
-    canonical_value = Double::New(value, Heap::kOld);
-    canonical_value.SetCanonical();
-    // The value needs to be added to the constants list.
-    cls.InsertCanonicalDouble(zone, canonical_value);
-    return canonical_value.raw();
-  }
+  canonical_value = Double::New(value, Heap::kOld);
+  canonical_value.SetCanonical();
+  // The value needs to be added to the constants list.
+  cls.InsertCanonicalDouble(zone, canonical_value);
+  return canonical_value.raw();
 }
 
 DoublePtr Double::NewCanonical(const String& str) {
@@ -21998,8 +21967,7 @@
   return true;
 }
 
-InstancePtr String::CheckAndCanonicalize(Thread* thread,
-                                         const char** error_str) const {
+InstancePtr String::CanonicalizeLocked(Thread* thread) const {
   if (IsCanonical()) {
     return this->raw();
   }
@@ -23273,7 +23241,7 @@
   if (!element_type.IsDynamicType()) {
     TypeArguments& type_args = TypeArguments::Handle(TypeArguments::New(1));
     type_args.SetTypeAt(0, element_type);
-    type_args = type_args.Canonicalize();
+    type_args = type_args.Canonicalize(Thread::Current(), nullptr);
     result.SetTypeArguments(type_args);
   }
   return result.raw();
@@ -23434,36 +23402,17 @@
   return array.raw();
 }
 
-bool Array::CheckAndCanonicalizeFields(Thread* thread,
-                                       const char** error_str) const {
-  ASSERT(error_str != NULL);
-  ASSERT(*error_str == NULL);
+void Array::CanonicalizeFieldsLocked(Thread* thread) const {
   intptr_t len = Length();
   if (len > 0) {
     Zone* zone = thread->zone();
-    Object& obj = Object::Handle(zone);
-    // Iterate over all elements, canonicalize numbers and strings, expect all
-    // other instances to be canonical otherwise report error (return false).
+    Instance& obj = Instance::Handle(zone);
     for (intptr_t i = 0; i < len; i++) {
-      obj = At(i);
-      if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
-        if (obj.IsNumber() || obj.IsString()) {
-          obj = Instance::Cast(obj).CheckAndCanonicalize(thread, error_str);
-          if (*error_str != NULL) {
-            return false;
-          }
-          ASSERT(!obj.IsNull());
-          this->SetAt(i, obj);
-        } else {
-          char* chars = OS::SCreate(zone, "element at index %" Pd ": %s\n", i,
-                                    obj.ToCString());
-          *error_str = chars;
-          return false;
-        }
-      }
+      obj ^= At(i);
+      obj = obj.CanonicalizeLocked(thread);
+      this->SetAt(i, obj);
     }
   }
-  return true;
 }
 
 ImmutableArrayPtr ImmutableArray::New(intptr_t len, Heap::Space space) {
@@ -24035,7 +23984,7 @@
   TypeArguments& type_args = TypeArguments::Handle(zone);
   type_args = TypeArguments::New(1);
   type_args.SetTypeAt(Pointer::kNativeTypeArgPos, type_arg);
-  type_args = type_args.Canonicalize();
+  type_args = type_args.Canonicalize(thread, nullptr);
 
   const Class& cls =
       Class::Handle(Isolate::Current()->class_table()->At(kFfiPointerCid));
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 5084dff..38e8461 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -7348,17 +7348,10 @@
     return (clazz()->ptr()->host_instance_size_in_words_ * kWordSize);
   }
 
-  // Returns Instance::null() if instance cannot be canonicalized.
-  // Any non-canonical number of string will be canonicalized here.
-  // An instance cannot be canonicalized if it still contains non-canonical
-  // instances in its fields.
-  // Returns error in error_str, pass NULL if an error cannot occur.
-  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
-                                           const char** error_str) const;
-
-  // Returns true if all fields are OK for canonicalization.
-  virtual bool CheckAndCanonicalizeFields(Thread* thread,
-                                          const char** error_str) const;
+  InstancePtr Canonicalize(Thread* thread) const;
+  // Caller must hold Isolate::constant_canonicalization_mutex_.
+  virtual InstancePtr CanonicalizeLocked(Thread* thread) const;
+  virtual void CanonicalizeFieldsLocked(Thread* thread) const;
 
   InstancePtr CopyShallowToOldSpace(Thread* thread) const;
 
@@ -7729,13 +7722,13 @@
   // Return true if this vector contains a recursive type argument.
   bool IsRecursive() const;
 
-  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
-                                           const char** error_str) const {
-    return Canonicalize();
+  // Caller must hold Isolate::constant_canonicalization_mutex_.
+  virtual InstancePtr CanonicalizeLocked(Thread* thread) const {
+    return Canonicalize(thread, nullptr);
   }
 
   // Canonicalize only if instantiated, otherwise returns 'this'.
-  TypeArgumentsPtr Canonicalize(TrailPtr trail = nullptr) const;
+  TypeArgumentsPtr Canonicalize(Thread* thread, TrailPtr trail = nullptr) const;
 
   // Add the class name and URI of each type argument of this vector to the uris
   // list and mark ambiguous triplets to be printed.
@@ -7922,13 +7915,13 @@
       Heap::Space space,
       TrailPtr trail = nullptr) const;
 
-  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
-                                           const char** error_str) const {
-    return Canonicalize();
+  // Caller must hold Isolate::constant_canonicalization_mutex_.
+  virtual InstancePtr CanonicalizeLocked(Thread* thread) const {
+    return Canonicalize(thread, nullptr);
   }
 
   // Return the canonical version of this type.
-  virtual AbstractTypePtr Canonicalize(TrailPtr trail = nullptr) const;
+  virtual AbstractTypePtr Canonicalize(Thread* thread, TrailPtr trail) const;
 
 #if defined(DEBUG)
   // Check if abstract type is canonical.
@@ -8185,7 +8178,7 @@
       intptr_t num_free_fun_type_params,
       Heap::Space space,
       TrailPtr trail = nullptr) const;
-  virtual AbstractTypePtr Canonicalize(TrailPtr trail = nullptr) const;
+  virtual AbstractTypePtr Canonicalize(Thread* thread, TrailPtr trail) const;
 #if defined(DEBUG)
   // Check if type is canonical.
   virtual bool CheckIsCanonical(Thread* thread) const;
@@ -8342,7 +8335,7 @@
       intptr_t num_free_fun_type_params,
       Heap::Space space,
       TrailPtr trail = nullptr) const;
-  virtual AbstractTypePtr Canonicalize(TrailPtr trail = nullptr) const;
+  virtual AbstractTypePtr Canonicalize(Thread* thread, TrailPtr trail) const;
 #if defined(DEBUG)
   // Check if typeref is canonical.
   virtual bool CheckIsCanonical(Thread* thread) const;
@@ -8434,7 +8427,7 @@
       intptr_t num_free_fun_type_params,
       Heap::Space space,
       TrailPtr trail = nullptr) const;
-  virtual AbstractTypePtr Canonicalize(TrailPtr trail = nullptr) const;
+  virtual AbstractTypePtr Canonicalize(Thread* thread, TrailPtr trail) const;
 #if defined(DEBUG)
   // Check if type parameter is canonical.
   virtual bool CheckIsCanonical(Thread* thread) const;
@@ -8489,8 +8482,8 @@
   StringPtr ToString(Heap::Space space) const;
 
   // Numbers are canonicalized differently from other instances/strings.
-  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
-                                           const char** error_str) const;
+  // Caller must hold Isolate::constant_canonicalization_mutex_.
+  virtual InstancePtr CanonicalizeLocked(Thread* thread) const;
 
 #if defined(DEBUG)
   // Check if number is canonical.
@@ -8695,6 +8688,7 @@
   static MintPtr New(int64_t value, Heap::Space space = Heap::kNew);
 
   static MintPtr NewCanonical(int64_t value);
+  static MintPtr NewCanonicalLocked(Thread* thread, int64_t value);
 
  private:
   void set_value(int64_t value) const;
@@ -8721,6 +8715,7 @@
 
   // Returns a canonical double object allocated in the old gen space.
   static DoublePtr NewCanonical(double d);
+  static DoublePtr NewCanonicalLocked(Thread* thread, double d);
 
   // Returns a canonical double object (allocated in the old gen space) or
   // Double::null() if str points to a string that does not convert to a
@@ -8879,8 +8874,8 @@
   bool EndsWith(const String& other) const;
 
   // Strings are canonicalized using the symbol table.
-  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
-                                           const char** error_str) const;
+  // Caller must hold Isolate::constant_canonicalization_mutex_.
+  virtual InstancePtr CanonicalizeLocked(Thread* thread) const;
 
 #if defined(DEBUG)
   // Check if string is canonical.
@@ -9714,9 +9709,7 @@
                                  (len * kBytesPerElement));
   }
 
-  // Returns true if all elements are OK for canonicalization.
-  virtual bool CheckAndCanonicalizeFields(Thread* thread,
-                                          const char** error_str) const;
+  virtual void CanonicalizeFieldsLocked(Thread* thread) const;
 
   // Make the array immutable to Dart code by switching the class pointer
   // to ImmutableArray.
@@ -9891,8 +9884,7 @@
   }
 
   // We don't expect a growable object array to be canonicalized.
-  virtual InstancePtr CheckAndCanonicalize(Thread* thread,
-                                           const char** error_str) const {
+  virtual InstancePtr CanonicalizeLocked(Thread* thread) const {
     UNREACHABLE();
     return Instance::null();
   }
@@ -10693,10 +10685,8 @@
   }
 
   // Returns true if all elements are OK for canonicalization.
-  virtual bool CheckAndCanonicalizeFields(Thread* thread,
-                                          const char** error_str) const {
+  virtual void CanonicalizeFieldsLocked(Thread* thread) const {
     // None of the fields of a closure are instances.
-    return true;
   }
   virtual uint32_t CanonicalizeHash() const {
     return Function::Handle(function()).Hash();
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 847d1a4..7cde5c3 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -296,7 +296,7 @@
   {
     // Class has no canonical constants allocated.
     const Array& my_constants = Array::Handle(constants());
-    ASSERT(my_constants.Length() == 0);
+    ASSERT(my_constants.IsNull() || my_constants.Length() == 0);
   }
 #endif  // defined(DEBUG).
   // Copy old constants into new class.
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 37b39ac..103f4e8 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -378,7 +378,7 @@
     type = Type::New(cls, type_args, TokenPosition::kNoSource,
                      Nullability::kNonNullable);
     type.SetIsFinalized();
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(thread, nullptr);
     set_non_nullable_future_never_type(type);
     type = null_type();
     ASSERT(!type.IsNull());
@@ -387,7 +387,7 @@
     type = Type::New(cls, type_args, TokenPosition::kNoSource,
                      Nullability::kNullable);
     type.SetIsFinalized();
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(thread, nullptr);
     set_nullable_future_null_type(type);
     type ^= cls.RareType();
     set_non_nullable_future_rare_type(type);
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index e1118e2..060f484 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -251,8 +251,8 @@
   OS::PrintErr("2: %s\n", type_arguments2.ToCString());
   EXPECT(type_arguments1.Equals(type_arguments2));
   TypeArguments& type_arguments3 = TypeArguments::Handle();
-  type_arguments1.Canonicalize();
-  type_arguments3 ^= type_arguments2.Canonicalize();
+  type_arguments1.Canonicalize(thread, nullptr);
+  type_arguments3 ^= type_arguments2.Canonicalize(thread, nullptr);
   EXPECT_EQ(type_arguments1.raw(), type_arguments3.raw());
 }
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 36deccf..83e457d 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -110,7 +110,7 @@
   type.SetTypeTestingStub(code);
 
   if (is_canonical) {
-    type ^= type.Canonicalize();
+    type ^= type.Canonicalize(Thread::Current(), nullptr);
   }
 
   return type.raw();
@@ -262,7 +262,7 @@
   type_parameter.SetTypeTestingStub(code);
 
   if (is_canonical) {
-    type_parameter ^= type_parameter.Canonicalize();
+    type_parameter ^= type_parameter.Canonicalize(Thread::Current(), nullptr);
   }
 
   return type_parameter.raw();
@@ -333,7 +333,7 @@
 
   // Set the canonical bit.
   if (is_canonical) {
-    type_arguments = type_arguments.Canonicalize();
+    type_arguments = type_arguments.Canonicalize(Thread::Current(), nullptr);
   }
 
   return type_arguments.raw();
@@ -718,11 +718,7 @@
   Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
   obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(), Heap::kNew);
   if (ObjectLayout::IsCanonical(tags)) {
-    const char* error_str = NULL;
-    obj = obj.CheckAndCanonicalize(reader->thread(), &error_str);
-    if (error_str != NULL) {
-      FATAL1("Failed to canonicalize: %s", error_str);
-    }
+    obj = obj.Canonicalize(reader->thread());
   }
   reader->AddBackRef(object_id, &obj, kIsDeserialized);
 
@@ -1042,11 +1038,7 @@
     // Read all the individual elements for inlined objects.
     reader->ArrayReadFrom(object_id, *array, len, tags);
     if (ObjectLayout::IsCanonical(tags)) {
-      const char* error_str = NULL;
-      *array ^= array->CheckAndCanonicalize(reader->thread(), &error_str);
-      if (error_str != NULL) {
-        FATAL1("Failed to canonicalize: %s", error_str);
-      }
+      *array ^= array->Canonicalize(reader->thread());
     }
   }
   return raw(*array);
@@ -1355,11 +1347,7 @@
   // When reading a script snapshot or a message snapshot we always have
   // to canonicalize the object.
   if (ObjectLayout::IsCanonical(tags)) {
-    const char* error_str = NULL;
-    result ^= result.CheckAndCanonicalize(reader->thread(), &error_str);
-    if (error_str != NULL) {
-      FATAL1("Failed to canonicalize: %s", error_str);
-    }
+    result ^= result.Canonicalize(reader->thread());
     ASSERT(!result.IsNull());
     ASSERT(result.IsCanonical());
   }
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index c8a05fa..9403472 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -676,11 +676,7 @@
       offset += kWordSize;
     }
     if (ObjectLayout::IsCanonical(tags)) {
-      const char* error_str = NULL;
-      *result = result->CheckAndCanonicalize(thread(), &error_str);
-      if (error_str != NULL) {
-        FATAL1("Failed to canonicalize %s\n", error_str);
-      }
+      *result = result->Canonicalize(thread());
       ASSERT(!result->IsNull());
     }
   }
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 90b40a3..60328d7 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -644,7 +644,7 @@
             AbstractType::Handle(TypeRef::Cast(type_).type()).IsCanonical()));
   }
   *instantiated_type_arguments =
-      instantiated_type_arguments->Canonicalize(NULL);
+      instantiated_type_arguments->Canonicalize(Thread::Current(), nullptr);
   return *instantiated_type_arguments;
 }
 
@@ -687,7 +687,7 @@
     *to_type_arguments = from.arguments();
     to->set_arguments(InstantiateTypeArguments(klass_, *to_type_arguments));
     to->SetIsFinalized();
-    *to ^= to->Canonicalize(NULL);
+    *to ^= to->Canonicalize(Thread::Current(), nullptr);
 
     return to->raw();
   }
diff --git a/runtime/vm/type_testing_stubs_test.cc b/runtime/vm/type_testing_stubs_test.cc
index f260b3f..c035bdf 100644
--- a/runtime/vm/type_testing_stubs_test.cc
+++ b/runtime/vm/type_testing_stubs_test.cc
@@ -24,7 +24,7 @@
 }
 
 static void CanonicalizeTAV(TypeArguments* tav) {
-  *tav = tav->Canonicalize();
+  *tav = tav->Canonicalize(Thread::Current(), nullptr);
 }
 
 static void RunTTSTest(
diff --git a/tests/language/await/null_aware_test.dart b/tests/language/await/null_aware_test.dart
index 819de12..88f16f0 100644
--- a/tests/language/await/null_aware_test.dart
+++ b/tests/language/await/null_aware_test.dart
@@ -13,11 +13,11 @@
 }
 
 main() async {
-  int? x = 1;
+  var x = 1 as int?;
   x ??= await f();
   Expect.equals(1, x);
 
-  int? y = 1;
+  var y = 1 as int?;
   y = y ?? await f();
   Expect.equals(1, y);
 }
diff --git a/tests/language/extension_methods/static_extension_resolution_7_test.dart b/tests/language/extension_methods/static_extension_resolution_7_test.dart
new file mode 100644
index 0000000..96c1712
--- /dev/null
+++ b/tests/language/extension_methods/static_extension_resolution_7_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2020, 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.
+
+import "package:expect/expect.dart";
+
+// Tests the resolution of a bare type variable with bounded or promoted type.
+
+extension E<T> on T {
+  T Function(T) get f => (_) => this;
+}
+
+class A<S extends num> {
+  void testBoundedTypeVariable(S s) {
+    // Check that `num` has no `f` so E is applicable, then bind `T` to `S`.
+    S Function(S) f = s.f;
+  }
+
+  void testPromotedTypeVariable(S s) {
+    if (s is int) {
+      // Check that `int` has no `f`, erase `S & int` to `S`, bind `T` to `S`.
+      S Function(S) f = s.f;
+    }
+  }
+}
+
+class B<S extends dynamic> {
+  void testBoundedTypeVariable(S s) {
+    // `dynamic` considered to have `f`, E not applicable, dynamic invocation.
+    Expect.throws(() => s.f);
+  }
+
+  void testPromotedType(S s) {
+    if (s is int) {
+      // Check that `int` has no `f`, bind `T` to `int`.
+      int Function(int) f = s.f;
+    }
+  }
+}
+
+class C<S> {
+  void testBoundedTypeVariable(S s) {
+    // Check that `Object?` has no `f` so E is applicable, then bind `T` to `S`.
+    S Function(S) f = s.f;
+  }
+
+  void testPromotedType(S s) {
+    if (s is int) {
+      // Check that `int` has no `f`, bind `T` to `S`.
+      S Function(S) f = s.f;
+    }
+  }
+}
+
+void main() {
+  A<int>()
+    ..testBoundedTypeVariable(1)
+    ..testPromotedTypeVariable(2);
+  B<int>()
+    ..testBoundedTypeVariable(1)
+    ..testPromotedType(2);
+  C<int>()
+    ..testBoundedTypeVariable(1)
+    ..testPromotedType(2);
+}
diff --git a/tests/language/if_null/assignment_static_test.dart b/tests/language/if_null/assignment_static_test.dart
index 14edd3c..7eee56b 100644
--- a/tests/language/if_null/assignment_static_test.dart
+++ b/tests/language/if_null/assignment_static_test.dart
@@ -141,7 +141,7 @@
   // The static type of e1?.v op= e2 is the static type of e1.v op e2,
   // therefore the static type of e1?.v ??= e2 is the static type of
   // e1.v ?? e2, which is the LUB of NonNull(typeof(e1?.v)) and typeof(e2).
-  ClassWithInstanceGetters? c = new ClassWithInstanceGetters();
+  var c = new ClassWithInstanceGetters() as ClassWithInstanceGetters?;
   (c?.a ??= theA)!.a; //# 36: ok
   (c?.a ??= theA)!.b; //# 37: compile-time error
   (c?.a ??= theB)!.a; //# 38: ok
diff --git a/tests/language/if_null/behavior_test.dart b/tests/language/if_null/behavior_test.dart
index a679108..a55d7f5 100644
--- a/tests/language/if_null/behavior_test.dart
+++ b/tests/language/if_null/behavior_test.dart
@@ -32,8 +32,8 @@
 C? nullC() => null;
 
 main() {
-  int? one = 1;
-  B? b = B('B');
+  var one = 1 as int?;
+  var b = B('B') as B?;
   Expect.equals(1, one ?? 2);
   Expect.equals(1, one ?? null);
   Expect.equals(2, null ?? 2);
diff --git a/tests/language/if_null/evaluation_order_test.dart b/tests/language/if_null/evaluation_order_test.dart
index ca78ab4..c4da142 100644
--- a/tests/language/if_null/evaluation_order_test.dart
+++ b/tests/language/if_null/evaluation_order_test.dart
@@ -27,7 +27,7 @@
 }
 
 main() {
-  int? one = 1;
+  var one = 1 as int?;
   Expect.equals(1, one ?? bad());
   Expect.equals(2, first() ?? second());
 }
diff --git a/tests/language/implicit_downcast_during/if_null_assignment_test.dart b/tests/language/implicit_downcast_during/if_null_assignment_test.dart
index 7c91b32..c29d634 100644
--- a/tests/language/implicit_downcast_during/if_null_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/if_null_assignment_test.dart
@@ -8,7 +8,7 @@
 
 void main() {
   B? b;
-  A? a = new B();
+  var a = new B() as A?;
   b ??= a;
 //      ^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
diff --git a/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart b/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart
index 535c7db..59c115e 100644
--- a/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart
+++ b/tests/language/implicit_downcast_during/null_aware_method_invocation_test.dart
@@ -11,7 +11,7 @@
 }
 
 main() {
-  C? c = new C();
+  var c = new C() as C?;
   A a = new B();
   c?.f(a);
 //     ^
diff --git a/tests/language/nnbd/definite_assignment/read_error_test.dart b/tests/language/nnbd/definite_assignment/read_error_test.dart
index 0894e58..2747df3 100644
--- a/tests/language/nnbd/definite_assignment/read_error_test.dart
+++ b/tests/language/nnbd/definite_assignment/read_error_test.dart
@@ -1024,6 +1024,7 @@
     x++;
 //  ^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
+// [cfe] Final variable 'x' might already be assigned at this point.
   }
 
   {
@@ -1032,6 +1033,7 @@
     ++x;
 //    ^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
+// [cfe] Final variable 'x' might already be assigned at this point.
   }
 
   {
@@ -1046,6 +1048,7 @@
     x += 3;
 //  ^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
+// [cfe] Final variable 'x' might already be assigned at this point.
   }
 
   {
@@ -1054,6 +1057,7 @@
     x ??= 3;
 //  ^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
+// [cfe] Final variable 'x' might already be assigned at this point.
   }
 
   {
diff --git a/tests/language/nnbd/inference/variable_initialization_promotion_test.dart b/tests/language/nnbd/inference/variable_initialization_promotion_test.dart
index 634caaa..78d947a 100644
--- a/tests/language/nnbd/inference/variable_initialization_promotion_test.dart
+++ b/tests/language/nnbd/inference/variable_initialization_promotion_test.dart
@@ -271,7 +271,7 @@
 /// Check that when an initializer is a promoted type variable `X & T`, the
 /// inferred type of the variable is `X`, but that the variable is immediately
 /// promoted to `X & T`.
-void typeVariableTypedVariableInferencePromotes<T>(T x0, T x1) {
+void typeVariableTypedVariableInferencePromotes<T>(T x0, T x1, bool b) {
   if (x0 is num) {
     // Promote `x0` to T & num
 
@@ -282,8 +282,9 @@
       // Check that y is assignable to z, and hence that y is still promoted to
       // T & num
       num z = y;
-      // Check that y can be demoted to T.
-      y = x1;
+      // Check that y can be demoted to T, but do it conditionally so that T &
+      // num remains a type of interest.
+      if (b) y = x1;
       // T & num is still a type of interest, and hence this assignment should
       // promote to T & num.
       y = x0;
@@ -299,8 +300,9 @@
       // Check that y is assignable to z, and hence that y is still promoted to
       // T & num
       num z = y;
-      // Check that y can be demoted to T.
-      y = x1;
+      // Check that y can be demoted to T, but do it conditionally so that T &
+      // num remains a type of interest.
+      if (b) y = x1;
       // T & num is still a type of interest, and hence this assignment should
       // promote to T & num.
       y = x0;
@@ -334,5 +336,5 @@
   inferredTypeIsATypeOfInterest();
   initializersOnVarPromote();
   initializersOnFinalDoNotPromote();
-  typeVariableTypedVariableInferencePromotes<num>(3, 3.5);
+  typeVariableTypedVariableInferencePromotes<num>(3, 3.5, true);
 }
diff --git a/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart b/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart
index 4366065..a2a8182 100644
--- a/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart
+++ b/tests/language/nnbd/static_errors/super_equals_disallows_non_matching_type_error_test.dart
@@ -24,7 +24,7 @@
 class Derived extends Base {
   void test() {
     String string = 'foo';
-    String? stringQuestion = 'foo';
+    var stringQuestion = 'foo' as String?;
     super == string;
     //       ^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/nnbd/syntax/class_member_declarations_test.dart b/tests/language/nnbd/syntax/class_member_declarations_test.dart
index 3aa7d26..a6c8efd 100644
--- a/tests/language/nnbd/syntax/class_member_declarations_test.dart
+++ b/tests/language/nnbd/syntax/class_member_declarations_test.dart
@@ -46,7 +46,7 @@
 
 main() {
   A? a;
-  String? s = '';
+  var s = '' as String?;
   a
     ?..foo().length
     ..x27 = s!.toString().length;
diff --git a/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart b/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
index b4b357e..131631e 100644
--- a/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
+++ b/tests/language/nnbd/syntax/null_assertion_ambiguous_test.dart
@@ -43,7 +43,7 @@
   Expect.throws(() {
       x3 = a!;
   });
-  Object? x4 = 0;
+  var x4 = 0 as Object?;
   Expect.throws(() {
       x4 = a!;
   });
@@ -62,7 +62,7 @@
   // ignores its argument, and verify that the appropriate exception is still
   // thrown.
   var x6 = 2;
-  int? i = 2;
+  var i = 2 as int?;
   x6 * i!;
   var x7 = new C();
   i = null;
@@ -73,9 +73,9 @@
   // `-x!` means `-(x!)`, not `(-x)!`.  We check the compile-time behavior by
   // checking that the negation is accepted even though x is nullable.  We check
   // the runtime behavior by using an object whose operator- returns null.
-  int? x8 = 2;
+  var x8 = 2 as int?;
   -x8!;
-  C? x9 = new C();
+  var x9 = new C() as C?;
   var x10 = -x9!;
   Expect.isNull(x10);
 
diff --git a/tests/language/null_aware/access_runtime_2_test.dart b/tests/language/null_aware/access_runtime_2_test.dart
index b67de99..a1ade72 100644
--- a/tests/language/null_aware/access_runtime_2_test.dart
+++ b/tests/language/null_aware/access_runtime_2_test.dart
@@ -28,7 +28,7 @@
 
   // e1?.id is equivalent to ((x) => x == null ? null : x.id)(e1).
 
-  C? c = new C(1);
+  var c = new C(1) as C?;
   Expect.equals(1, c?.v);
 
   // C?.id is equivalent to C.id.
diff --git a/tests/language/null_aware/access_runtime_5_test.dart b/tests/language/null_aware/access_runtime_5_test.dart
index 5984802..6db60ce3 100644
--- a/tests/language/null_aware/access_runtime_5_test.dart
+++ b/tests/language/null_aware/access_runtime_5_test.dart
@@ -35,7 +35,7 @@
 
 
   // The static type of e1?.d is the static type of e1.id.
-  C? c = new C(1);
+  var c = new C(1) as C?;
   { int? i = c?.v; Expect.equals(1, i); }
 
 
diff --git a/tests/language/null_aware/access_test.dart b/tests/language/null_aware/access_test.dart
index 224a794..b2d1bc0 100644
--- a/tests/language/null_aware/access_test.dart
+++ b/tests/language/null_aware/access_test.dart
@@ -70,8 +70,8 @@
   //                           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'bad' isn't defined for the class 'C'.
-  { B? b = new C(1); Expect.equals(1, b?.v); }
-  //                                     ^
+  { var b = new C(1) as B?; Expect.equals(1, b?.v); }
+  //                                            ^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'v' isn't defined for the class 'B'.
 
diff --git a/tests/language/null_aware/assignment_runtime_11_test.dart b/tests/language/null_aware/assignment_runtime_11_test.dart
index 05b84a6..ca60103 100644
--- a/tests/language/null_aware/assignment_runtime_11_test.dart
+++ b/tests/language/null_aware/assignment_runtime_11_test.dart
@@ -77,7 +77,7 @@
 
 
   // The static type of e1?.v op= e2 is the static type of e1.v op e2.
-  { D? d = new D(new E()); F? f = (d?.v += 1); Expect.identical(d!.v, f); }
+  { var d = new D(new E()) as D?; F? f = (d?.v += 1); Expect.identical(d!.v, f); }
 
 
 
diff --git a/tests/language/null_aware/assignment_runtime_2_test.dart b/tests/language/null_aware/assignment_runtime_2_test.dart
index 825bfc6..bc0cdb6 100644
--- a/tests/language/null_aware/assignment_runtime_2_test.dart
+++ b/tests/language/null_aware/assignment_runtime_2_test.dart
@@ -50,7 +50,7 @@
 
   // e1?.v = e2 is equivalent to ((x) => x == null ? null : x.v = e2)(e1).
 
-  { C? c = new C(1); Expect.equals(2, c?.v = 2); Expect.equals(2, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(2, c?.v = 2); Expect.equals(2, c!.v); }
 
   // C?.v = e2 is equivalent to C.v = e2.
 
diff --git a/tests/language/null_aware/assignment_runtime_5_test.dart b/tests/language/null_aware/assignment_runtime_5_test.dart
index abcf60a..9507557 100644
--- a/tests/language/null_aware/assignment_runtime_5_test.dart
+++ b/tests/language/null_aware/assignment_runtime_5_test.dart
@@ -57,7 +57,7 @@
 
 
   // The static type of e1?.v = e2 is the static type of e2.
-  { D? d = new D(new E()); G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
+  { var d = new D(new E()) as D?; G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
 
 
 
diff --git a/tests/language/null_aware/assignment_runtime_9_test.dart b/tests/language/null_aware/assignment_runtime_9_test.dart
index 3c2d6c0..0a16c52 100644
--- a/tests/language/null_aware/assignment_runtime_9_test.dart
+++ b/tests/language/null_aware/assignment_runtime_9_test.dart
@@ -71,7 +71,7 @@
 
   // e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
 
-  { C? c = new C(1); Expect.equals(3, c?.v += 2); Expect.equals(3, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(3, c?.v += 2); Expect.equals(3, c!.v); }
 
   // C?.v op= e2 is equivalent to C.v op= e2.
 
diff --git a/tests/language/null_aware/assignment_test.dart b/tests/language/null_aware/assignment_test.dart
index 112b0a6..d7bf2f4 100644
--- a/tests/language/null_aware/assignment_test.dart
+++ b/tests/language/null_aware/assignment_test.dart
@@ -59,9 +59,9 @@
   { h.C.staticInt = 1; Expect.equals(2, h.C?.staticInt = 2); Expect.equals(2, h.C.staticInt); }
 
   // The static type of e1?.v = e2 is the static type of e2.
-  { D? d = new D(new E()); G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
-  { D? d = new D(new E()); E e = new G(); F? f = (d?.v = e); }
-  //                                              ^^^^^^^^
+  { var d = new D(new E()) as D?; G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
+  { var d = new D(new E()) as D?; E e = new G(); F? f = (d?.v = e); }
+  //                                                     ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
   { D.staticE = new E(); G g = new G(); F? f = (D?.staticE = g); Expect.identical(f, g); }
diff --git a/tests/language/null_aware/increment_decrement_runtime_12_test.dart b/tests/language/null_aware/increment_decrement_runtime_12_test.dart
index 03986fb..4e9c166 100644
--- a/tests/language/null_aware/increment_decrement_runtime_12_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_12_test.dart
@@ -68,7 +68,7 @@
 
 
   // The static type of e1?.v-- is the same as the static type of e1.v.
-  { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v--; Expect.identical(e1, e2); }
+  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v--; Expect.identical(e1, e2); }
 
 
 
diff --git a/tests/language/null_aware/increment_decrement_runtime_16_test.dart b/tests/language/null_aware/increment_decrement_runtime_16_test.dart
index 1016d22..cfd1b8b 100644
--- a/tests/language/null_aware/increment_decrement_runtime_16_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_16_test.dart
@@ -77,7 +77,7 @@
 
   // ++e1?.v is equivalent to e1?.v += 1.
 
-  { C? c = new C(1); Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
 
   // ++C?.v is equivalent to C?.v += 1.
 
diff --git a/tests/language/null_aware/increment_decrement_runtime_19_test.dart b/tests/language/null_aware/increment_decrement_runtime_19_test.dart
index bb8c565..0677ac7 100644
--- a/tests/language/null_aware/increment_decrement_runtime_19_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_19_test.dart
@@ -84,7 +84,7 @@
 
 
   // The static type of ++e1?.v is the same as the static type of e1.v + 1.
-  { D? d = new D(new E()); F? f = ++d?.v; Expect.identical(d!.v, f); }
+  { var d = new D(new E()) as D?; F? f = ++d?.v; Expect.identical(d!.v, f); }
 
 
 
diff --git a/tests/language/null_aware/increment_decrement_runtime_23_test.dart b/tests/language/null_aware/increment_decrement_runtime_23_test.dart
index b2dc6b5..2927351 100644
--- a/tests/language/null_aware/increment_decrement_runtime_23_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_23_test.dart
@@ -93,7 +93,7 @@
 
   // --e1?.v is equivalent to e1?.v -= 1.
 
-  { C? c = new C(1); Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
 
   // --C?.v is equivalent to C?.v -= 1.
 
diff --git a/tests/language/null_aware/increment_decrement_runtime_26_test.dart b/tests/language/null_aware/increment_decrement_runtime_26_test.dart
index 4201d15..903c33a 100644
--- a/tests/language/null_aware/increment_decrement_runtime_26_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_26_test.dart
@@ -100,7 +100,7 @@
 
 
   // The static type of --e1?.v is the same as the static type of e1.v - 1.
-  { D? d = new D(new E()); F? f = --d?.v; Expect.identical(d!.v, f); }
+  { var d = new D(new E()) as D?; F? f = --d?.v; Expect.identical(d!.v, f); }
 
 
 
diff --git a/tests/language/null_aware/increment_decrement_runtime_2_test.dart b/tests/language/null_aware/increment_decrement_runtime_2_test.dart
index 67bca4a..3a29ccc 100644
--- a/tests/language/null_aware/increment_decrement_runtime_2_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_2_test.dart
@@ -45,7 +45,7 @@
 
   // e1?.v++ is equivalent to ((x) => x == null ? null : x.v++)(e1).
 
-  { C? c = new C(1); Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
 
   // C?.v++ is equivalent to C.v++.
 
diff --git a/tests/language/null_aware/increment_decrement_runtime_5_test.dart b/tests/language/null_aware/increment_decrement_runtime_5_test.dart
index 8ca6c72..0cc85fb 100644
--- a/tests/language/null_aware/increment_decrement_runtime_5_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_5_test.dart
@@ -52,7 +52,7 @@
 
 
   // The static type of e1?.v++ is the same as the static type of e1.v.
-  { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v++; Expect.identical(e1, e2); }
+  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v++; Expect.identical(e1, e2); }
 
 
 
diff --git a/tests/language/null_aware/increment_decrement_runtime_9_test.dart b/tests/language/null_aware/increment_decrement_runtime_9_test.dart
index cd3bd72..7b42679 100644
--- a/tests/language/null_aware/increment_decrement_runtime_9_test.dart
+++ b/tests/language/null_aware/increment_decrement_runtime_9_test.dart
@@ -61,7 +61,7 @@
 
   // e1?.v-- is equivalent to ((x) => x == null ? null : x.v--)(e1).
 
-  { C? c = new C(1); Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
 
   // C?.v-- is equivalent to C.v--.
 
diff --git a/tests/language/null_aware/increment_decrement_test.dart b/tests/language/null_aware/increment_decrement_test.dart
index 0b620fc..7e80690 100644
--- a/tests/language/null_aware/increment_decrement_test.dart
+++ b/tests/language/null_aware/increment_decrement_test.dart
@@ -42,16 +42,16 @@
 
   // e1?.v++ is equivalent to ((x) => x == null ? null : x.v++)(e1).
   Expect.equals(null, nullC()?.v++);
-  { C? c = new C(1); Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
 
   // C?.v++ is equivalent to C.v++.
   { C.staticInt = 1; Expect.equals(1, C?.staticInt++); Expect.equals(2, C.staticInt); }
   { h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt++); Expect.equals(2, h.C.staticInt); }
 
   // The static type of e1?.v++ is the same as the static type of e1.v.
-  { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v++; Expect.identical(e1, e2); }
-  { G g = new G(); D? d = new D(g); F? f = d?.v++; Expect.identical(f, g); }
-  //                                       ^^^^^^
+  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v++; Expect.identical(e1, e2); }
+  { G g = new G(); var d = new D(g) as D?; F? f = d?.v++; Expect.identical(f, g); }
+  //                                              ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
   { E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE++; Expect.identical(e1, e2); }
@@ -69,16 +69,16 @@
 
   // e1?.v-- is equivalent to ((x) => x == null ? null : x.v--)(e1).
   Expect.equals(null, nullC()?.v--);
-  { C? c = new C(1); Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
 
   // C?.v-- is equivalent to C.v--.
   { C.staticInt = 1; Expect.equals(1, C?.staticInt--); Expect.equals(0, C.staticInt); }
   { h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt--); Expect.equals(0, h.C.staticInt); }
 
   // The static type of e1?.v-- is the same as the static type of e1.v.
-  { E e1 = new E(); D? d = new D(e1); E? e2 = d?.v--; Expect.identical(e1, e2); }
-  { G g = new G(); D? d = new D(g); F? f = d?.v--; Expect.identical(f, g); }
-  //                                       ^^^^^^
+  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v--; Expect.identical(e1, e2); }
+  { G g = new G(); var d = new D(g) as D?; F? f = d?.v--; Expect.identical(f, g); }
+  //                                              ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
   { E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE--; Expect.identical(e1, e2); }
@@ -96,18 +96,18 @@
 
   // ++e1?.v is equivalent to e1?.v += 1.
   Expect.equals(null, ++nullC()?.v);
-  { C? c = new C(1); Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
 
   // ++C?.v is equivalent to C?.v += 1.
   { C.staticInt = 1; Expect.equals(2, ++C?.staticInt); Expect.equals(2, C.staticInt); }
   { h.C.staticInt = 1; Expect.equals(2, ++h.C?.staticInt); Expect.equals(2, h.C.staticInt); }
 
   // The static type of ++e1?.v is the same as the static type of e1.v + 1.
-  { D? d = new D(new E()); F? f = ++d?.v; Expect.identical(d!.v, f); }
-  { D? d = new D(new E()); H? h = ++d?.v; Expect.identical(d!.v, h); }
-  //                              ^^^^^^
+  { var d = new D(new E()) as D?; F? f = ++d?.v; Expect.identical(d!.v, f); }
+  { var d = new D(new E()) as D?; H? h = ++d?.v; Expect.identical(d!.v, h); }
+  //                                     ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                ^
+  //                                       ^
   // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
   { D.staticE = new E(); F? f = ++D?.staticE; Expect.identical(D.staticE, f); }
   { h.D.staticE = new h.E(); h.F? f = ++h.D?.staticE; Expect.identical(h.D.staticE, f); }
@@ -124,18 +124,18 @@
 
   // --e1?.v is equivalent to e1?.v -= 1.
   Expect.equals(null, --nullC()?.v);
-  { C? c = new C(1); Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
+  { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
 
   // --C?.v is equivalent to C?.v -= 1.
   { C.staticInt = 1; Expect.equals(0, --C?.staticInt); Expect.equals(0, C.staticInt); }
   { h.C.staticInt = 1; Expect.equals(0, --h.C?.staticInt); Expect.equals(0, h.C.staticInt); }
 
   // The static type of --e1?.v is the same as the static type of e1.v - 1.
-  { D? d = new D(new E()); F? f = --d?.v; Expect.identical(d!.v, f); }
-  { D? d = new D(new E()); H? h = --d?.v; Expect.identical(d!.v, h); }
-  //                              ^^^^^^
+  { var d = new D(new E()) as D?; F? f = --d?.v; Expect.identical(d!.v, f); }
+  { var d = new D(new E()) as D?; H? h = --d?.v; Expect.identical(d!.v, h); }
+  //                                     ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                ^
+  //                                       ^
   // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
   { D.staticE = new E(); F? f = --D?.staticE; Expect.identical(D.staticE, f); }
   { h.D.staticE = new h.E(); h.F? f = --h.D?.staticE; Expect.identical(h.D.staticE, f); }
diff --git a/tests/language/null_aware/invocation_runtime_2_test.dart b/tests/language/null_aware/invocation_runtime_2_test.dart
index 70a36d1..8c11b27 100644
--- a/tests/language/null_aware/invocation_runtime_2_test.dart
+++ b/tests/language/null_aware/invocation_runtime_2_test.dart
@@ -32,7 +32,7 @@
 
   // o?.m(...) is equivalent to ((x) => x == null ? null : x.m(...))(o).
 
-  C? c = C();
+  var c = C() as C?;
   Expect.equals(1, c?.f(() => 1));
 
   // C?.m(...) is equivalent to C.m(...).
diff --git a/tests/language/null_aware/invocation_runtime_6_test.dart b/tests/language/null_aware/invocation_runtime_6_test.dart
index 23559d8..bbabd59 100644
--- a/tests/language/null_aware/invocation_runtime_6_test.dart
+++ b/tests/language/null_aware/invocation_runtime_6_test.dart
@@ -41,7 +41,7 @@
   // The static type of o?.m(...) is the same as the static type of
   // o.m(...).
 
-  C? c = new C();
+  var c = new C() as C?;
   { int? i = c?.g(() => 1); Expect.equals(1, i); }
 
 
diff --git a/tests/language/null_aware/invocation_test.dart b/tests/language/null_aware/invocation_test.dart
index a1515fa..b1f38e6 100644
--- a/tests/language/null_aware/invocation_test.dart
+++ b/tests/language/null_aware/invocation_test.dart
@@ -23,7 +23,7 @@
 C? nullC() => null;
 
 main() {
-  C? c = C();
+  var c = C() as C?;
 
   // Make sure the "none" test fails if method invocation using "?." is not
   // implemented.  This makes status files easier to maintain.
@@ -66,12 +66,12 @@
   // Let T be the static type of o and let y be a fresh variable of type T.
   // Exactly the same static warnings that would be caused by y.m(...) are also
   // generated in the case of o?.m(...).
-  { B? b = new C(); Expect.equals(1, b?.f(() => 1)); }
-  //                                    ^
+  { var b = new C() as B?; Expect.equals(1, b?.f(() => 1)); }
+  //                                           ^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'f' isn't defined for the class 'B'.
-  { int? i = 1; Expect.equals(null, nullC()?.f(i)); }
-  //                                           ^
+  { var i = 1 as int?; Expect.equals(null, nullC()?.f(i)); }
+  //                                                  ^
   // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] The argument type 'int?' can't be assigned to the parameter type 'dynamic Function()?'.
 
diff --git a/tests/language/null_aware/null_shortening_test.dart b/tests/language/null_aware/null_shortening_test.dart
index f4ce95c..eaaffe5 100644
--- a/tests/language/null_aware/null_shortening_test.dart
+++ b/tests/language/null_aware/null_shortening_test.dart
@@ -50,11 +50,11 @@
 
 main() {
   C1 c1 = C1();
-  C1? c1q = c1;
+  var c1q = c1 as C1?;
   C1? c1n = null;
 
   C2 c2 = C2();
-  C2? c2q = c2;
+  var c2q = c2 as C2?;
 
   // All selector operations short on null.
   // .foo
diff --git a/tests/language/null_aware/opt_test.dart b/tests/language/null_aware/opt_test.dart
index c5bb8a7..57f3848 100644
--- a/tests/language/null_aware/opt_test.dart
+++ b/tests/language/null_aware/opt_test.dart
@@ -23,17 +23,17 @@
 
 test() {
   var c;
-  C? d = new C(5);
+  var d = new C(5) as C?;
   Expect.equals(null, c?.m(bomb()));
   Expect.equals(null, getNull()?.anything(bomb()));
   Expect.equals(1, d?.m(1));
 
-  C? c2 = new C(1);
+  var c2 = new C(1) as C?;
   Expect.equals(1, c2?.f);
   Expect.equals(null, c?.v);
   Expect.equals(10, c ?? 10);
   Expect.equals(d, d ?? bomb());
-  List<List<int>>? list = [[3]];
+  var list = [[3]] as List<List<int>>?;
   Expect.equals(
       3,
       list?.expand((i) => i).toList()[0]);
@@ -58,7 +58,7 @@
   e?.f++;
   Expect.equals(201, e.f);
 
-  int? five = 5;
+  var five = 5 as int?;
   var x = five ?? bomb();
 }
 
diff --git a/tests/language/spread_collections/const_test.dart b/tests/language/spread_collections/const_test.dart
index 1eb4d76..cab125f 100644
--- a/tests/language/spread_collections/const_test.dart
+++ b/tests/language/spread_collections/const_test.dart
@@ -43,8 +43,8 @@
       const <int>[...<int>[...<int>[1, 2], ...<int>[3, 4]]]);
 
   // Null-aware.
-  const List<int>? list23 = <int>[2, 3];
-  const List<int>? list4 = <int>[4];
+  const list23 = <int>[2, 3] as List<int>?;
+  const list4 = <int>[4] as List<int>?;
   Expect.identical(list,
       const <int>[1, ...?list23, ...?(null), ...?list4]);
 
@@ -98,8 +98,8 @@
   });
 
   // Null-aware.
-  const Map<int, int>? map23 = <int, int>{2: 2, 3: 3};
-  const Map<int, int>? map4 = <int, int>{4: 4};
+  const map23 = <int, int>{2: 2, 3: 3} as Map<int, int>?;
+  const map4 = <int, int>{4: 4} as Map<int, int>?;
   Expect.identical(map, const <int, int>{
     1: 1,
     ...?map23,
@@ -155,8 +155,8 @@
   Expect.identical(set, const <int>{...<int>{...<int>[1, 2], ...<int>[3, 4]}});
 
   // Null-aware.
-  const List<int>? list23 = <int>[2, 3];
-  const List<int>? list4 = <int>[4];
+  const list23 = <int>[2, 3] as List<int>?;
+  const list4 = <int>[4] as List<int>?;
   Expect.identical(set,
       const <int>{1, ...?list23, ...?(null), ...?list4});
 
diff --git a/tests/language/spread_collections/spread_test.dart b/tests/language/spread_collections/spread_test.dart
index 2a19168..baee04c 100644
--- a/tests/language/spread_collections/spread_test.dart
+++ b/tests/language/spread_collections/spread_test.dart
@@ -43,8 +43,8 @@
   Expect.listEquals(list, <int>[...<int>[...<int>[1, 2], ...<int>[3, 4]]]);
 
   // Null-aware.
-  List<int>? list23 = [2, 3];
-  List<int>? list4 = [4];
+  var list23 = [2, 3] as List<int>?;
+  var list4 = [4] as List<int>?;
   Expect.listEquals(list, <int>[1, ...?list23, ...?(null), ...?list4]);
 
   // Does not deep flatten.
@@ -94,8 +94,8 @@
   });
 
   // Null-aware.
-  Map<int, int>? map23 = {2: 2, 3: 3};
-  Map<int, int>? map4 = {4: 4};
+  var map23 = {2: 2, 3: 3} as Map<int, int>?;
+  var map4 = {4: 4} as Map<int, int>?;
   Expect.mapEquals(map, <int, int>{
     1: 1,
     ...?map23,
@@ -147,8 +147,8 @@
   Expect.setEquals(set, <int>{...<int>{...<int>[1, 2], ...<int>[3, 4]}});
 
   // Null-aware.
-  List<int>? list23 = [2, 3];
-  List<int>? list4 = [4];
+  var list23 = [2, 3] as List<int>?;
+  var list4 = [4] as List<int>?;
   Expect.setEquals(set, <int>{1, ...?list23, ...?(null), ...?list4});
 
   // Does not deep flatten.
diff --git a/tests/language/spread_collections/syntax_test.dart b/tests/language/spread_collections/syntax_test.dart
index aa6a51f..ed6676f 100644
--- a/tests/language/spread_collections/syntax_test.dart
+++ b/tests/language/spread_collections/syntax_test.dart
@@ -17,11 +17,11 @@
 
   var a = [0];
   Expect.listEquals([1, 2, 3], [1, ...a = [2], 3]);
-  List<int>? nullableA = [0];
+  var nullableA = [0] as List<int>?;
   Expect.listEquals([1, 3], [1, ...?nullableA = null, 3]);
 
   var b = [2];
   Expect.listEquals([1, 2, 3, 4], [1, ...b..add(3), 4]);
-  List<int>? nullableB = [2];
+  var nullableB = [2] as List<int>?;
   Expect.listEquals([1, 2, 3, 4], [1, ...?nullableB?..add(3), 4]);
 }
diff --git a/tests/lib/lib_vm.status b/tests/lib/lib_vm.status
index dfe5cd6..edb365c 100644
--- a/tests/lib/lib_vm.status
+++ b/tests/lib/lib_vm.status
@@ -77,6 +77,7 @@
 
 [ $runtime == vm && $system == windows ]
 isolate/detect_nullsafety_1_test: Skip # Issue 43583
+isolate/detect_nullsafety_2_test: Skip # Issue 43583
 isolate/nnbd_spawn_autodetect_1_test: Skip # Issue 43583
 isolate/nnbd_spawn_autodetect_2_test: Skip # Issue 43583
 isolate/nnbd_spawnuri_autodetect_1_test: Skip # Issue 43583
diff --git a/tests/standalone/regress_41329_absolute_test.dart b/tests/standalone/regress_41329_absolute_test.dart
index e35e126..5798cbc 100644
--- a/tests/standalone/regress_41329_absolute_test.dart
+++ b/tests/standalone/regress_41329_absolute_test.dart
@@ -19,7 +19,7 @@
 
   // /usr/local/Cellar/dart/2.8.0-dev.20.0/bin/dart -> $DART_SDK/bin/dart
   Directory.current = a;
-  final linkLocation = '../Cellar/dart/2.8.0-dev.20.0/bin/dart';
+  final linkLocation = '${d.path}/usr/local/bin/Cellar/dart/2.8.0-dev.20.0/bin/dart';
   final link = Link(linkLocation);
   link.createSync(exePath, recursive: true);
 
@@ -27,6 +27,6 @@
   final link2 = Link('dart')..createSync(linkLocation, recursive: true);
   final path = Uri.parse(link2.absolute.path).path;
   Directory.current = origDir;
-  final result = await Process.run('${path}', ['help']);
+  final result = await Process.run('$path', ['help']);
   Expect.equals(result.exitCode, 0);
 }
diff --git a/tests/standalone/standalone_precompiled.status b/tests/standalone/standalone_precompiled.status
index 6953302..5e5ec81 100644
--- a/tests/standalone/standalone_precompiled.status
+++ b/tests/standalone/standalone_precompiled.status
@@ -54,6 +54,7 @@
 package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: Skip
 package/scenarios/packages_option_only/packages_option_only_noimports_test: Skip
 package/scenarios/packages_option_only/packages_option_only_test: Skip
+regress_41329_*: SkipByDesign # Expects to find the test directory relative to the script.
 
 [ $arch == arm && $mode == release && $runtime == dart_precompiled && $system == android ]
 io/socket_cancel_connect_test: RuntimeError # Issue 34142
diff --git a/tests/standalone_2/regress_41329_absolute_test.dart b/tests/standalone_2/regress_41329_absolute_test.dart
index e35e126..5798cbc 100644
--- a/tests/standalone_2/regress_41329_absolute_test.dart
+++ b/tests/standalone_2/regress_41329_absolute_test.dart
@@ -19,7 +19,7 @@
 
   // /usr/local/Cellar/dart/2.8.0-dev.20.0/bin/dart -> $DART_SDK/bin/dart
   Directory.current = a;
-  final linkLocation = '../Cellar/dart/2.8.0-dev.20.0/bin/dart';
+  final linkLocation = '${d.path}/usr/local/bin/Cellar/dart/2.8.0-dev.20.0/bin/dart';
   final link = Link(linkLocation);
   link.createSync(exePath, recursive: true);
 
@@ -27,6 +27,6 @@
   final link2 = Link('dart')..createSync(linkLocation, recursive: true);
   final path = Uri.parse(link2.absolute.path).path;
   Directory.current = origDir;
-  final result = await Process.run('${path}', ['help']);
+  final result = await Process.run('$path', ['help']);
   Expect.equals(result.exitCode, 0);
 }
diff --git a/tests/standalone_2/standalone_2_precompiled.status b/tests/standalone_2/standalone_2_precompiled.status
index 829aafc..1e00e12 100644
--- a/tests/standalone_2/standalone_2_precompiled.status
+++ b/tests/standalone_2/standalone_2_precompiled.status
@@ -51,6 +51,7 @@
 package/scenarios/packages_file_strange_formatting/mixed_line_ends_test: Skip
 package/scenarios/packages_option_only/packages_option_only_noimports_test: Skip
 package/scenarios/packages_option_only/packages_option_only_test: Skip
+regress_41329_*: SkipByDesign # Expects to be running from 'dart' instead of 'dart_precompiled_runtime'
 
 [ $arch == arm && $mode == release && $runtime == dart_precompiled && $system == android ]
 io/socket_cancel_connect_test: RuntimeError # Issue 34142
diff --git a/tools/VERSION b/tools/VERSION
index e19680c..32d89b9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 180
+PRERELEASE 181
 PRERELEASE_PATCH 0
\ No newline at end of file