Version 2.11.0-182.0.dev

Merge commit '68fd2a9d52802bdcc2db31d9b31a2e128b392f30' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7ecc7c3..e6e8fc7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,11 +2,16 @@
 
 ### Core libraries
 
+#### `dart:io`
+
+*   `HttpRequest` will now correctly follow HTTP 308 redirects
+    (`HttpStatus.permanentRedirect`).
+
 ### Dart VM
 
 ### Dart2JS
 
-* Removed `--no-defer-class-types` and `--no-new-deferred-split'.
+* Removed `--no-defer-class-types` and `--no-new-deferred-split`.
 
 ### Tools
 
@@ -18,8 +23,13 @@
 
 #### Linter
 
-Updated the Linter to `0.1.119`, which includes:
+Updated the Linter to `0.1.120`, which includes:
 
+* New lint: `cast_nullable_to_non_nullable`.
+* New lint: `null_check_on_nullable_type_parameter`.
+* New lint: `tighten_type_of_initializing_formals`.
+* Updates to `public_member_apis` to check generic type aliases.
+* (Internal): updates to adopt new analyzer APIs.
 * Fixed `close_sinks` to handle `this`-prefixed property accesses.
 * New lint: `unnecessary_null_checks`.
 * Fixed `unawaited_futures` to handle `Future` subtypes.
@@ -157,9 +167,14 @@
 *   [Abstract Unix Domain Socket][] is supported on Linux/Android now. Using an
     `InternetAddress` with `address` starting with '@' and type being
     `InternetAddressType.Unix` will create an abstract Unix Domain Socket.
+*   On Windows, file APIs can now handle files and directories identified by
+    long paths (greater than 260 characters). It complies with all restrictions
+    from [Long Path on Windows][]. Note that `Directory.current` does not work
+    with long path.
 
 [#42006]: https://github.com/dart-lang/sdk/issues/42006
 [Abstract Unix Domain Socket]: http://man7.org/linux/man-pages/man7/unix.7.html
+[Long Path on Windows]: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation
 
 #### `dart:html`
 
diff --git a/DEPS b/DEPS
index fbc3992..d0e3e35 100644
--- a/DEPS
+++ b/DEPS
@@ -113,7 +113,7 @@
   "intl_tag": "0.16.1",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "8f189db8f0c299187a0e8fa959dba7e9b0254be5",
-  "linter_tag": "0.1.119",
+  "linter_tag": "0.1.120",
   "logging_rev": "1590ba0b648a51e7eb3895c612e4b72f72623b6f",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "markdown_rev": "dbeafd47759e7dd0a167602153bb9c49fb5e5fe7",
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 7959ff9..037629d 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
@@ -1050,7 +1050,8 @@
 
   @override
   bool isUnassigned(Variable variable) {
-    return _wrap('isUnassigned($variable)', () => _wrapped.isAssigned(variable),
+    return _wrap(
+        'isUnassigned($variable)', () => _wrapped.isUnassigned(variable),
         isQuery: true);
   }
 
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 1269bc4..0dc5805 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1111,17 +1111,17 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorLateFinalFieldCause =
     const MessageCode("ConstConstructorLateFinalFieldCause",
-        severity: Severity.context,
-        message: r"""Field is late, but constructor is 'const'.""");
+        severity: Severity.context, message: r"""This constructor is const.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorLateFinalFieldError =
     messageConstConstructorLateFinalFieldError;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstConstructorLateFinalFieldError =
-    const MessageCode("ConstConstructorLateFinalFieldError",
-        message: r"""Constructor is marked 'const' so fields can't be late.""");
+const MessageCode messageConstConstructorLateFinalFieldError = const MessageCode(
+    "ConstConstructorLateFinalFieldError",
+    message:
+        r"""Can't have a late final field in a class with a const constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorNonFinalField =
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart
index 794b455..3b9c964 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment/data/late_initializer.dart
@@ -6,6 +6,8 @@
 // doesn't execute immediately, so it may refer to other late variables that
 // aren't assigned yet.
 
+void use(Object? x) {}
+
 eagerInitializerRefersToLateVar() {
   late int x;
   int y = /*unassigned*/ x;
@@ -17,3 +19,9 @@
   late int y = x;
   x = 0;
 }
+
+lateInitializerIsAssignment() {
+  late int y;
+  late int z1 = y = 3;
+  use(y);
+}
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 35f2d63..3d890e8 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,18 +55,6 @@
   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;
@@ -106,13 +94,13 @@
 
 localVariable_initialized_promoted_type_var_typed<T>(T t) {
   if (t is num) {
-    // This should promote to `T & Object`, because that's the non-nullable
-    // version of T, but it shouldn't promote to `T & 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`.
     T x = /*T & num*/ t;
-    /*T & Object*/ x;
+    x;
     // Check that `T & Object` is a type of interest by promoting and then
     // writing to it
-    if (/*T & Object*/ x is int) {
+    if (x is int) {
       /*T & int*/ x;
       x = /*T & num*/ t;
       /*T & Object*/ x;
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 9e583cc..dc26a16 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
@@ -70,12 +70,13 @@
 /// A fix producer that produces changes to fix multiple diagnostics.
 class BulkFixProcessor {
   /// A map from the name of a lint rule to a list of generators used to create
-  /// the correction producer used to build a fix for that diagnostic. Most
-  /// entries will have only one generator.  In cases where there is more than
-  /// one, they will be applied in series and the expectation is that only one
-  /// will produce a change for a given fix. If more than one change is produced
-  /// the result will almost certainly be invalid code. The generators used for
-  /// non-lint diagnostics are in the [nonLintProducerMap].
+  /// the correction producer used to build a fix for that diagnostic. The
+  /// generators used for non-lint diagnostics are in the [nonLintProducerMap].
+  ///
+  /// Most entries will have only one generator. In cases where there is more
+  /// than one, they will be applied in series and the expectation is that only
+  /// one will produce a change for a given fix. If more than one change is
+  /// produced the result will almost certainly be invalid code.
   static const Map<String, List<ProducerGenerator>> lintProducerMap = {
     LintNames.annotate_overrides: [
       AddOverride.newInstance,
@@ -241,9 +242,13 @@
     ],
   };
 
-  /// A map from error codes to a list of generators used to create multiple
+  /// A map from an error code to a list of generators used to create multiple
   /// correction producers used to build fixes for those diagnostics. The
   /// generators used for lint rules are in the [lintMultiProducerMap].
+  ///
+  /// The expectation is that only one of the correction producers will produce
+  /// a change for a given fix. If more than one change is produced the result
+  /// will almost certainly be invalid code.
   static const Map<ErrorCode, List<MultiProducerGenerator>>
       nonLintMultiProducerMap = {
     CompileTimeErrorCode.EXTENDS_NON_CLASS: [
@@ -304,14 +309,12 @@
     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.DEPRECATED_MEMBER_USE: [
+      DataDriven.newInstance,
+    ],
+    HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE: [
+      DataDriven.newInstance,
+    ],
     HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD: [
       DataDriven.newInstance,
     ],
@@ -322,16 +325,22 @@
   /// lint rules are in the [lintProducerMap].
   static const Map<ErrorCode, ProducerGenerator> nonLintProducerMap = {};
 
+  /// Information about the workspace containing the libraries in which changes
+  /// will be produced.
   final DartChangeWorkspace workspace;
 
   /// The change builder used to build the changes required to fix the
   /// diagnostics.
   ChangeBuilder builder;
 
+  /// Initialize a newly created processor to create fixes for diagnostics in
+  /// libraries in the [workspace].
   BulkFixProcessor(this.workspace) {
     builder = ChangeBuilder(workspace: workspace);
   }
 
+  /// Return a change builder that has been used to create fixes for the
+  /// diagnostics in the libraries at the given [libraryPaths].
   Future<ChangeBuilder> fixErrorsInLibraries(List<String> libraryPaths) async {
     for (var path in libraryPaths) {
       var session = workspace.getSession(path);
@@ -344,8 +353,10 @@
     return builder;
   }
 
-  Future<void> _fixErrorsInLibrary(ResolvedLibraryResult libraryResult) async {
-    for (var unitResult in libraryResult.units) {
+  /// Use the change [builder] to create fixes for the diagnostics in the
+  /// library associated with the analysis [result].
+  Future<void> _fixErrorsInLibrary(ResolvedLibraryResult result) async {
+    for (var unitResult in result.units) {
       final fixContext = DartFixContextImpl(
         workspace,
         unitResult,
@@ -358,14 +369,17 @@
     }
   }
 
+  /// Use the change [builder] and the [fixContext] to create a fix for the
+  /// given [diagnostic] in the compilation unit associated with the analysis
+  /// [result].
   Future<void> _fixSingleError(DartFixContext fixContext,
-      ResolvedUnitResult unitResult, AnalysisError error) async {
+      ResolvedUnitResult result, AnalysisError diagnostic) async {
     var context = CorrectionProducerContext(
       dartFixContext: fixContext,
-      diagnostic: error,
-      resolvedResult: unitResult,
-      selectionOffset: error.offset,
-      selectionLength: error.length,
+      diagnostic: diagnostic,
+      resolvedResult: result,
+      selectionOffset: diagnostic.offset,
+      selectionLength: diagnostic.length,
       workspace: workspace,
     );
 
@@ -379,7 +393,7 @@
       await producer.compute(builder);
     }
 
-    var errorCode = error.errorCode;
+    var errorCode = diagnostic.errorCode;
     if (errorCode is LintCode) {
       var generators = lintProducerMap[errorCode.name];
       if (generators != null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart
new file mode 100644
index 0000000..080bc4f9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_comparison.dart
@@ -0,0 +1,103 @@
+// 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveComparison extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_COMPARISON;
+
+  /// Return `true` if the null comparison will always return `false`.
+  bool get _conditionIsFalse =>
+      (diagnostic as AnalysisError).errorCode ==
+      HintCode.UNNECESSARY_NULL_COMPARISON_FALSE;
+
+  /// Return `true` if the null comparison will always return `true`.
+  bool get _conditionIsTrue =>
+      (diagnostic as AnalysisError).errorCode ==
+      HintCode.UNNECESSARY_NULL_COMPARISON_TRUE;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    if (node is! BinaryExpression) {
+      return;
+    }
+    var binaryExpression = node as BinaryExpression;
+    var parent = binaryExpression.parent;
+    if (parent is AssertInitializer && _conditionIsTrue) {
+      var constructor = parent.parent as ConstructorDeclaration;
+      var list = constructor.initializers;
+      if (list.length == 1) {
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addDeletion(range.endEnd(constructor.parameters, parent));
+        });
+      } else {
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addDeletion(range.nodeInList(list, parent));
+        });
+      }
+    } else if (parent is AssertStatement && _conditionIsTrue) {
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addDeletion(utils.getLinesRange(range.node(parent)));
+      });
+    } else if (parent is BinaryExpression) {
+      if (parent.operator.type == TokenType.AMPERSAND_AMPERSAND &&
+          _conditionIsTrue) {
+        await _removeOperatorAndOperand(builder, parent, node);
+      } else if (parent.operator.type == TokenType.BAR_BAR &&
+          _conditionIsFalse) {
+        await _removeOperatorAndOperand(builder, parent, node);
+      }
+    } else if (parent is IfStatement) {
+      if (parent.elseStatement == null && _conditionIsTrue) {
+        var body = _extractBody(parent);
+        body = utils.indentSourceLeftRight(body);
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addSimpleReplacement(
+              range.startOffsetEndOffset(
+                  parent.offset, utils.getLineContentEnd(parent.end)),
+              body);
+        });
+      }
+    }
+  }
+
+  String _extractBody(IfStatement statement) {
+    var body = statement.thenStatement;
+    if (body is Block) {
+      var statements = body.statements;
+      return utils.getRangeText(range.startOffsetEndOffset(
+          statements.first.offset,
+          utils.getLineContentEnd(statements.last.end)));
+    }
+    return utils.getNodeText(body);
+  }
+
+  /// Use the [builder] to add an edit to delete the operator and given
+  /// [operand] from the [binary] expression.
+  Future<void> _removeOperatorAndOperand(ChangeBuilder builder,
+      BinaryExpression binary, Expression operand) async {
+    SourceRange operatorAndOperand;
+    if (binary.leftOperand == node) {
+      operatorAndOperand = range.startStart(node, binary.rightOperand);
+    } else {
+      operatorAndOperand = range.endEnd(binary.leftOperand, node);
+    }
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addDeletion(operatorAndOperand);
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveComparison newInstance() => RemoveComparison();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 7dd5825..534d910 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -335,6 +335,8 @@
       FixKind('dart.fix.remove.argument', 50, 'Remove argument');
   static const REMOVE_AWAIT =
       FixKind('dart.fix.remove.await', 50, 'Remove await');
+  static const REMOVE_COMPARISON =
+      FixKind('dart.fix.remove.comparison', 50, 'Remove comparison');
   static const REMOVE_CONST =
       FixKind('dart.fix.remove.const', 50, 'Remove const');
   static const REMOVE_DEAD_CODE =
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index d283e88..e36d5e5 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -65,6 +65,7 @@
   static const String _transformsKey = 'transforms';
   static const String _typedefKey = 'typedef';
   static const String _urisKey = 'uris';
+  static const String _variableKey = 'variable';
   static const String _variablesKey = 'variables';
   static const String _versionKey = 'version';
 
@@ -499,7 +500,8 @@
         _methodKey,
         _mixinKey,
         _setterKey,
-        _typedefKey
+        _typedefKey,
+        _variableKey
       ]);
       if (elementKey == null) {
         // The error has already been reported.
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 5e44eee..e506f30 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -87,6 +87,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_annotation.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_await.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_comparison.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_const.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_code.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_dead_if_null.dart';
@@ -1012,12 +1013,21 @@
     HintCode.UNNECESSARY_CAST: [
       RemoveUnnecessaryCast.newInstance,
     ],
-    // TODO(brianwilkerson) Add a fix to remove the method.
-//    HintCode.UNNECESSARY_NO_SUCH_METHOD: [],
-    // TODO(brianwilkerson) Add a fix to remove the type check.
-//    HintCode.UNNECESSARY_TYPE_CHECK_FALSE: [],
-    // TODO(brianwilkerson) Add a fix to remove the type check.
-//    HintCode.UNNECESSARY_TYPE_CHECK_TRUE: [],
+//    HintCode.UNNECESSARY_NO_SUCH_METHOD: [
+// TODO(brianwilkerson) Add a fix to remove the method.
+//    ],
+    HintCode.UNNECESSARY_NULL_COMPARISON_FALSE: [
+      RemoveComparison.newInstance,
+    ],
+    HintCode.UNNECESSARY_NULL_COMPARISON_TRUE: [
+      RemoveComparison.newInstance,
+    ],
+//    HintCode.UNNECESSARY_TYPE_CHECK_FALSE: [
+// TODO(brianwilkerson) Add a fix to remove the type check.
+//    ],
+//    HintCode.UNNECESSARY_TYPE_CHECK_TRUE: [
+// TODO(brianwilkerson) Add a fix to remove the type check.
+//    ],
     HintCode.UNUSED_CATCH_CLAUSE: [
       RemoveUnusedCatchClause.newInstance,
     ],
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 cc14f37..67caf6c 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
@@ -33,7 +33,37 @@
 
 @reflectiveTest
 class ExtendsNonClassTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+@deprecated
+class Old {}
+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';
+class A extends Old {}
+class B extends Old {}
+''');
+    await assertHasFix('''
+import '$importUri';
+class A extends New {}
+class B extends New {}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class New {}
 ''');
@@ -66,9 +96,10 @@
 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.
+    // This fails for two reasons. First, we grab the argument from the outer
+    // invocation before we modify it, which causes the unmodified version of
+    // the argument to be used for the added named parameter. Second, we produce
+    // overlapping edits.
     setPackageContent('''
 int f(int x, {int y = 0}) => x;
 ''');
@@ -148,7 +179,37 @@
 
 @reflectiveTest
 class ImplementsNonClassTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+@deprecated
+class Old {}
+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';
+class A implements Old {}
+class B implements Old {}
+''');
+    await assertHasFix('''
+import '$importUri';
+class A implements New {}
+class B implements New {}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class New {}
 ''');
@@ -277,7 +338,37 @@
 
 @reflectiveTest
 class MixinOfNonClassTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+@deprecated
+class Old {}
+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';
+class A with Old {}
+class B with Old {}
+''');
+    await assertHasFix('''
+import '$importUri';
+class A with New {}
+class B with New {}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class New {}
 ''');
@@ -308,7 +399,38 @@
 
 @reflectiveTest
 class NewWithUndefinedConstructorDefaultTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  C([C 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());
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class C {
   C.new([C c]);
@@ -340,7 +462,7 @@
 
 @reflectiveTest
 class NotEnoughPositionalArgumentsTest extends _DataDrivenTest {
-  Future<void> test_removeParameter() async {
+  Future<void> test_addParameter() async {
     setPackageContent('''
 int f(int x, int y) => x + y;
 ''');
@@ -423,7 +545,35 @@
 
 @reflectiveTest
 class UndefinedClassTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+@deprecated
+class Old {}
+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) {}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class New {}
 ''');
@@ -452,7 +602,39 @@
 
 @reflectiveTest
 class UndefinedFunctionTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+@deprecated
+int old(int x) => x + 1;
+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));
+}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 int new(int x) => x + 1;
 ''');
@@ -485,7 +667,42 @@
 
 @reflectiveTest
 class UndefinedGetterTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  int get old => 0;
+  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;
+}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class C {
   int get new => 0;
@@ -521,7 +738,39 @@
 
 @reflectiveTest
 class UndefinedIdentifierTest extends _DataDrivenTest {
-  Future<void> test_rename_topLevelVariable() async {
+  Future<void> test_rename_topLevelVariable_deprecated() async {
+    setPackageContent('''
+@deprecated
+int old = 0;
+int new = 0;
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to new'
+  date: 2020-09-01
+  element:
+    uris: ['$importUri']
+    variable: 'old'
+  changes:
+    - kind: 'rename'
+      newName: 'new'
+''');
+    await resolveTestUnit('''
+import '$importUri';
+void f() {
+  old + old;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+void f() {
+  new + new;
+}
+''');
+  }
+
+  Future<void> test_rename_topLevelVariable_removed() async {
     setPackageContent('''
 int new = 0;
 ''');
@@ -532,7 +781,7 @@
   date: 2020-09-01
   element:
     uris: ['$importUri']
-    function: 'old'
+    variable: 'old'
   changes:
     - kind: 'rename'
       newName: 'new'
@@ -554,7 +803,42 @@
 
 @reflectiveTest
 class UndefinedMethodTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  int old(int x) => x + 1;
+  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));
+}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class C {
   int new(int x) => x + 1;
@@ -590,7 +874,42 @@
 
 @reflectiveTest
 class UndefinedSetterTest extends _DataDrivenTest {
-  Future<void> test_rename() async {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  set new(int x) {}
+  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;
+}
+''');
+  }
+
+  Future<void> test_rename_removed() async {
     setPackageContent('''
 class C {
   set new(int x) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index 45e1702..2be023e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -426,6 +426,24 @@
     expect(transform.changes, isEmpty);
   }
 
+  void test_element_variable() {
+    parse('''
+version: 1
+transforms:
+- title: 'Rename v'
+  date: 2020-10-01
+  element:
+    uris: ['test.dart']
+    variable: 'v'
+  changes: []
+''');
+    var transforms = result.transformsFor('v', uris);
+    expect(transforms, hasLength(1));
+    var transform = transforms[0];
+    expect(transform.title, 'Rename v');
+    expect(transform.changes, isEmpty);
+  }
+
   void test_incomplete() {
     parse('''
 version: 1
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
new file mode 100644
index 0000000..67590ce
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2018, 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveComparisonTest);
+  });
+}
+
+@reflectiveTest
+class RemoveComparisonTest extends FixProcessorTest {
+  @override
+  List<String> get experiments => [EnableString.non_nullable];
+
+  @override
+  FixKind get kind => DartFixKind.REMOVE_COMPARISON;
+
+  Future<void> test_assertInitializer_first() async {
+    await resolveTestUnit('''
+class C {
+  String t;
+  C(String s) : assert(s != null), t = s;
+}
+''');
+    await assertHasFix('''
+class C {
+  String t;
+  C(String s) : t = s;
+}
+''');
+  }
+
+  Future<void> test_assertInitializer_last() async {
+    await resolveTestUnit('''
+class C {
+  String t;
+  C(String s) : t = s, assert(s != null);
+}
+''');
+    await assertHasFix('''
+class C {
+  String t;
+  C(String s) : t = s;
+}
+''');
+  }
+
+  Future<void> test_assertInitializer_middle() async {
+    await resolveTestUnit('''
+class C {
+  String t;
+  String u;
+  C(String s) : t = s, assert(s != null), u = s;
+}
+''');
+    await assertHasFix('''
+class C {
+  String t;
+  String u;
+  C(String s) : t = s, u = s;
+}
+''');
+  }
+
+  Future<void> test_assertInitializer_only() async {
+    await resolveTestUnit('''
+class C {
+  C(String s) : assert(s != null);
+}
+''');
+    await assertHasFix('''
+class C {
+  C(String s);
+}
+''');
+  }
+
+  Future<void> test_assertStatement() async {
+    await resolveTestUnit('''
+void f(String s) {
+  assert(s != null);
+  print(s);
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  print(s);
+}
+''');
+  }
+
+  Future<void> test_binaryExpression_and_left() async {
+    await resolveTestUnit('''
+void f(String s) {
+  print(s != null && s.isNotEmpty);
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  print(s.isNotEmpty);
+}
+''');
+  }
+
+  Future<void> test_binaryExpression_and_right() async {
+    await resolveTestUnit('''
+void f(String s) {
+  print(s.isNotEmpty && s != null);
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  print(s.isNotEmpty);
+}
+''');
+  }
+
+  Future<void> test_binaryExpression_or_left() async {
+    await resolveTestUnit('''
+void f(String s) {
+  print(s == null || s.isEmpty);
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  print(s.isEmpty);
+}
+''');
+  }
+
+  Future<void> test_binaryExpression_or_right() async {
+    await resolveTestUnit('''
+void f(String s) {
+  print(s.isEmpty || s == null);
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  print(s.isEmpty);
+}
+''');
+  }
+
+  Future<void> test_ifStatement() async {
+    await resolveTestUnit('''
+void f(String s) {
+  if (s != null) {
+    print(s);
+  }
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  print(s);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 7fcd197..d795e61 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -101,6 +101,7 @@
 import 'remove_annotation_test.dart' as remove_annotation;
 import 'remove_argument_test.dart' as remove_argument;
 import 'remove_await_test.dart' as remove_await;
+import 'remove_comparison_test.dart' as remove_comparison;
 import 'remove_const_test.dart' as remove_const;
 import 'remove_dead_code_test.dart' as remove_dead_code;
 import 'remove_duplicate_case_test.dart' as remove_duplicate_case;
@@ -257,6 +258,7 @@
     remove_annotation.main();
     remove_argument.main();
     remove_await.main();
+    remove_comparison.main();
     remove_const.main();
     remove_dead_code.main();
     remove_duplicate_case.main();
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index d6dd68a..f778aef 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -479,6 +479,9 @@
         types[i] = _typeSystem.nonNullifyLegacy(types[i]);
       }
     }
+    for (var i = 0; i < types.length; i++) {
+      types[i] = _typeSystem.demoteType(types[i]);
+    }
   }
 
   /// If in a legacy library, return the legacy version of the [type].
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 7082a55..696581e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -304,6 +304,16 @@
   }
 
   @override
+  void visitAssertInitializer(AssertInitializer node) {
+    _isInConstructorInitializer = true;
+    try {
+      super.visitAssertInitializer(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
   void visitAssignmentExpression(AssignmentExpression node) {
     TokenType operatorType = node.operator.type;
     Expression lhs = node.leftHandSide;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index be96aee..558ee7d 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1994,17 +1994,12 @@
     }
 
     var initializer = node.initializer;
-    var parent = node.parent as VariableDeclarationList;
-    TypeAnnotation declaredType = parent.type;
-    if (initializer != null) {
+    var parent = node.parent;
+    TypeAnnotation declaredType = (parent as VariableDeclarationList).type;
+    if (declaredType == null && initializer != null) {
       var initializerStaticType = initializer.staticType;
-      if (declaredType == null) {
-        if (initializerStaticType is TypeParameterType) {
-          _flowAnalysis?.flow?.promote(declaredElement, initializerStaticType);
-        }
-      } else if (!parent.isFinal) {
-        _flowAnalysis?.flow?.write(declaredElement, initializerStaticType,
-            viaInitializer: true);
+      if (initializerStaticType is TypeParameterType) {
+        _flowAnalysis?.flow?.promote(declaredElement, initializerStaticType);
       }
     }
   }
diff --git a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
index 970191b..428784d 100644
--- a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
@@ -192,6 +192,27 @@
     );
   }
 
+  /// https://github.com/dart-lang/language/issues/1182#issuecomment-702272641
+  void test_demoteType() {
+    // <T>(T x) -> void
+    var T = typeParameter('T');
+    var rawType = functionTypeNone(
+      typeFormals: [T],
+      parameters: [
+        requiredParameter(type: typeParameterTypeNone(T)),
+      ],
+      returnType: voidNone,
+    );
+
+    var S = typeParameter('S');
+    var S_and_int = typeParameterTypeNone(S, promotedBound: intNone);
+
+    var inferredTypes = _inferCall(rawType, [S_and_int]);
+    var inferredType = inferredTypes[0] as TypeParameterTypeImpl;
+    expect(inferredType.element, S);
+    expect(inferredType.promotedBound, isNull);
+  }
+
   void test_fromLegacy_nonNullableBound() {
     typeSystem = analysisContext.typeSystemLegacy;
 
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index d9eda13..be98561 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -2,6 +2,7 @@
 // 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:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -9,12 +10,40 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(InstanceCreationDriverResolutionTest);
+    defineReflectiveTests(InstanceCreationTest);
+    defineReflectiveTests(InstanceCreationWithNullSafetyTest);
   });
 }
 
 @reflectiveTest
-class InstanceCreationDriverResolutionTest extends PubPackageResolutionTest {
+class InstanceCreationTest extends PubPackageResolutionTest
+    with InstanceCreationTestCases {}
+
+mixin InstanceCreationTestCases on PubPackageResolutionTest {
+  test_demoteType() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  A(T t);
+}
+
+void f<S>(S s) {
+  if (s is int) {
+    A(s);
+  }
+}
+
+''');
+
+    var creation = findNode.instanceCreation('A(s)');
+    var creationType = creation.staticType as InterfaceType;
+
+    assertTypeParameterType(
+      creationType.typeArguments[0],
+      element: findElement.typeParameter('S'),
+      promotedBound: null,
+    );
+  }
+
   test_error_newWithInvalidTypeParameters_implicitNew_inference_top() async {
     await assertErrorsInCode(r'''
 final foo = Map<int>();
@@ -147,3 +176,7 @@
     );
   }
 }
+
+@reflectiveTest
+class InstanceCreationWithNullSafetyTest extends PubPackageResolutionTest
+    with WithNullSafetyMixin, InstanceCreationTestCases {}
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index d83065c..5c49601 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -393,6 +393,25 @@
         expectedType: 'String');
   }
 
+  test_demoteType() async {
+    await assertNoErrorsInCode(r'''
+void test<T>(T t) {}
+
+void f<S>(S s) {
+  if (s is int) {
+    test(s);
+  }
+}
+
+''');
+
+    assertTypeParameterType(
+      findNode.methodInvocation('test(s)').typeArgumentTypes[0],
+      element: findElement.typeParameter('S'),
+      promotedBound: null,
+    );
+  }
+
   test_error_ambiguousImport_topFunction() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 void foo(int _) {}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 49dd0da..011e60f 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -703,7 +703,9 @@
 
   void assertType(Object typeOrNode, String expected) {
     DartType actual;
-    if (typeOrNode is DartType) {
+    if (typeOrNode == null) {
+      actual = typeOrNode;
+    } else if (typeOrNode is DartType) {
       actual = typeOrNode;
     } else if (typeOrNode is Expression) {
       actual = typeOrNode.staticType;
@@ -774,6 +776,15 @@
     expect(node.staticType, isNull);
   }
 
+  void assertTypeParameterType(
+    TypeParameterTypeImpl type, {
+    @required TypeParameterElement element,
+    @required String promotedBound,
+  }) {
+    assertElement(type.element, element);
+    assertType(type.promotedBound, promotedBound);
+  }
+
   Matcher elementMatcher(
     Element declaration, {
     bool isLegacy = false,
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart
index 3b81868..45493d4 100644
--- a/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implicit_this_reference_in_initializer_test.dart
@@ -36,6 +36,43 @@
 ''');
   }
 
+  test_constructorInitializer_assert_superClass() async {
+    await assertErrorsInCode(r'''
+class A {
+  int get f => 0;
+}
+
+class B extends A {
+  B() : assert(f != 0);
+}
+''', [
+      error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 66, 1),
+    ]);
+  }
+
+  test_constructorInitializer_assert_thisClass() async {
+    await assertErrorsInCode(r'''
+class A {
+  A() : assert(f != 0);
+  int get f => 0;
+}
+''', [
+      error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 25, 1),
+    ]);
+  }
+
+  test_constructorInitializer_field() async {
+    await assertErrorsInCode(r'''
+class A {
+  var v;
+  A() : v = f;
+  var f;
+}
+''', [
+      error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 31, 1),
+    ]);
+  }
+
   test_constructorName() async {
     await assertNoErrorsInCode(r'''
 class A {
@@ -48,18 +85,6 @@
 ''');
   }
 
-  test_field() async {
-    await assertErrorsInCode(r'''
-class A {
-  var v;
-  A() : v = f;
-  var f;
-}
-''', [
-      error(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, 31, 1),
-    ]);
-  }
-
   test_field2() async {
     await assertErrorsInCode(r'''
 class A {
diff --git a/pkg/build_integration/lib/file_system/single_root.dart b/pkg/build_integration/lib/file_system/single_root.dart
index 175379d..03c73df 100644
--- a/pkg/build_integration/lib/file_system/single_root.dart
+++ b/pkg/build_integration/lib/file_system/single_root.dart
@@ -2,8 +2,6 @@
 // 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:front_end/src/api_unstable/build_integration.dart';
 
 /// A [FileSystem] that resolves custom URIs to entities under a specified root
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index 7d5fb5db..7bef2ba 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -6,7 +6,7 @@
 publish_to: none
 
 environment:
-  sdk: '>=2.0.0 <3.0.0'
+  sdk: '>=2.1.0 <3.0.0'
 
 dependencies:
   front_end: ^0.1.0
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 4bcc834..b240200 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -1590,7 +1590,7 @@
 
   @override
   TypeInformation visitLogicalExpression(ir.LogicalExpression node) {
-    if (node.operator == '&&') {
+    if (node.operatorEnum == ir.LogicalExpressionOperator.AND) {
       LocalState stateBefore = _state;
       _state = new LocalState.childPath(stateBefore);
       TypeInformation leftInfo = handleCondition(node.left);
@@ -1615,7 +1615,7 @@
       }
       // TODO(sra): Add a selector/mux node to improve precision.
       return _types.boolType;
-    } else if (node.operator == '||') {
+    } else if (node.operatorEnum == ir.LogicalExpressionOperator.OR) {
       LocalState stateBefore = _state;
       _state = new LocalState.childPath(stateBefore);
       TypeInformation leftInfo = handleCondition(node.left);
@@ -1642,7 +1642,7 @@
       return _types.boolType;
     }
     failedAt(CURRENT_ELEMENT_SPANNABLE,
-        "Unexpected logical operator '${node.operator}'.");
+        "Unexpected logical operator '${node.operatorEnum}'.");
     return null;
   }
 
diff --git a/pkg/compiler/lib/src/ir/constants.dart b/pkg/compiler/lib/src/ir/constants.dart
index a905b0c..d1ddfd7 100644
--- a/pkg/compiler/lib/src/ir/constants.dart
+++ b/pkg/compiler/lib/src/ir/constants.dart
@@ -49,13 +49,16 @@
   @override
   ir.Constant evaluate(
       ir.StaticTypeContext staticTypeContext, ir.Expression node,
-      {bool requireConstant: true, bool replaceImplicitConstant: true}) {
+      {ir.TreeNode contextNode,
+      bool requireConstant: true,
+      bool replaceImplicitConstant: true}) {
     errorReporter.requiresConstant = requireConstant;
     if (node is ir.ConstantExpression) {
       ir.Constant constant = node.constant;
       if (constant is ir.UnevaluatedConstant) {
-        ir.Constant result =
-            super.evaluate(staticTypeContext, constant.expression);
+        ir.Constant result = super.evaluate(
+            staticTypeContext, constant.expression,
+            contextNode: contextNode);
         assert(
             result is ir.UnevaluatedConstant ||
                 !result.accept(const UnevaluatedConstantFinder()),
@@ -68,10 +71,11 @@
       return constant;
     }
     if (requireConstant) {
-      return super.evaluate(staticTypeContext, node);
+      return super.evaluate(staticTypeContext, node, contextNode: contextNode);
     } else {
       try {
-        ir.Constant constant = super.evaluate(staticTypeContext, node);
+        ir.Constant constant =
+            super.evaluate(staticTypeContext, node, contextNode: contextNode);
         if (constant is ir.UnevaluatedConstant &&
             constant.expression is ir.InvalidExpression) {
           return null;
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 9180994..bcc2bf3 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -879,7 +879,7 @@
 
   @override
   ir.DartType visitLogicalExpression(ir.LogicalExpression node) {
-    if (node.operator == '&&') {
+    if (node.operatorEnum == ir.LogicalExpressionOperator.AND) {
       visitNode(node.left);
       TypeMap afterLeftWhenTrue = typeMapWhenTrue;
       TypeMap afterLeftWhenFalse = typeMapWhenFalse;
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index ed37f59..474f127 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -18,6 +18,7 @@
 import '../js_emitter/native_emitter.dart';
 import '../native/enqueue.dart';
 import '../native/behavior.dart';
+import '../universe/call_structure.dart';
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/use.dart';
@@ -411,6 +412,14 @@
 
     for (ConstantUse constantUse in impact.constantUses) {
       switch (constantUse.value.kind) {
+        case ConstantValueKind.SET:
+        case ConstantValueKind.MAP:
+        case ConstantValueKind.CONSTRUCTED:
+        case ConstantValueKind.INSTANTIATION:
+        case ConstantValueKind.LIST:
+          transformed.registerStaticUse(StaticUse.staticInvoke(
+              _closedWorld.commonElements.findType, CallStructure.ONE_ARG));
+          break;
         case ConstantValueKind.DEFERRED_GLOBAL:
           _closedWorld.outputUnitData
               .registerConstantDeferredUse(constantUse.value);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index b169612..d80c190 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -3010,12 +3010,8 @@
   @override
   void visitLogicalExpression(ir.LogicalExpression node) {
     SsaBranchBuilder brancher = new SsaBranchBuilder(this);
-    String operator = node.operator;
-    // ir.LogicalExpression claims to allow '??' as an operator but currently
-    // that is expanded into a let-tree.
-    assert(operator == '&&' || operator == '||');
     _handleLogicalExpression(node.left, () => node.right.accept(this), brancher,
-        operator, _sourceInformationBuilder.buildBinary(node));
+        node.operatorEnum, _sourceInformationBuilder.buildBinary(node));
   }
 
   /// Optimizes logical binary expression where the left has the same logical
@@ -3031,22 +3027,22 @@
       ir.Expression left,
       void visitRight(),
       SsaBranchBuilder brancher,
-      String operator,
+      ir.LogicalExpressionOperator operatorEnum,
       SourceInformation sourceInformation) {
-    if (left is ir.LogicalExpression && left.operator == operator) {
+    if (left is ir.LogicalExpression && left.operatorEnum == operatorEnum) {
       ir.Expression innerLeft = left.left;
       ir.Expression middle = left.right;
       _handleLogicalExpression(
           innerLeft,
-          () => _handleLogicalExpression(middle, visitRight, brancher, operator,
-              _sourceInformationBuilder.buildBinary(middle)),
+          () => _handleLogicalExpression(middle, visitRight, brancher,
+              operatorEnum, _sourceInformationBuilder.buildBinary(middle)),
           brancher,
-          operator,
+          operatorEnum,
           sourceInformation);
     } else {
       brancher.handleLogicalBinary(
           () => left.accept(this), visitRight, sourceInformation,
-          isAnd: operator == '&&');
+          isAnd: operatorEnum == ir.LogicalExpressionOperator.AND);
     }
   }
 
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index dcacb48..f959b95 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.4.1
+- Fixed issue where `evaluate` and `evaluateInFrame` requests were not being
+  forwarded to the VM service properly when no external compilation service
+  was registered.
+
 # 1.4.0
 - Added `done` property to `DartDevelopmentService`.
 - Throw `DartDeveloperServiceException` when shutdown occurs during startup.
diff --git a/pkg/dds/lib/src/expression_evaluator.dart b/pkg/dds/lib/src/expression_evaluator.dart
index d514d60..348d8f4 100644
--- a/pkg/dds/lib/src/expression_evaluator.dart
+++ b/pkg/dds/lib/src/expression_evaluator.dart
@@ -11,6 +11,18 @@
   _ExpressionEvaluator(this.dds);
 
   Future<Map<String, dynamic>> execute(json_rpc.Parameters parameters) async {
+    _DartDevelopmentServiceClient externalClient =
+        dds.clientManager.findFirstClientThatHandlesService(
+      'compileExpression',
+    );
+    // If no compilation service is registered, just forward to the VM service.
+    if (externalClient == null) {
+      return await dds._vmServiceClient.sendRequest(
+        parameters.method,
+        parameters.value,
+      );
+    }
+
     final isolateId = parameters['isolateId'].asString;
     final expression = parameters['expression'].asString;
     Map<String, dynamic> buildScopeResponse;
@@ -56,6 +68,11 @@
         dds.clientManager.findFirstClientThatHandlesService(
       'compileExpression',
     );
+    if (externalClient == null) {
+      throw _RpcErrorCodes.buildRpcException(
+          _RpcErrorCodes.kExpressionCompilationError,
+          data: 'compileExpression service disappeared.');
+    }
 
     final compileParams = <String, dynamic>{
       'isolateId': isolateId,
@@ -70,20 +87,11 @@
     if (klass != null) {
       compileParams['klass'] = klass;
     }
-    // TODO(bkonyi): handle service disappeared case?
     try {
-      if (externalClient != null) {
-        return (await externalClient.sendRequest(
-          'compileExpression',
-          compileParams,
-        ))['kernelBytes'];
-      } else {
-        // Fallback to compiling using the kernel service.
-        return (await dds._vmServiceClient.sendRequest(
-          '_compileExpression',
-          compileParams,
-        ))['kernelBytes'];
-      }
+      return (await externalClient.sendRequest(
+        'compileExpression',
+        compileParams,
+      ))['kernelBytes'];
     } on json_rpc.RpcException catch (e) {
       throw _RpcErrorCodes.buildRpcException(
         _RpcErrorCodes.kExpressionCompilationError,
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index 1874281..a7ae669 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
   A library used to spawn the Dart Developer Service, used to communicate with
   a Dart VM Service instance.
 
-version: 1.4.0
+version: 1.4.1
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
 
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index f4d1611..9c2d399 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -964,6 +964,11 @@
         js_ast.ClassExpression(
             _emitTemporaryId(mixinName), baseClass, forwardingMethodStubs)
       ]));
+      // Emit a deferred superclass statement for virtual mixin classes since
+      // dart.mixinOn requires the virtual object to have a valid prototype.
+      var virtualSupertype = baseClass ?? emitDeferredType(supertype);
+      body.add(
+          runtimeStatement('setBaseClass(#, #)', [mixinId, virtualSupertype]));
 
       emitMixinConstructors(mixinId, mixinType);
       hasUnnamedSuper = hasUnnamedSuper || _hasUnnamedConstructor(mixinClass);
@@ -3429,9 +3434,9 @@
         return js.call(code, [_visitTest(node.left), _visitTest(node.right)]);
       }
 
-      var op = node.operator;
-      if (op == '&&') return shortCircuit('# && #');
-      if (op == '||') return shortCircuit('# || #');
+      var op = node.operatorEnum;
+      if (op == LogicalExpressionOperator.AND) return shortCircuit('# && #');
+      if (op == LogicalExpressionOperator.OR) return shortCircuit('# || #');
     }
 
     if (node is AsExpression && node.isTypeError) {
diff --git a/pkg/front_end/analysis_options.yaml b/pkg/front_end/analysis_options.yaml
index 9021253..21d20ef 100644
--- a/pkg/front_end/analysis_options.yaml
+++ b/pkg/front_end/analysis_options.yaml
@@ -17,4 +17,5 @@
     - valid_regexps
     - package_api_docs
     - lines_longer_than_80_chars
+    - unrelated_type_equality_checks
     # - always_specify_types
diff --git a/pkg/front_end/lib/src/api_prototype/language_version.dart b/pkg/front_end/lib/src/api_prototype/language_version.dart
index 2ce4a67..a77b716 100644
--- a/pkg/front_end/lib/src/api_prototype/language_version.dart
+++ b/pkg/front_end/lib/src/api_prototype/language_version.dart
@@ -7,7 +7,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
     show LanguageVersionToken, Scanner, ScannerConfiguration, scan;
 
-import 'package:kernel/ast.dart' show Version, defaultLanguageVersion;
+import 'package:kernel/ast.dart' show Version;
 export 'package:kernel/ast.dart' show Version;
 
 import 'package:package_config/package_config.dart'
@@ -23,6 +23,8 @@
 
 import 'compiler_options.dart' show CompilerOptions;
 
+import 'experimental_flags.dart'
+    show ExperimentalFlag, experimentReleasedVersion;
 import 'file_system.dart' show FileSystem, FileSystemException;
 
 /// Gets the language version for a specific URI.
@@ -125,11 +127,13 @@
   });
 }
 
+/// Returns `true` if the language version of [uri] does not support null
+/// safety.
 Future<bool> uriUsesLegacyLanguageVersion(
     Uri uri, CompilerOptions options) async {
   // This method is here in order to use the opt out hack here for test
   // sources.
   if (SourceLibraryBuilder.isOptOutTest(uri)) return true;
   Version uriVersion = await languageVersionForUri(uri, options);
-  return (uriVersion < defaultLanguageVersion);
+  return (uriVersion < experimentReleasedVersion[ExperimentalFlag.nonNullable]);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index de52a7e..563ab17 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1773,6 +1773,7 @@
     }
   }
 
+  /// Handle `a && b` and `a || b`.
   void doLogicalExpression(Token token) {
     Expression argument = popForValue();
     Expression receiver = pop();
@@ -2407,11 +2408,12 @@
     assert(assignmentOperator.stringValue == "=");
     AssignedVariablesNodeInfo<VariableDeclaration> assignedVariablesInfo;
     bool isLate = (currentLocalVariableModifiers & lateMask) != 0;
+    Expression initializer = popForValue();
     if (isLate) {
       assignedVariablesInfo = typeInferrer?.assignedVariables
           ?.deferNode(isClosureOrLateVariableInitializer: true);
     }
-    pushNewLocalVariable(popForValue(), equalsToken: assignmentOperator);
+    pushNewLocalVariable(initializer, equalsToken: assignmentOperator);
     if (isLate) {
       VariableDeclaration node = peek();
       // This is matched by the call to [beginNode] in
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 a9808d6..ea3518e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -727,9 +727,8 @@
       return constantEvaluator.evaluate(_staticTypeContext, node);
     }
 
-    return constantEvaluator.runInsideContext(treeContext, () {
-      return constantEvaluator.evaluate(_staticTypeContext, node);
-    });
+    return constantEvaluator.evaluate(_staticTypeContext, node,
+        contextNode: treeContext);
   }
 
   Expression makeConstantExpression(Constant constant, Expression node) {
@@ -780,8 +779,6 @@
   final BoolConstant trueConstant = new BoolConstant(true);
   final BoolConstant falseConstant = new BoolConstant(false);
 
-  final List<TreeNode> contextChain = [];
-
   InstanceBuilder instanceBuilder;
   EvaluationEnvironment env;
   Set<Expression> replacementNodes = new Set<Expression>.identity();
@@ -882,7 +879,8 @@
   /// Returns UnevaluatedConstant if the constant could not be evaluated.
   /// If the expression in the UnevaluatedConstant is an InvalidExpression,
   /// an error occurred during constant evaluation.
-  Constant evaluate(StaticTypeContext context, Expression node) {
+  Constant evaluate(StaticTypeContext context, Expression node,
+      {TreeNode contextNode}) {
     _staticTypeContext = context;
     seenUnevaluatedChild = false;
     lazyDepth = 0;
@@ -898,10 +896,9 @@
           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);
+        if (contextNode != null && contextNode != result.node) {
+          final Uri uri = getFileUri(contextNode);
+          final int fileOffset = getFileOffset(uri, contextNode);
           contextMessages.add(
               messageConstEvalContext.withLocation(uri, fileOffset, noLength));
         }
@@ -1060,32 +1057,6 @@
     return _evaluateSubexpression(node);
   }
 
-  T runInsideContext<T>(TreeNode node, T fun()) {
-    try {
-      pushContext(node);
-      return fun();
-    } finally {
-      popContext(node);
-    }
-  }
-
-  T runInsideContextIfNoContext<T>(TreeNode node, T fun()) {
-    if (contextChain.isEmpty) {
-      return runInsideContext(node, fun);
-    } else {
-      return fun();
-    }
-  }
-
-  void pushContext(TreeNode contextNode) {
-    contextChain.add(contextNode);
-  }
-
-  void popContext(TreeNode contextNode) {
-    assert(contextChain.last == contextNode);
-    contextChain.length = contextChain.length - 1;
-  }
-
   @override
   Constant defaultTreeNode(Node node) {
     // Only a subset of the expression language is valid for constant
@@ -1142,9 +1113,7 @@
     Constant constant = node.constant;
     Constant result = constant;
     if (constant is UnevaluatedConstant) {
-      result = runInsideContext(constant.expression, () {
-        return _evaluateSubexpression(constant.expression);
-      });
+      result = _evaluateSubexpression(constant.expression);
       if (result is AbortConstant) return result;
     }
     // If there were already constants in the AST then we make sure we
@@ -1313,25 +1282,23 @@
 
     // Start building a new instance.
     return withNewInstanceBuilder(klass, typeArguments, () {
-      return runInsideContextIfNoContext(node, () {
-        // "Run" the constructor (and any super constructor calls), which will
-        // initialize the fields of the new instance.
-        if (shouldBeUnevaluated) {
-          enterLazy();
-          AbortConstant error = handleConstructorInvocation(
-              constructor, typeArguments, positionals, named);
-          if (error != null) return error;
-          leaveLazy();
-          return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
-        }
+      // "Run" the constructor (and any super constructor calls), which will
+      // initialize the fields of the new instance.
+      if (shouldBeUnevaluated) {
+        enterLazy();
         AbortConstant error = handleConstructorInvocation(
             constructor, typeArguments, positionals, named);
         if (error != null) return error;
-        if (shouldBeUnevaluated) {
-          return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
-        }
-        return canonicalize(instanceBuilder.buildInstance());
-      });
+        leaveLazy();
+        return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
+      }
+      AbortConstant error = handleConstructorInvocation(
+          constructor, typeArguments, positionals, named);
+      if (error != null) return error;
+      if (shouldBeUnevaluated) {
+        return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
+      }
+      return canonicalize(instanceBuilder.buildInstance());
     });
   }
 
@@ -1524,140 +1491,136 @@
       List<DartType> typeArguments,
       List<Constant> positionalArguments,
       Map<String, Constant> namedArguments) {
-    return runInsideContext(constructor, () {
-      return withNewEnvironment(() {
-        final Class klass = constructor.enclosingClass;
-        final FunctionNode function = constructor.function;
+    return withNewEnvironment(() {
+      final Class klass = constructor.enclosingClass;
+      final FunctionNode function = constructor.function;
 
-        // We simulate now the constructor invocation.
+      // We simulate now the constructor invocation.
 
-        // Step 1) Map type arguments and normal arguments from caller to
-        //         callee.
-        for (int i = 0; i < klass.typeParameters.length; i++) {
-          env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
-        }
-        for (int i = 0; i < function.positionalParameters.length; i++) {
-          final VariableDeclaration parameter =
-              function.positionalParameters[i];
-          final Constant value = (i < positionalArguments.length)
-              ? 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);
-        }
+      // Step 1) Map type arguments and normal arguments from caller to
+      //         callee.
+      for (int i = 0; i < klass.typeParameters.length; i++) {
+        env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
+      }
+      for (int i = 0; i < function.positionalParameters.length; i++) {
+        final VariableDeclaration parameter = function.positionalParameters[i];
+        final Constant value = (i < positionalArguments.length)
+            ? 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);
+      }
 
-        // Step 2) Run all initializers (including super calls) with environment
-        //         setup.
-        for (final Field field in klass.fields) {
-          if (!field.isStatic) {
-            Constant constant =
-                _evaluateNullableSubexpression(field.initializer);
-            if (constant is AbortConstant) return constant;
-            instanceBuilder.setFieldValue(field, constant);
+      // Step 2) Run all initializers (including super calls) with environment
+      //         setup.
+      for (final Field field in klass.fields) {
+        if (!field.isStatic) {
+          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) {
+          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;
+          Constant constant = _evaluateSubexpression(variable.initializer);
+          if (constant is AbortConstant) return constant;
+          env.addVariableValue(variable, constant);
+        } else if (init is SuperInitializer) {
+          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;
           }
-        }
-        for (final Initializer init in constructor.initializers) {
-          if (init is FieldInitializer) {
-            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;
-            Constant constant = _evaluateSubexpression(variable.initializer);
-            if (constant is AbortConstant) return constant;
-            env.addVariableValue(variable, constant);
-          } else if (init is SuperInitializer) {
-            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);
+          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].
-            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) {
-            AbortConstant error = checkAssert(init.statement);
-            if (error != null) return error;
-          } else {
-            // 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}".');
+          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].
+          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);
 
-        for (UnevaluatedConstant constant in env.unevaluatedUnreadConstants) {
-          instanceBuilder.unusedArguments.add(extract(constant));
+          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) {
+          AbortConstant error = checkAssert(init.statement);
+          if (error != null) return error;
+        } else {
+          // 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}".');
         }
-        return null;
-      });
+      }
+
+      for (UnevaluatedConstant constant in env.unevaluatedUnreadConstants) {
+        instanceBuilder.unusedArguments.add(extract(constant));
+      }
+      return null;
     });
   }
 
@@ -1901,11 +1864,13 @@
       Constant right = _evaluateSubexpression(node.right);
       if (right is AbortConstant) return right;
       leaveLazy();
-      return unevaluated(node,
-          new LogicalExpression(extract(left), node.operator, extract(right)));
+      return unevaluated(
+          node,
+          new LogicalExpression(
+              extract(left), node.operatorEnum, extract(right)));
     }
-    switch (node.operator) {
-      case '||':
+    switch (node.operatorEnum) {
+      case LogicalExpressionOperator.OR:
         if (left is BoolConstant) {
           if (left.value) return trueConstant;
 
@@ -1918,7 +1883,7 @@
           return createErrorConstant(
               node,
               templateConstEvalInvalidBinaryOperandType.withArguments(
-                  node.operator,
+                  logicalExpressionOperatorToString(node.operatorEnum),
                   left,
                   typeEnvironment.coreTypes.boolLegacyRawType,
                   right.getType(_staticTypeContext),
@@ -1927,8 +1892,10 @@
         return createErrorConstant(
             node,
             templateConstEvalInvalidMethodInvocation.withArguments(
-                node.operator, left, isNonNullableByDefault));
-      case '&&':
+                logicalExpressionOperatorToString(node.operatorEnum),
+                left,
+                isNonNullableByDefault));
+      case LogicalExpressionOperator.AND:
         if (left is BoolConstant) {
           if (!left.value) return falseConstant;
 
@@ -1941,7 +1908,7 @@
           return createErrorConstant(
               node,
               templateConstEvalInvalidBinaryOperandType.withArguments(
-                  node.operator,
+                  logicalExpressionOperatorToString(node.operatorEnum),
                   left,
                   typeEnvironment.coreTypes.boolLegacyRawType,
                   right.getType(_staticTypeContext),
@@ -1950,18 +1917,17 @@
         return createErrorConstant(
             node,
             templateConstEvalInvalidMethodInvocation.withArguments(
-                node.operator, left, isNonNullableByDefault));
-      case '??':
-        // Unreachable. LogicalExpression never created with `??`.
-        return (left is! NullConstant)
-            ? left
-            : _evaluateSubexpression(node.right);
+                logicalExpressionOperatorToString(node.operatorEnum),
+                left,
+                isNonNullableByDefault));
       default:
         // Probably unreachable.
         return createErrorConstant(
             node,
             templateConstEvalInvalidMethodInvocation.withArguments(
-                node.operator, left, isNonNullableByDefault));
+                logicalExpressionOperatorToString(node.operatorEnum),
+                left,
+                isNonNullableByDefault));
     }
   }
 
@@ -2073,16 +2039,14 @@
   Constant _evaluateExpressionInContext(Member member, Expression expression) {
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext(member, typeEnvironment);
-    Constant constant = runInsideContext(member, () {
-      Constant constant = _evaluateSubexpression(expression);
-      if (constant is AbortConstant) return constant;
+    Constant constant = _evaluateSubexpression(expression);
+    if (constant is! AbortConstant) {
       if (_staticTypeContext.nonNullableByDefaultCompiledMode ==
               NonNullableByDefaultCompiledMode.Agnostic &&
           evaluationMode == EvaluationMode.weak) {
         constant = _weakener.visitConstant(constant) ?? constant;
       }
-      return constant;
-    });
+    }
     _staticTypeContext = oldStaticTypeContext;
     return constant;
   }
@@ -2753,22 +2717,18 @@
   T withNewInstanceBuilder<T>(
       Class klass, List<DartType> typeArguments, T fn()) {
     InstanceBuilder old = instanceBuilder;
-    try {
-      instanceBuilder = new InstanceBuilder(this, klass, typeArguments);
-      return fn();
-    } finally {
-      instanceBuilder = old;
-    }
+    instanceBuilder = new InstanceBuilder(this, klass, typeArguments);
+    T result = fn();
+    instanceBuilder = old;
+    return result;
   }
 
   T withNewEnvironment<T>(T fn()) {
     final EvaluationEnvironment oldEnv = env;
-    try {
-      env = new EvaluationEnvironment();
-      return fn();
-    } finally {
-      env = oldEnv;
-    }
+    env = new EvaluationEnvironment();
+    T result = fn();
+    env = oldEnv;
+    return result;
   }
 
   /// Binary operation between two operands, at least one of which is a double.
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 90787ec0..b683259 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -424,12 +424,21 @@
   }
 
   /// Return a representation of a logical expression at the given [fileOffset]
-  /// having the [leftOperand], [rightOperand] and the [operator]
+  /// having the [leftOperand], [rightOperand] and the [operatorString]
   /// (either `&&` or `||`).
   Expression createLogicalExpression(int fileOffset, Expression leftOperand,
-      String operator, Expression rightOperand) {
+      String operatorString, Expression rightOperand) {
     assert(fileOffset != null);
-    assert(operator == '&&' || operator == '||');
+    LogicalExpressionOperator operator;
+    if (operatorString == '&&') {
+      operator = LogicalExpressionOperator.AND;
+    } else if (operatorString == '||') {
+      operator = LogicalExpressionOperator.OR;
+    } else {
+      throw new UnsupportedError(
+          "Unhandled logical operator '$operatorString'");
+    }
+
     return new LogicalExpression(leftOperand, operator, rightOperand)
       ..fileOffset = fileOffset;
   }
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 3fb157b..76e41cb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1739,15 +1739,15 @@
         isVoidAllowed: false);
     Expression left = inferrer.ensureAssignableResult(boolType, leftResult);
     node.left = left..parent = node;
-    inferrer.flowAnalysis
-        .logicalBinaryOp_rightBegin(node.left, isAnd: node.operator == '&&');
+    inferrer.flowAnalysis.logicalBinaryOp_rightBegin(node.left,
+        isAnd: node.operatorEnum == LogicalExpressionOperator.AND);
     ExpressionInferenceResult rightResult = inferrer.inferExpression(
         node.right, boolType, !inferrer.isTopLevel,
         isVoidAllowed: false);
     Expression right = inferrer.ensureAssignableResult(boolType, rightResult);
     node.right = right..parent = node;
-    inferrer.flowAnalysis
-        .logicalBinaryOp_end(node, node.right, isAnd: node.operator == '&&');
+    inferrer.flowAnalysis.logicalBinaryOp_end(node, node.right,
+        isAnd: node.operatorEnum == LogicalExpressionOperator.AND);
     return new ExpressionInferenceResult(boolType, node);
   }
 
@@ -5740,17 +5740,8 @@
     }
     if (initializerResult != null) {
       DartType initializerType = initializerResult.inferredType;
-      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);
-        }
+      if (node.isImplicitlyTyped && initializerType is TypeParameterType) {
+        inferrer.flowAnalysis.promote(node, initializerType);
       }
       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 eef5d01..ea4e30f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -932,13 +932,14 @@
         SourceLibraryBuilder library = builder.library;
         if (library.isNonNullableByDefault) {
           if (constructor.isConst && lateFinalFields.isNotEmpty) {
-            builder.addProblem(messageConstConstructorLateFinalFieldError,
-                constructor.fileOffset, noLength,
-                context: lateFinalFields
-                    .map((field) =>
-                        messageConstConstructorLateFinalFieldCause.withLocation(
-                            field.fileUri, field.charOffset, noLength))
-                    .toList());
+            for (FieldBuilder field in lateFinalFields) {
+              builder.addProblem(messageConstConstructorLateFinalFieldError,
+                  field.charOffset, noLength,
+                  context: [
+                    messageConstConstructorLateFinalFieldCause.withLocation(
+                        constructor.fileUri, constructor.fileOffset, noLength)
+                  ]);
+            }
             lateFinalFields.clear();
           }
         }
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index c81c0a0..92502bf 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -375,7 +375,7 @@
       if (member.enclosingClass.isEnum) {
         if (member is Constructor ||
             member.isInstanceMember ||
-            member.name == 'values') {
+            member.name.text == 'values') {
           return;
         }
       }
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 64a47d6..4e76c8b 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -2960,10 +2960,10 @@
   severity: CONTEXT
 
 ConstConstructorLateFinalFieldError:
-  template: "Constructor is marked 'const' so fields can't be late."
+  template: "Can't have a late final field in a class with a const constructor."
 
 ConstConstructorLateFinalFieldCause:
-  template: "Field is late, but constructor is 'const'."
+  template: "This constructor is const."
   severity: CONTEXT
 
 ConstConstructorRedirectionToNonConst:
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index af9f637..ed80870 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -153,6 +153,9 @@
 
 const String ENABLE_FULL_COMPILE = " full compile ";
 
+const String UPDATE_EXPECTATIONS = "updateExpectations";
+const String UPDATE_COMMENTS = "updateComments";
+
 const String EXPECTATIONS = '''
 [
   {
@@ -290,6 +293,9 @@
   final bool updateExpectations;
 
   @override
+  String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
+  @override
   final ExpectationSet expectationSet =
       new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
 
@@ -687,8 +693,8 @@
     bool weak = environment["weak"] == "true";
     bool onlyCrashes = environment["onlyCrashes"] == "true";
     bool ignoreExpectations = environment["ignoreExpectations"] == "true";
-    bool updateExpectations = environment["updateExpectations"] == "true";
-    bool updateComments = environment["updateComments"] == "true";
+    bool updateExpectations = environment[UPDATE_EXPECTATIONS] == "true";
+    bool updateComments = environment[UPDATE_COMMENTS] == "true";
     bool skipVm = environment["skipVm"] == "true";
     bool verify = environment["verify"] != "false";
     bool kernelTextSerialization =
@@ -792,8 +798,8 @@
     if (stressConstantEvaluatorVisitor.success > 0) {
       result.extraConstantStrings.addAll(stressConstantEvaluatorVisitor.output);
       result.extraConstantStrings.add("Extra constant evaluation: "
-          "tries: ${stressConstantEvaluatorVisitor.tries}, "
-          "successes: ${stressConstantEvaluatorVisitor.success}");
+          "evaluated: ${stressConstantEvaluatorVisitor.tries}, "
+          "effectively constant: ${stressConstantEvaluatorVisitor.success}");
     }
     return pass(result);
   }
@@ -1098,7 +1104,8 @@
                     description, p, userLibraries, options, sourceTarget),
                 context.expectationSet["InstrumentationMismatch"],
                 instrumentation.problemsAsString,
-                null);
+                null,
+                autoFixCommand: '${UPDATE_COMMENTS}=true');
           }
         }
       }
diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart
index db5dda5..aeb3343 100644
--- a/pkg/front_end/test/fasta/textual_outline_suite.dart
+++ b/pkg/front_end/test/fasta/textual_outline_suite.dart
@@ -22,6 +22,7 @@
         runMe;
 
 import '../utils/kernel_chain.dart' show MatchContext;
+import 'testing/suite.dart' show UPDATE_EXPECTATIONS;
 
 const List<Map<String, String>> EXPECTATIONS = [
   {
@@ -52,6 +53,10 @@
 
 class Context extends ChainContext with MatchContext {
   final bool updateExpectations;
+
+  @override
+  String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
   Context(this.updateExpectations);
 
   final List<Step> steps = const <Step>[
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 632e9ee..79145fb 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -46,6 +46,7 @@
         TestDescription,
         runMe;
 
+import 'fasta/testing/suite.dart' show UPDATE_EXPECTATIONS;
 import 'utils/kernel_chain.dart' show MatchContext;
 
 import 'parser_test_listener.dart' show ParserTestListener;
@@ -86,6 +87,10 @@
 
 class Context extends ChainContext with MatchContext {
   final bool updateExpectations;
+
+  @override
+  String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
   final bool addTrace;
   final bool annotateLines;
   final String suiteName;
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 3b6c56f..9bd21db 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1377,6 +1377,7 @@
 holds
 hood
 hooks
+horns
 horribly
 host
 hostnames
@@ -1969,6 +1970,7 @@
 noticed
 notifies
 now
+nowhere
 null
 nullability
 nullable
diff --git a/pkg/front_end/test/unit_test_suites.dart b/pkg/front_end/test/unit_test_suites.dart
index 1f42047..c106ebf 100644
--- a/pkg/front_end/test/unit_test_suites.dart
+++ b/pkg/front_end/test/unit_test_suites.dart
@@ -45,9 +45,10 @@
   final bool printFailureLog;
   final Uri outputDirectory;
   final String testFilter;
+  final List<String> environmentOptions;
 
   Options(this.configurationName, this.verbose, this.printFailureLog,
-      this.outputDirectory, this.testFilter);
+      this.outputDirectory, this.testFilter, this.environmentOptions);
 
   static Options parse(List<String> args) {
     var parser = new ArgParser()
@@ -59,7 +60,9 @@
       ..addFlag("verbose",
           abbr: "v", help: "print additional information", defaultsTo: false)
       ..addFlag("print",
-          abbr: "p", help: "print failure logs", defaultsTo: false);
+          abbr: "p", help: "print failure logs", defaultsTo: false)
+      ..addMultiOption('environment',
+          abbr: 'D', help: "environment options for the test suite");
     var parsedArguments = parser.parse(args);
     String outputPath = parsedArguments["output-directory"] ?? ".";
     Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
@@ -75,7 +78,8 @@
         parsedArguments["verbose"],
         parsedArguments["print"],
         outputDirectory,
-        filter);
+        filter,
+        parsedArguments['environment']);
   }
 }
 
@@ -142,8 +146,17 @@
       if (result.trace != null) {
         failureLog = "$failureLog\n\n${result.trace}";
       }
-      failureLog = "$failureLog\n\nRe-run this test: dart "
-          "pkg/front_end/test/unit_test_suites.dart -p $testName";
+      if (result.autoFixCommand != null) {
+        failureLog = "$failureLog\n\n"
+            "To re-run this test, run:\n\n"
+            "   dart pkg/front_end/test/unit_test_suites.dart -p $testName\n\n"
+            "To automatically update the test expectations, run:\n\n"
+            "   dart pkg/front_end/test/unit_test_suites.dart -p $testName "
+            "-D${result.autoFixCommand}\n";
+      } else {
+        failureLog = "$failureLog\n\nRe-run this test: dart "
+            "pkg/front_end/test/unit_test_suites.dart -p $testName";
+      }
       String outcome = "${result.outcome}";
       logsPort.send(jsonEncode({
         "name": testName,
@@ -287,6 +300,8 @@
   final bool printFailureLog;
   final String configurationName;
   final String testFilter;
+  final List<String> environmentOptions;
+
   const SuiteConfiguration(
       this.name,
       this.resultsPort,
@@ -294,7 +309,8 @@
       this.verbose,
       this.printFailureLog,
       this.configurationName,
-      this.testFilter);
+      this.testFilter,
+      this.environmentOptions);
 }
 
 void runSuite(SuiteConfiguration configuration) {
@@ -312,9 +328,11 @@
       configuration.verbose,
       configuration.printFailureLog,
       configuration.configurationName);
-  runMe(
-      <String>[if (configuration.testFilter != null) configuration.testFilter],
-      suite.createContext,
+  runMe(<String>[
+    if (configuration.testFilter != null) configuration.testFilter,
+    if (configuration.environmentOptions != null)
+      for (String option in configuration.environmentOptions) '-D${option}',
+  ], suite.createContext,
       me: suiteUri,
       configurationPath: suite.testingRootPath,
       logger: logger,
@@ -359,7 +377,8 @@
         options.verbose,
         options.printFailureLog,
         options.configurationName,
-        filter);
+        filter,
+        options.environmentOptions);
     Future future = Future<bool>(() async {
       Stopwatch stopwatch = Stopwatch()..start();
       print("Running suite $name");
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index d530ed8..804af3c 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -66,6 +66,8 @@
 abstract class MatchContext implements ChainContext {
   bool get updateExpectations;
 
+  String get updateExpectationsOption;
+
   ExpectationSet get expectationSet;
 
   Expectation get expectationFileMismatch =>
@@ -93,7 +95,10 @@
         String diff = await runDiff(expectedFile.uri, actual);
         onMismatch ??= expectationFileMismatch;
         return new Result<O>(output, onMismatch,
-            "$uri doesn't match ${expectedFile.uri}\n$diff", null);
+            "$uri doesn't match ${expectedFile.uri}\n$diff", null,
+            autoFixCommand: onMismatch == expectationFileMismatch
+                ? updateExpectationsOption
+                : null);
       } else {
         return new Result<O>.pass(output);
       }
@@ -108,7 +113,8 @@
           """
 Please create file ${expectedFile.path} with this content:
 $actual""",
-          null);
+          null,
+          autoFixCommand: updateExpectationsOption);
     }
   }
 
diff --git a/pkg/front_end/testcases/agnostic/as.dart.outline.expect b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
index e6f3b0e..b6d34a3 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
@@ -11,4 +11,4 @@
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/agnostic/identical.dart.outline.expect b/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
index 999e3a1..a3ec3dc 100644
--- a/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/identical.dart.outline.expect
@@ -14,4 +14,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/agnostic/is.dart.outline.expect b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
index daa025c..0046b04 100644
--- a/pkg/front_end/testcases/agnostic/is.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
@@ -11,4 +11,4 @@
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/agnostic/map.dart.outline.expect b/pkg/front_end/testcases/agnostic/map.dart.outline.expect
index c93a348..e1ceefa 100644
--- a/pkg/front_end/testcases/agnostic/map.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/map.dart.outline.expect
@@ -14,4 +14,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/agnostic/set.dart.outline.expect b/pkg/front_end/testcases/agnostic/set.dart.outline.expect
index 4e2d66b..53dca31 100644
--- a/pkg/front_end/testcases/agnostic/set.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/set.dart.outline.expect
@@ -14,4 +14,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.outline.expect b/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
index 4b30ee1..ff75d1b 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.outline.expect
@@ -48,4 +48,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 b5ae761..55715f8 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
@@ -93,4 +93,4 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///conflict_with_object.dart:21:19 -> BoolConstant(true)
-Extra constant evaluation: tries: 37, successes: 1
+Extra constant evaluation: evaluated: 37, effectively constant: 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 8b2c087..c510c9c 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
@@ -100,4 +100,4 @@
 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
+Extra constant evaluation: evaluated: 95, effectively constant: 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 4cbf136..47097a2 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
@@ -98,4 +98,4 @@
 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
+Extra constant evaluation: evaluated: 121, effectively constant: 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 d52f3d6..7239cba 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
@@ -141,4 +141,4 @@
 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
+Extra constant evaluation: evaluated: 217, effectively constant: 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 c3ec8472..245ead1 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
@@ -324,4 +324,4 @@
 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
+Extra constant evaluation: evaluated: 836, effectively constant: 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 15d3500..cd0b1b3 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
@@ -56,4 +56,4 @@
 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
+Extra constant evaluation: evaluated: 122, effectively constant: 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 ec864e9..f406204 100644
--- a/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/index.dart.strong.transformed.expect
@@ -202,4 +202,4 @@
 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
+Extra constant evaluation: evaluated: 579, effectively constant: 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 f1cf6c6..b117363 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
@@ -164,4 +164,4 @@
 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
+Extra constant evaluation: evaluated: 325, effectively constant: 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 45e1923..aabacb2 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
@@ -124,4 +124,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
+Extra constant evaluation: evaluated: 144, effectively constant: 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 f28f4cc..d9024f1 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
@@ -55,4 +55,4 @@
 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
+Extra constant evaluation: evaluated: 49, effectively constant: 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 fac7d9e..a4adb78 100644
--- a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
@@ -44,4 +44,4 @@
 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
+Extra constant evaluation: evaluated: 56, effectively constant: 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 2b2a32d..fd2532c 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
@@ -112,4 +112,4 @@
 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
+Extra constant evaluation: evaluated: 368, effectively constant: 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 e7577c2..6d78eba 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
@@ -164,4 +164,4 @@
 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
+Extra constant evaluation: evaluated: 325, effectively constant: 16
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
index 273a7fe..61148bb 100644
--- a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
@@ -272,4 +272,4 @@
 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
+Extra constant evaluation: evaluated: 10, effectively constant: 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 14f6467..c556119 100644
--- a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
@@ -403,4 +403,4 @@
 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
+Extra constant evaluation: evaluated: 73, effectively constant: 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 86ada81..54ce84a 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
@@ -53,4 +53,4 @@
 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
+Extra constant evaluation: evaluated: 9, effectively constant: 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 74e9e52..8352f12 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
@@ -54,4 +54,4 @@
 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
+Extra constant evaluation: evaluated: 11, effectively constant: 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 a2c0119..a3676d1 100644
--- a/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
@@ -62,4 +62,4 @@
 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
+Extra constant evaluation: evaluated: 11, effectively constant: 11
diff --git a/pkg/front_end/testcases/general/bug33099.dart.outline.expect b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
index ce6b8f1..22c739f 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
@@ -68,4 +68,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 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 6ab71cc..2f10dab 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
@@ -87,4 +87,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///bug33099.dart:21:42 -> TypeLiteralConstant(MyTest2*)
-Extra constant evaluation: tries: 33, successes: 1
+Extra constant evaluation: evaluated: 33, effectively constant: 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 857760f..59f300e 100644
--- a/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
@@ -28,4 +28,4 @@
 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
+Extra constant evaluation: evaluated: 21, effectively constant: 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 8ee35ad..fdd58da 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
@@ -39,4 +39,4 @@
 
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 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 a73d318..2c3a4c0 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
@@ -43,4 +43,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 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 da2fefe..0dde286 100644
--- a/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constant_truncate.dart.outline.expect
@@ -95,4 +95,4 @@
 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
+Extra constant evaluation: evaluated: 76, effectively constant: 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 3d56c16..9d88e9d 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
@@ -427,4 +427,4 @@
 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
+Extra constant evaluation: evaluated: 115, effectively constant: 12
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
index a9222e8..2eaf487 100644
--- a/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.outline.expect
@@ -94,4 +94,4 @@
 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
+Extra constant evaluation: evaluated: 48, effectively constant: 7
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
index acaf574..d5afd92 100644
--- 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
@@ -213,4 +213,4 @@
 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
+Extra constant evaluation: evaluated: 34, effectively constant: 4
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
index 59c28c6..04597c0 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
@@ -358,4 +358,4 @@
 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
+Extra constant evaluation: evaluated: 90, effectively constant: 59
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
index e31b315..2f0bfb0 100644
--- 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
@@ -104,4 +104,4 @@
 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
+Extra constant evaluation: evaluated: 38, effectively constant: 24
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
index 4897983..41ed046 100644
--- 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
@@ -68,4 +68,4 @@
 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
+Extra constant evaluation: evaluated: 29, effectively constant: 29
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
index 715ad66..0c36235 100644
--- a/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.outline.expect
@@ -101,4 +101,4 @@
 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
+Extra constant evaluation: evaluated: 37, effectively constant: 23
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
index c1a907c..f61a38d 100644
--- 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
@@ -19,4 +19,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 5
diff --git a/pkg/front_end/testcases/general/constants/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
index 7b33312..055199f 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
@@ -453,4 +453,4 @@
 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
+Extra constant evaluation: evaluated: 136, effectively constant: 84
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
index 2ad931e..e9451ab 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
@@ -630,4 +630,4 @@
 
 Extra constant evaluation status:
 Evaluated: PropertyGet @ org-dartlang-testcase:///various.dart:111:26 -> IntConstant(5)
-Extra constant evaluation: tries: 12, successes: 1
+Extra constant evaluation: evaluated: 12, effectively constant: 1
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
index aff93a8..9745070 100644
--- 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
@@ -58,4 +58,4 @@
 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
+Extra constant evaluation: evaluated: 39, effectively constant: 9
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
index 62817bb..d4deb80 100644
--- 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
@@ -140,4 +140,4 @@
 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
+Extra constant evaluation: evaluated: 34, effectively constant: 10
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
index d579c1c..8dfa191 100644
--- 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
@@ -43,4 +43,4 @@
 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
+Extra constant evaluation: evaluated: 25, effectively constant: 20
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
index b99c5b8..44be456 100644
--- 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
@@ -88,4 +88,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 5
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
index b4f77fb..55d4864 100644
--- 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
@@ -18,4 +18,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 5
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
index 4af1ccc..6957744 100644
--- 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
@@ -36,4 +36,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 4
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
index de68860..4106544 100644
--- 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
@@ -226,4 +226,4 @@
 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
+Extra constant evaluation: evaluated: 112, effectively constant: 68
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
index fd822a9..dbea8ca 100644
--- 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
@@ -287,4 +287,4 @@
 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
+Extra constant evaluation: evaluated: 66, effectively constant: 24
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
index 5f4b31d..4b3859b 100644
--- 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
@@ -130,4 +130,4 @@
 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
+Extra constant evaluation: evaluated: 54, effectively constant: 53
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
index 52f3aa3..6932698 100644
--- 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
@@ -134,4 +134,4 @@
 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
+Extra constant evaluation: evaluated: 41, effectively constant: 4
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 342b8af..6077536 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
@@ -107,4 +107,4 @@
 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
+Extra constant evaluation: evaluated: 160, effectively constant: 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 d10ce88..3d30d4a 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 58, effectively constant: 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 58691fd..fea4f76 100644
--- a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
@@ -585,4 +585,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 1d3085a..0676de4 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
@@ -14,4 +14,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///export_test.dart:14:9 -> TypeLiteralConstant(UserTag*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 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 c522059..04c23db 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -101,4 +101,4 @@
 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
+Extra constant evaluation: evaluated: 138, effectively constant: 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 a83c46c..c82b9e6 100644
--- a/pkg/front_end/testcases/general/external_import.dart.outline.expect
+++ b/pkg/front_end/testcases/general/external_import.dart.outline.expect
@@ -13,4 +13,4 @@
 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
+Extra constant evaluation: evaluated: 3, effectively constant: 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 7e4abd5..2a3bf26 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
@@ -33,4 +33,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 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 bcd0feb..7d5a3ba 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
@@ -204,4 +204,4 @@
 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
+Extra constant evaluation: evaluated: 354, effectively constant: 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 4f4f2ae..19d91ae 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
@@ -62,4 +62,4 @@
 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
+Extra constant evaluation: evaluated: 28, effectively constant: 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 0311446..26b45d2 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
@@ -50,4 +50,4 @@
 
 Extra constant evaluation status:
 Evaluated: AsExpression @ org-dartlang-testcase:///invalid_type.dart:12:9 -> NullConstant(null)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 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 5509ab3..5fe56f9 100644
--- a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
@@ -88,4 +88,4 @@
 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
+Extra constant evaluation: evaluated: 99, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/issue40744.dart.outline.expect b/pkg/front_end/testcases/general/issue40744.dart.outline.expect
index 38f3347..3b367f6 100644
--- a/pkg/front_end/testcases/general/issue40744.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue40744.dart.outline.expect
@@ -11,4 +11,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 90269fa..b501d6e 100644
--- a/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue42997.dart.strong.transformed.expect
@@ -85,4 +85,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///issue42997.dart:12:24 -> TypeLiteralConstant(Object*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 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 2db3815..d40ba2b8 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
@@ -72,4 +72,4 @@
 
 Extra constant evaluation status:
 Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///magic_const.dart:21:8 -> BoolConstant(false)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 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 7e99438..14991ec 100644
--- a/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
@@ -36,4 +36,4 @@
 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
+Extra constant evaluation: evaluated: 9, effectively constant: 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 270cae4..537845c 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
@@ -43,4 +43,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 cc645b3..493f69a 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
@@ -8,4 +8,4 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///minimum_int.dart:1:17 -> IntConstant(-9223372036854775808)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 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 b1f8f15..20fffed 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
@@ -137,4 +137,4 @@
 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
+Extra constant evaluation: evaluated: 37, effectively constant: 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 26ebb28..76e0c7e 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
@@ -53,4 +53,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 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 664a1ec..27aedb4 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
@@ -78,4 +78,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 092472c..ab987d2 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
@@ -57,4 +57,4 @@
 
 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
+Extra constant evaluation: evaluated: 3, effectively constant: 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 9f79d7f..ac5db6a 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 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 320288b..14a8225 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 19, effectively constant: 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 3710901..efc4e77 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
@@ -369,4 +369,4 @@
 
 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
+Extra constant evaluation: evaluated: 74, effectively constant: 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 f15030e..0242ff5 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
@@ -54,4 +54,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 a24b28f..a493720 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
@@ -65,4 +65,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 2face8d..095531c 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 1261412..55876a5 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
@@ -29,4 +29,4 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///redirecting_factory_metadata.dart:13:4 -> IntConstant(2)
-Extra constant evaluation: tries: 5, successes: 1
+Extra constant evaluation: evaluated: 5, effectively constant: 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 070a084..1e84833 100644
--- a/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
@@ -51,4 +51,4 @@
 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
+Extra constant evaluation: evaluated: 9, effectively constant: 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 5e8e20d..2add531 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
@@ -47,4 +47,4 @@
 
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 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 4149d44..020bf8e 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
@@ -115,4 +115,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_uses.dart:8:11 -> TypeLiteralConstant(<invalid>)
-Extra constant evaluation: tries: 4, successes: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 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 4be9ba1..c1747f2 100644
--- a/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
@@ -19,4 +19,4 @@
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 a89e08f..e79e5a8 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
@@ -33,4 +33,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///void_methods.dart:7:24 -> IntConstant(0)
-Extra constant evaluation: tries: 36, successes: 1
+Extra constant evaluation: evaluated: 36, effectively constant: 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 75bd8af..a6664b4 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
@@ -56,4 +56,4 @@
 
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 c2f0c15..749e9d0 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
@@ -18,4 +18,4 @@
 
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 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 f3b14c5..5d13162 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
@@ -87,4 +87,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///bug33099.dart:23:42 -> TypeLiteralConstant(MyTest2*)
-Extra constant evaluation: tries: 33, successes: 1
+Extra constant evaluation: evaluated: 33, effectively constant: 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 e0df656..28908ee 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
@@ -28,4 +28,4 @@
 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
+Extra constant evaluation: evaluated: 21, effectively constant: 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 e6aa634..156d0a6 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
@@ -39,4 +39,4 @@
 
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 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 3af0af0..ded690f 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
@@ -43,4 +43,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 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 006c2cc..fa89fde 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
@@ -107,4 +107,4 @@
 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
+Extra constant evaluation: evaluated: 160, effectively constant: 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 224b225..5707da5 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 58, effectively constant: 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 3ecf074..405fb55 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
@@ -14,4 +14,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///export_test.dart:16:9 -> TypeLiteralConstant(UserTag*)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 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 ce07630..4796426 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
@@ -101,4 +101,4 @@
 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
+Extra constant evaluation: evaluated: 138, effectively constant: 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 5135233..b63a7e4 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
@@ -62,4 +62,4 @@
 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
+Extra constant evaluation: evaluated: 28, effectively constant: 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 70af76d..a287469 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
@@ -50,4 +50,4 @@
 
 Extra constant evaluation status:
 Evaluated: AsExpression @ org-dartlang-testcase:///invalid_type.dart:14:9 -> NullConstant(null)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 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 ffb08b7..ab4a00c 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
@@ -72,4 +72,4 @@
 
 Extra constant evaluation status:
 Evaluated: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///magic_const.dart:23:8 -> BoolConstant(false)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 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 6bf610e..88f46a2 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
@@ -8,4 +8,4 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///minimum_int.dart:1:17 -> IntConstant(-9223372036854775808)
-Extra constant evaluation: tries: 2, successes: 1
+Extra constant evaluation: evaluated: 2, effectively constant: 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 bc1404b..20f40c5 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
@@ -137,4 +137,4 @@
 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
+Extra constant evaluation: evaluated: 37, effectively constant: 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 4f7e0a0..715890e 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
@@ -369,4 +369,4 @@
 
 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
+Extra constant evaluation: evaluated: 74, effectively constant: 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 1680081..8deddad 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
@@ -115,4 +115,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_uses.dart:10:11 -> TypeLiteralConstant(<invalid>)
-Extra constant evaluation: tries: 4, successes: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 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 801da4f..6176ac4 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
@@ -19,4 +19,4 @@
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 c00d5b7..9358d88 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
@@ -33,4 +33,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///void_methods.dart:9:24 -> IntConstant(0)
-Extra constant evaluation: tries: 36, successes: 1
+Extra constant evaluation: evaluated: 36, effectively constant: 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 c3f99a8..e9cba62 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
@@ -204,4 +204,4 @@
 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
+Extra constant evaluation: evaluated: 322, effectively constant: 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 7b083ef..9af8d7f 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() as Class?;
+          Class? c = new Class();
           print(c!);
         }
         class Class {}
-    expectedLibraryCount: 1
+    expectedLibraryCount: 1
\ No newline at end of file
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 2981516..e985e99 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
@@ -49,4 +49,4 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///bug30624.dart:40:35 -> IntConstant(-1)
-Extra constant evaluation: tries: 47, successes: 1
+Extra constant evaluation: evaluated: 47, effectively constant: 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 9385400..ff145dc 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
@@ -11,4 +11,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 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 f717ce5..1cea698 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 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 c319b9f..f6d0c76 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
@@ -44,4 +44,4 @@
 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
+Extra constant evaluation: evaluated: 3, effectively constant: 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 ec42741..903b67e 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 ac1e337..590e815 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 d64ec98..127f049 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 4cb8414..c3a7845 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 94fdb61..9bddbcd 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 0a04fa8..908df9c 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 2f91f22..f0c10fb 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 83b70a3..6d7ac2e 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 c6dbbe3..5942aa9 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 980c668..e3979f7 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 c2895c0..a52e25c 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 19d530b..7b0d48e 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 3d435d2..e4600c3 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 dfeda7b..5309f49 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 0a65e79..6b301eb 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
@@ -52,4 +52,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 8b87fb7..0085139 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
@@ -54,4 +54,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 5cc3d38..739558d 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
@@ -56,4 +56,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 81ac385..04c973a 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
@@ -56,4 +56,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 b9cf624..ef0889f 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 9b8efa6..8471c54 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 b1257cb..d14c4a7 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 4c1cf46..3853e42 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 46, effectively constant: 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 c7dfb50..0034901 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
@@ -155,4 +155,4 @@
 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
+Extra constant evaluation: evaluated: 133, effectively constant: 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 369ced0..854ab35 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
@@ -50,4 +50,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 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 34352bf..944c9ba 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
@@ -43,4 +43,4 @@
 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
+Extra constant evaluation: evaluated: 24, effectively constant: 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 efbfc78..c3d3a34 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
@@ -43,4 +43,4 @@
 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
+Extra constant evaluation: evaluated: 24, effectively constant: 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 f75e4f5..c9a0c95 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
@@ -43,4 +43,4 @@
 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
+Extra constant evaluation: evaluated: 24, effectively constant: 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 b8f9738..e0f1ccf 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
@@ -58,4 +58,4 @@
 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
+Extra constant evaluation: evaluated: 34, effectively constant: 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 63741d8..c348897 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
@@ -13,4 +13,4 @@
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 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 d35e13b..f89bc38 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
@@ -40,4 +40,4 @@
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 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 8355e57..1b5944d 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
@@ -40,4 +40,4 @@
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 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 f97ff69..544c4cb 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
@@ -189,4 +189,4 @@
 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
+Extra constant evaluation: evaluated: 74, effectively constant: 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 a232a1b..d0e0ac7 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
@@ -16,4 +16,4 @@
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 5180a33..f02cb50 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
@@ -48,4 +48,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 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 457bfee..7fa241a 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
@@ -30,4 +30,4 @@
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 ed56360..3c0b3c8 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
@@ -30,4 +30,4 @@
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 c809710..392e7e7 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
@@ -51,4 +51,4 @@
 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
+Extra constant evaluation: evaluated: 18, effectively constant: 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 a23d9ae..f4c4777 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
@@ -32,4 +32,4 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///override_equals.dart:9:4 -> InstanceConstant(const _Override{})
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 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 84f9764..1892d0c 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
@@ -9,4 +9,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 bb135a1..37761d3 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
@@ -25,4 +25,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart b/pkg/front_end/testcases/inference_new/const_invocation.dart
index 8525174..4e58d44 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart
@@ -8,7 +8,7 @@
 typedef V F<U, V>(U u);
 
 class Foo<T> {
-  Bar<T> get v1 => const /*@ typeArgs=Null? */ Bar();
+  Bar<T> get v1 => const /*@typeArgs=Null?*/ Bar();
   Bar<List<T>> get v2 => const /*@ typeArgs=List<Null?>* */ Bar();
   Bar<F<T, T>> get v3 => const /*@ typeArgs=(Object*) ->* Null? */ Bar();
   Bar<F<F<T, T>, T>> get v4 =>
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 4565d72..2c14e98 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
@@ -138,4 +138,4 @@
 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
+Extra constant evaluation: evaluated: 78, effectively constant: 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 d866bd3..d239253 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
@@ -11,4 +11,4 @@
 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
+Extra constant evaluation: evaluated: 11, effectively constant: 3
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 b528c5d..9c70f2f 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
@@ -107,4 +107,4 @@
 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
+Extra constant evaluation: evaluated: 185, effectively constant: 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 94538ef..fc7694c 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
@@ -27,4 +27,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 e4dd765..b7a7d1d 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
@@ -42,4 +42,4 @@
 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
+Extra constant evaluation: evaluated: 19, effectively constant: 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 52cdbab..bcd034d 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
@@ -150,4 +150,4 @@
 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
+Extra constant evaluation: evaluated: 34, effectively constant: 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 8bde560..4555905 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
@@ -178,4 +178,4 @@
 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
+Extra constant evaluation: evaluated: 268, effectively constant: 6
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 3306393..6fe95bd 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
@@ -65,4 +65,4 @@
 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
+Extra constant evaluation: evaluated: 81, effectively constant: 2
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 3306393..6fe95bd 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
@@ -65,4 +65,4 @@
 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
+Extra constant evaluation: evaluated: 81, effectively constant: 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 871c4c8..8288606 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
@@ -57,4 +57,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///later.dart:46:18 -> IntConstant(42)
-Extra constant evaluation: tries: 17, successes: 1
+Extra constant evaluation: evaluated: 17, effectively constant: 1
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
index 4646abe..cdcf986 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
 //                              ^^^^^
 //
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B(); // Error: B has late final fields.
-//         ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+//   const B(); // Error: B has late final fields.
+//         ^
 //
 import self as self;
 import "dart:core" as core;
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 ddeb453..7afe2ac 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
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
 //                              ^^^^^
 //
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B(); // Error: B has late final fields.
-//         ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+//   const B(); // Error: B has late final fields.
+//         ^
 //
 import self as self;
 import "dart:core" as core;
@@ -271,4 +271,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///later.dart:46:18 -> IntConstant(42)
-Extra constant evaluation: tries: 216, successes: 1
+Extra constant evaluation: evaluated: 216, effectively constant: 1
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
index 3a9b187..1144c13 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
 //                              ^^^^^
 //
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B(); // Error: B has late final fields.
-//         ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+//   const B(); // Error: B has late final fields.
+//         ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
index 27b946d..4dac8b1 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
 //                              ^^^^^
 //
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B(); // Error: B has late final fields.
-//         ^
-// pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+//   const B(); // Error: B has late final fields.
+//         ^
 //
 import self as self;
 import "dart:core" as core;
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 27673f7..0980864 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
@@ -239,4 +239,4 @@
 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
+Extra constant evaluation: evaluated: 291, effectively constant: 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 98d7c8d..f94376c 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
@@ -123,4 +123,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///override.dart:16:18 -> IntConstant(0)
-Extra constant evaluation: tries: 232, successes: 1
+Extra constant evaluation: evaluated: 232, effectively constant: 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 886c804..6466db6 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
@@ -91,4 +91,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///override_getter_setter.dart:18:18 -> IntConstant(2)
-Extra constant evaluation: tries: 119, successes: 1
+Extra constant evaluation: evaluated: 119, effectively constant: 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 41b22c9..6d153d9 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
@@ -51,4 +51,4 @@
 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
+Extra constant evaluation: evaluated: 98, effectively constant: 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 41b22c9..6d153d9 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
@@ -51,4 +51,4 @@
 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
+Extra constant evaluation: evaluated: 98, effectively constant: 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 fb310aa..b2d7e74 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
@@ -29,4 +29,4 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///simple.dart:15:7 -> IntConstant(10)
-Extra constant evaluation: tries: 9, successes: 1
+Extra constant evaluation: evaluated: 9, effectively constant: 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 a0aea49..3e7a02e 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
@@ -25,4 +25,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 d4cc82b..04a6535 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
@@ -77,4 +77,4 @@
 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
+Extra constant evaluation: evaluated: 33, effectively constant: 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 ed5849f..72bc1d1 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
@@ -107,4 +107,4 @@
 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
+Extra constant evaluation: evaluated: 102, effectively constant: 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 de05935..4bd5117 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
@@ -105,4 +105,4 @@
 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
+Extra constant evaluation: evaluated: 102, effectively constant: 14
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
index e3c22f4..4de21ca 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
@@ -97,4 +97,4 @@
 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
+Extra constant evaluation: evaluated: 35, effectively constant: 34
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 eb118e8..723338b0 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
@@ -21,4 +21,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 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 2486d51..99614fc 100644
--- a/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.outline.expect
@@ -146,4 +146,4 @@
 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
+Extra constant evaluation: evaluated: 25, effectively constant: 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 38f9bc7..c79998e 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
@@ -31,4 +31,4 @@
 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
+Extra constant evaluation: evaluated: 5, effectively constant: 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 9b4d8c9..571f848 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
@@ -84,4 +84,4 @@
 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
+Extra constant evaluation: evaluated: 112, effectively constant: 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 9b4d8c9..571f848 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
@@ -84,4 +84,4 @@
 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
+Extra constant evaluation: evaluated: 112, effectively constant: 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 c810721..2726966 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
@@ -25,4 +25,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 7daa8f5..4d1285a 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -135,4 +135,4 @@
 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
+Extra constant evaluation: evaluated: 55, effectively constant: 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 7daa8f5..4d1285a 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -135,4 +135,4 @@
 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
+Extra constant evaluation: evaluated: 55, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart b/pkg/front_end/testcases/nnbd/issue41114.dart
index 3929126..7db889f 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>[] as List<String>?;
+  List<String>? a = <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 6fb76f5..4b2167b 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>[] as{ForNonNullableByDefault} core::List<core::String>?;
+  core::List<core::String>? a = <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 6fb76f5..4b2167b 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>[] as{ForNonNullableByDefault} core::List<core::String>?;
+  core::List<core::String>? a = <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 14f079a..368f224 100644
--- a/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41273.dart.strong.transformed.expect
@@ -33,4 +33,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///issue41273.dart:16:21 -> TypeLiteralConstant(Object)
-Extra constant evaluation: tries: 49, successes: 1
+Extra constant evaluation: evaluated: 49, effectively constant: 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 c59851f..e7749a6 100644
--- a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.transformed.expect
@@ -34,4 +34,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///issue41273.dart:16:21 -> TypeLiteralConstant(Object)
-Extra constant evaluation: tries: 175, successes: 1
+Extra constant evaluation: evaluated: 175, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart b/pkg/front_end/testcases/nnbd/issue41495.dart
index cca6995..ceaf89a 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() as A?;
+  A? a1 = new 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 4df1b52..ecc36781 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::•() as{ForNonNullableByDefault} self::A?;
+  self::A? a1 = new 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 4df1b52..ecc36781 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::•() as{ForNonNullableByDefault} self::A?;
+  self::A? a1 = new 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 0c7badc..a9d3a40 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
@@ -19,4 +19,4 @@
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 3e924b7..46f2af9 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
@@ -53,4 +53,4 @@
 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
+Extra constant evaluation: evaluated: 7, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart b/pkg/front_end/testcases/nnbd/issue42429.dart
new file mode 100644
index 0000000..5023f9a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart
@@ -0,0 +1,66 @@
+// 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 A<T extends num> {}
+
+typedef FArgument<X extends num> = Function(X);
+typedef FReturn<X extends num> = X Function();
+typedef FBoth<X extends num> = X Function(X);
+typedef FNowhere<X extends num> = Function();
+
+foo() {
+  A<Object> aObject; // Error.
+  A<num?> aNumNullable; // Error.
+  A<int?> aIntNullable; // Error.
+  A<Null> aNull; // Error.
+  FArgument<Object> fArgumentObject; // Error.
+  FArgument<num?> fArgumentNumNullable; // Error.
+  FArgument<int?> fArgumentIntNullable; // Error.
+  FArgument<Null> fArgumentNull; // Error.
+  FReturn<Object> fReturnObject; // Error.
+  FReturn<num?> fReturnNumNullable; // Error.
+  FReturn<int?> fReturnIntNullable; // Error.
+  FReturn<Null> fReturnNull; // Error.
+  FBoth<Object> fBothObject; // Error.
+  FBoth<num?> fBothNumNullable; // Error.
+  FBoth<int?> fBothIntNullable; // Error.
+  FBoth<Null> fBothNull; // Error.
+  FNowhere<Object> fNowhereObject; // Error.
+  FNowhere<num?> fNowhereNumNullable; // Error.
+  FNowhere<int?> fNowhereIntNullable; // Error.
+  FNowhere<Null> fNowhereNull; // Error.
+
+  A<Object?> aObjectNullable; // Ok.
+  A<dynamic> aDynamic; // Ok.
+  A<void> aVoid; // Ok.
+  A<num> aNum; // Ok.
+  A<int> aInt; // Ok.
+  A<Never> aNever; // Ok.
+  FArgument<Object?> fArgumentObjectNullable; // Ok.
+  FArgument<dynamic> fArgumentDynamic; // Ok.
+  FArgument<void> fArgumentVoid; // Ok.
+  FArgument<num> fArgumentNum; // Ok.
+  FArgument<int> fArgumentInt; // Ok.
+  FArgument<Never> fArgumentNever; // Ok.
+  FReturn<Object?> fReturnObjectNullable; // Ok.
+  FReturn<dynamic> fReturnDynamic; // Ok.
+  FReturn<void> fReturnVoid; // Ok.
+  FReturn<num> fReturnNum; // Ok.
+  FReturn<int> fReturnInt; // Ok.
+  FReturn<Never> fReturnNever; // Ok.
+  FBoth<Object?> fBothObjectNullable; // Ok.
+  FBoth<dynamic> fBothDynamic; // Ok.
+  FBoth<void> fBothVoid; // Ok.
+  FBoth<num> fBothNum; // Ok.
+  FBoth<int> fBothInt; // Ok.
+  FBoth<Never> fBothNever; // Ok.
+  FNowhere<Object?> fNowhereObjectNullable; // Ok.
+  FNowhere<dynamic> fNowhereDynamic; // Ok.
+  FNowhere<void> fNowhereVoid; // Ok.
+  FNowhere<num> fNowhereNum; // Ok.
+  FNowhere<int> fNowhereInt; // Ok.
+  FNowhere<Never> fNowhereNever; // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.outline.expect
new file mode 100644
index 0000000..2034770
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.outline.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Object> aObject; // Error.
+//             ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num?> aNumNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<int?> aIntNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Null> aNull; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Object> fArgumentObject; // Error.
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<num?> fArgumentNumNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<int?> fArgumentIntNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Null> fArgumentNull; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Object> fReturnObject; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<num?> fReturnNumNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<int?> fReturnIntNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Null> fReturnNull; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Object> fBothObject; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<num?> fBothNumNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<int?> fBothIntNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Null> fBothNull; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Object> fNowhereObject; // Error.
+//                    ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<num?> fNowhereNumNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<int?> fNowhereIntNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Null> fNowhereNull; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+static method foo() → dynamic {
+  self::A<core::Object> aObject;
+  self::A<core::num?> aNumNullable;
+  self::A<core::int?> aIntNullable;
+  self::A<core::Null?> aNull;
+  (core::Object) → dynamic fArgumentObject;
+  (core::num?) → dynamic fArgumentNumNullable;
+  (core::int?) → dynamic fArgumentIntNullable;
+  (core::Null?) → dynamic fArgumentNull;
+  () → core::Object fReturnObject;
+  () → core::num? fReturnNumNullable;
+  () → core::int? fReturnIntNullable;
+  () → core::Null? fReturnNull;
+  (core::Object) → core::Object fBothObject;
+  (core::num?) → core::num? fBothNumNullable;
+  (core::int?) → core::int? fBothIntNullable;
+  (core::Null?) → core::Null? fBothNull;
+  () → dynamic fNowhereObject;
+  () → dynamic fNowhereNumNullable;
+  () → dynamic fNowhereIntNullable;
+  () → dynamic fNowhereNull;
+  self::A<core::Object?> aObjectNullable;
+  self::A<dynamic> aDynamic;
+  self::A<void> aVoid;
+  self::A<core::num> aNum;
+  self::A<core::int> aInt;
+  self::A<Never> aNever;
+  (core::Object?) → dynamic fArgumentObjectNullable;
+  (dynamic) → dynamic fArgumentDynamic;
+  (void) → dynamic fArgumentVoid;
+  (core::num) → dynamic fArgumentNum;
+  (core::int) → dynamic fArgumentInt;
+  (Never) → dynamic fArgumentNever;
+  () → core::Object? fReturnObjectNullable;
+  () → dynamic fReturnDynamic;
+  () → void fReturnVoid;
+  () → core::num fReturnNum;
+  () → core::int fReturnInt;
+  () → Never fReturnNever;
+  (core::Object?) → core::Object? fBothObjectNullable;
+  (dynamic) → dynamic fBothDynamic;
+  (void) → void fBothVoid;
+  (core::num) → core::num fBothNum;
+  (core::int) → core::int fBothInt;
+  (Never) → Never fBothNever;
+  () → dynamic fNowhereObjectNullable;
+  () → dynamic fNowhereDynamic;
+  () → dynamic fNowhereVoid;
+  () → dynamic fNowhereNum;
+  () → dynamic fNowhereInt;
+  () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Object> aObject; // Error.
+//             ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num?> aNumNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<int?> aIntNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Null> aNull; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Object> fArgumentObject; // Error.
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<num?> fArgumentNumNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<int?> fArgumentIntNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Null> fArgumentNull; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Object> fReturnObject; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<num?> fReturnNumNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<int?> fReturnIntNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Null> fReturnNull; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Object> fBothObject; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<num?> fBothNumNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<int?> fBothIntNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Null> fBothNull; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Object> fNowhereObject; // Error.
+//                    ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<num?> fNowhereNumNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<int?> fNowhereIntNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Null> fNowhereNull; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+static method foo() → dynamic {
+  self::A<core::Object> aObject;
+  self::A<core::num?> aNumNullable;
+  self::A<core::int?> aIntNullable;
+  self::A<core::Null?> aNull;
+  (core::Object) → dynamic fArgumentObject;
+  (core::num?) → dynamic fArgumentNumNullable;
+  (core::int?) → dynamic fArgumentIntNullable;
+  (core::Null?) → dynamic fArgumentNull;
+  () → core::Object fReturnObject;
+  () → core::num? fReturnNumNullable;
+  () → core::int? fReturnIntNullable;
+  () → core::Null? fReturnNull;
+  (core::Object) → core::Object fBothObject;
+  (core::num?) → core::num? fBothNumNullable;
+  (core::int?) → core::int? fBothIntNullable;
+  (core::Null?) → core::Null? fBothNull;
+  () → dynamic fNowhereObject;
+  () → dynamic fNowhereNumNullable;
+  () → dynamic fNowhereIntNullable;
+  () → dynamic fNowhereNull;
+  self::A<core::Object?> aObjectNullable;
+  self::A<dynamic> aDynamic;
+  self::A<void> aVoid;
+  self::A<core::num> aNum;
+  self::A<core::int> aInt;
+  self::A<Never> aNever;
+  (core::Object?) → dynamic fArgumentObjectNullable;
+  (dynamic) → dynamic fArgumentDynamic;
+  (void) → dynamic fArgumentVoid;
+  (core::num) → dynamic fArgumentNum;
+  (core::int) → dynamic fArgumentInt;
+  (Never) → dynamic fArgumentNever;
+  () → core::Object? fReturnObjectNullable;
+  () → dynamic fReturnDynamic;
+  () → void fReturnVoid;
+  () → core::num fReturnNum;
+  () → core::int fReturnInt;
+  () → Never fReturnNever;
+  (core::Object?) → core::Object? fBothObjectNullable;
+  (dynamic) → dynamic fBothDynamic;
+  (void) → void fBothVoid;
+  (core::num) → core::num fBothNum;
+  (core::int) → core::int fBothInt;
+  (Never) → Never fBothNever;
+  () → dynamic fNowhereObjectNullable;
+  () → dynamic fNowhereDynamic;
+  () → dynamic fNowhereVoid;
+  () → dynamic fNowhereNum;
+  () → dynamic fNowhereInt;
+  () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline.expect
new file mode 100644
index 0000000..f4e93b5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+class A<T extends num> {}
+
+typedef FArgument<X extends num> = Function(X);
+typedef FReturn<X extends num> = X Function();
+typedef FBoth<X extends num> = X Function(X);
+typedef FNowhere<X extends num> = Function();
+foo() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b830697
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+class A<T extends num> {}
+
+foo() {}
+main() {}
+typedef FArgument<X extends num> = Function(X);
+typedef FBoth<X extends num> = X Function(X);
+typedef FNowhere<X extends num> = Function();
+typedef FReturn<X extends num> = X Function();
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Object> aObject; // Error.
+//             ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num?> aNumNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<int?> aIntNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Null> aNull; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Object> fArgumentObject; // Error.
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<num?> fArgumentNumNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<int?> fArgumentIntNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Null> fArgumentNull; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Object> fReturnObject; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<num?> fReturnNumNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<int?> fReturnIntNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Null> fReturnNull; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Object> fBothObject; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<num?> fBothNumNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<int?> fBothIntNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Null> fBothNull; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Object> fNowhereObject; // Error.
+//                    ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<num?> fNowhereNumNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<int?> fNowhereIntNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Null> fNowhereNull; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+static method foo() → dynamic {
+  self::A<core::Object> aObject;
+  self::A<core::num?> aNumNullable;
+  self::A<core::int?> aIntNullable;
+  self::A<core::Null?> aNull;
+  (core::Object) → dynamic fArgumentObject;
+  (core::num?) → dynamic fArgumentNumNullable;
+  (core::int?) → dynamic fArgumentIntNullable;
+  (core::Null?) → dynamic fArgumentNull;
+  () → core::Object fReturnObject;
+  () → core::num? fReturnNumNullable;
+  () → core::int? fReturnIntNullable;
+  () → core::Null? fReturnNull;
+  (core::Object) → core::Object fBothObject;
+  (core::num?) → core::num? fBothNumNullable;
+  (core::int?) → core::int? fBothIntNullable;
+  (core::Null?) → core::Null? fBothNull;
+  () → dynamic fNowhereObject;
+  () → dynamic fNowhereNumNullable;
+  () → dynamic fNowhereIntNullable;
+  () → dynamic fNowhereNull;
+  self::A<core::Object?> aObjectNullable;
+  self::A<dynamic> aDynamic;
+  self::A<void> aVoid;
+  self::A<core::num> aNum;
+  self::A<core::int> aInt;
+  self::A<Never> aNever;
+  (core::Object?) → dynamic fArgumentObjectNullable;
+  (dynamic) → dynamic fArgumentDynamic;
+  (void) → dynamic fArgumentVoid;
+  (core::num) → dynamic fArgumentNum;
+  (core::int) → dynamic fArgumentInt;
+  (Never) → dynamic fArgumentNever;
+  () → core::Object? fReturnObjectNullable;
+  () → dynamic fReturnDynamic;
+  () → void fReturnVoid;
+  () → core::num fReturnNum;
+  () → core::int fReturnInt;
+  () → Never fReturnNever;
+  (core::Object?) → core::Object? fBothObjectNullable;
+  (dynamic) → dynamic fBothDynamic;
+  (void) → void fBothVoid;
+  (core::num) → core::num fBothNum;
+  (core::int) → core::int fBothInt;
+  (Never) → Never fBothNever;
+  () → dynamic fNowhereObjectNullable;
+  () → dynamic fNowhereDynamic;
+  () → dynamic fNowhereVoid;
+  () → dynamic fNowhereNum;
+  () → dynamic fNowhereInt;
+  () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
new file mode 100644
index 0000000..30ddc8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
@@ -0,0 +1,234 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Object> aObject; // Error.
+//             ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num?> aNumNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<int?> aIntNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Null> aNull; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Object> fArgumentObject; // Error.
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<num?> fArgumentNumNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<int?> fArgumentIntNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Null> fArgumentNull; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Object> fReturnObject; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<num?> fReturnNumNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<int?> fReturnIntNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Null> fReturnNull; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Object> fBothObject; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<num?> fBothNumNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<int?> fBothIntNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Null> fBothNull; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Object> fNowhereObject; // Error.
+//                    ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<num?> fNowhereNumNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<int?> fNowhereIntNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Null> fNowhereNull; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num = core::num> = () → X;
+typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
+class A<T extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+static method foo() → dynamic {
+  self::A<core::Object> aObject;
+  self::A<core::num?> aNumNullable;
+  self::A<core::int?> aIntNullable;
+  self::A<core::Null?> aNull;
+  (core::Object) → dynamic fArgumentObject;
+  (core::num?) → dynamic fArgumentNumNullable;
+  (core::int?) → dynamic fArgumentIntNullable;
+  (core::Null?) → dynamic fArgumentNull;
+  () → core::Object fReturnObject;
+  () → core::num? fReturnNumNullable;
+  () → core::int? fReturnIntNullable;
+  () → core::Null? fReturnNull;
+  (core::Object) → core::Object fBothObject;
+  (core::num?) → core::num? fBothNumNullable;
+  (core::int?) → core::int? fBothIntNullable;
+  (core::Null?) → core::Null? fBothNull;
+  () → dynamic fNowhereObject;
+  () → dynamic fNowhereNumNullable;
+  () → dynamic fNowhereIntNullable;
+  () → dynamic fNowhereNull;
+  self::A<core::Object?> aObjectNullable;
+  self::A<dynamic> aDynamic;
+  self::A<void> aVoid;
+  self::A<core::num> aNum;
+  self::A<core::int> aInt;
+  self::A<Never> aNever;
+  (core::Object?) → dynamic fArgumentObjectNullable;
+  (dynamic) → dynamic fArgumentDynamic;
+  (void) → dynamic fArgumentVoid;
+  (core::num) → dynamic fArgumentNum;
+  (core::int) → dynamic fArgumentInt;
+  (Never) → dynamic fArgumentNever;
+  () → core::Object? fReturnObjectNullable;
+  () → dynamic fReturnDynamic;
+  () → void fReturnVoid;
+  () → core::num fReturnNum;
+  () → core::int fReturnInt;
+  () → Never fReturnNever;
+  (core::Object?) → core::Object? fBothObjectNullable;
+  (dynamic) → dynamic fBothDynamic;
+  (void) → void fBothVoid;
+  (core::num) → core::num fBothNum;
+  (core::int) → core::int fBothInt;
+  (Never) → Never fBothNever;
+  () → dynamic fNowhereObjectNullable;
+  () → dynamic fNowhereDynamic;
+  () → dynamic fNowhereVoid;
+  () → dynamic fNowhereNum;
+  () → dynamic fNowhereInt;
+  () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
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 02ed204..87a95fd 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -19,4 +19,4 @@
 
 Extra constant evaluation status:
 Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> PartialInstantiationConstant(checkme<X>)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 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 1757a97..7c42561 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -19,4 +19,4 @@
 
 Extra constant evaluation status:
 Evaluated: Instantiation @ org-dartlang-testcase:///issue42433.dart:11:16 -> PartialInstantiationConstant(checkme<X*>)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
index 0fcadb3..baab324 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
@@ -46,4 +46,4 @@
 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
+Extra constant evaluation: evaluated: 61, effectively constant: 15
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart b/pkg/front_end/testcases/nnbd/issue43354.dart
new file mode 100644
index 0000000..0fe7700
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// The error should be reported on the field, not the constructor.
+
+class A {
+  late final int foo = 42;
+  const A();
+}
+
+class B {
+  late final int foo = 42;
+  late final String bar = "foobar";
+  const B();
+}
+
+class C {
+  late final int foo = 42;
+  const C();
+  const C.another();
+}
+
+class D {
+  late final int foo = 42;
+  late final String bar = "foobar";
+  const D();
+  const D.another();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.outline.expect
new file mode 100644
index 0000000..af871a2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.outline.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  const constructor another() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::D
+    : super core::Object::•()
+    ;
+  const constructor another() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+//   const A();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+//   const C();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  const constructor another() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::D
+    : super core::Object::•()
+    ;
+  const constructor another() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.transformed.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.strong.transformed.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+//   const A();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+//   const C();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  const constructor another() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::D
+    : super core::Object::•()
+    ;
+  const constructor another() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.textual_outline.expect
new file mode 100644
index 0000000..d4f44a6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.textual_outline.expect
@@ -0,0 +1,27 @@
+class A {
+  late ;
+  final int foo = 42;
+  const A();
+}
+class B {
+  late ;
+  final int foo = 42;
+  late ;
+  final String bar = "foobar";
+  const B();
+}
+class C {
+  late ;
+  final int foo = 42;
+  const C();
+  const C.another();
+}
+class D {
+  late ;
+  final int foo = 42;
+  late ;
+  final String bar = "foobar";
+  const D();
+  const D.another();
+}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+//   const A();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+//   const C();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  const constructor another() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::D
+    : super core::Object::•()
+    ;
+  const constructor another() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.transformed.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.transformed.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+//   const A();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+//   const C();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  const constructor another() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::D
+    : super core::Object::•()
+    ;
+  const constructor another() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
index 4ea3cb9..992c773 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}';
 //                              ^^^^^
 //
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B();
-//         ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+//   const B();
+//         ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
index 37d882a..f36cfd3 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}';
 //                              ^^^^^
 //
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B();
-//         ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+//   const B();
+//         ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
index 4ea3cb9..992c773 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}';
 //                              ^^^^^
 //
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B();
-//         ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+//   const B();
+//         ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
index 37d882a..f36cfd3 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
@@ -55,12 +55,12 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}';
 //                              ^^^^^
 //
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
-//   const B();
-//         ^
-// pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
 //   late final int x = 42;
 //                  ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+//   const B();
+//         ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart b/pkg/front_end/testcases/nnbd/null_aware_chain.dart
index ff589af..a53cacf 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() as Class?;
+  Class? c = new 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 4c16033..267161a 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::•() as{ForNonNullableByDefault} self::Class?;
+  self::Class? c = new 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 4c16033..267161a 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::•() as{ForNonNullableByDefault} self::Class?;
+  self::Class? c = new 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 4cef88b..110d74f 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() as Class?;
+  Class? c = new Class();
   c!;
   c!.field;
   c!.field = 42;
@@ -22,7 +22,7 @@
   c + c!;
   (c + c)!;
 
-  bool? o = true as bool?;
+  bool? o = true;
   !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 a1827fa..26ca627 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::•() as{ForNonNullableByDefault} self::Class?;
+  self::Class? c = new 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 as{ForNonNullableByDefault} core::bool?;
+  core::bool? o = true;
   !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 a1827fa..26ca627 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::•() as{ForNonNullableByDefault} self::Class?;
+  self::Class? c = new 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 as{ForNonNullableByDefault} core::bool?;
+  core::bool? o = true;
   !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 796847e..9838019 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
@@ -194,4 +194,4 @@
 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
+Extra constant evaluation: evaluated: 723, effectively constant: 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 11ed800..7e7ea06 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
@@ -194,4 +194,4 @@
 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
+Extra constant evaluation: evaluated: 702, effectively constant: 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 0e67f9e..49de6f1 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
@@ -25,4 +25,4 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///nullable_param.dart:19:23 -> IntConstant(-1)
-Extra constant evaluation: tries: 20, successes: 1
+Extra constant evaluation: evaluated: 20, effectively constant: 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 0e67f9e..49de6f1 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
@@ -25,4 +25,4 @@
 
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///nullable_param.dart:19:23 -> IntConstant(-1)
-Extra constant evaluation: tries: 20, successes: 1
+Extra constant evaluation: evaluated: 20, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart b/pkg/front_end/testcases/nnbd/nullable_setter.dart
index f644300..8e9d230 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() as C?;
+  C? c = new 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 ac016f2..d367854 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::•() as{ForNonNullableByDefault} self::C?;
+  self::C? c = new 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 ac016f2..d367854 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::•() as{ForNonNullableByDefault} self::C?;
+  self::C? c = new 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 5ac5185..f5a5f71 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
@@ -45,4 +45,4 @@
 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
+Extra constant evaluation: evaluated: 6, effectively constant: 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 8aaaafa..96c486e9 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
@@ -40,4 +40,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 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 b15b586..9036823 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
@@ -67,4 +67,4 @@
 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
+Extra constant evaluation: evaluated: 3, effectively constant: 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 629005d9..55b2345 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
@@ -50,4 +50,4 @@
 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
+Extra constant evaluation: evaluated: 11, effectively constant: 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 423d7bd..b2e2658 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
@@ -46,4 +46,4 @@
 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
+Extra constant evaluation: evaluated: 11, effectively constant: 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 a4a97e5..3806476 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
@@ -55,4 +55,4 @@
 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
+Extra constant evaluation: evaluated: 7, effectively constant: 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 18713fd..4f8e60b 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
@@ -644,4 +644,4 @@
 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
+Extra constant evaluation: evaluated: 428, effectively constant: 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 bb2c387..2c4e1da 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
@@ -118,4 +118,4 @@
 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
+Extra constant evaluation: evaluated: 165, effectively constant: 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 bb2c387..2c4e1da 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
@@ -118,4 +118,4 @@
 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
+Extra constant evaluation: evaluated: 165, effectively constant: 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 bbb733e..87930a9 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
@@ -221,4 +221,4 @@
 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
+Extra constant evaluation: evaluated: 221, effectively constant: 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 bbb733e..87930a9 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
@@ -221,4 +221,4 @@
 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
+Extra constant evaluation: evaluated: 221, effectively constant: 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 487e5d5..6bfb752 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
@@ -34,4 +34,4 @@
 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
+Extra constant evaluation: evaluated: 7, effectively constant: 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 cfc2836..c7475f1 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
@@ -97,4 +97,4 @@
 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
+Extra constant evaluation: evaluated: 58, effectively constant: 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 32ed016..0104bef 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
@@ -30,4 +30,4 @@
 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
+Extra constant evaluation: evaluated: 12, effectively constant: 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 e3474fe..439da59 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
@@ -141,4 +141,4 @@
 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
+Extra constant evaluation: evaluated: 139, effectively constant: 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 87f8f14..a19de51 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
@@ -30,4 +30,4 @@
 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
+Extra constant evaluation: evaluated: 18, effectively constant: 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 17acc60..211e16d 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) as{ForNonNullableByDefault} uns::OptInClass5?;
+  uns::OptInClass5? o = new uns::OptInClass5::•(i);
   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) as{ForNonNullableByDefault} uns::OptInClass5?;
+  uns::OptInClass5? o = new uns::OptInClass5::•(i);
   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 8d00f15..af2b9be 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
@@ -639,4 +639,4 @@
 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
+Extra constant evaluation: evaluated: 720, effectively constant: 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 738e03a..6dd9b47 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) as OptInClass5?;
+  OptInClass5? o = new OptInClass5(i);
   return o?.field ??= 42;
 }
 
 nullAwareIfNullSetOptInForEffect(int i) {
-  OptInClass5? o = new OptInClass5(i) as OptInClass5?;
+  OptInClass5? o = new OptInClass5(i);
   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 2cd194d..6a3fcc1 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
@@ -54,4 +54,4 @@
 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
+Extra constant evaluation: evaluated: 19, effectively constant: 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 be8c3ef..26d73b4 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
@@ -71,4 +71,4 @@
 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
+Extra constant evaluation: evaluated: 19, effectively constant: 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 228826a..8db6c2b 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
@@ -77,4 +77,4 @@
 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
+Extra constant evaluation: evaluated: 19, effectively constant: 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 7f8e4b5..8348811 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
@@ -50,4 +50,4 @@
 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
+Extra constant evaluation: evaluated: 19, effectively constant: 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 85a5331..29f7048 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
@@ -47,4 +47,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 d42519a..a18f420 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
@@ -50,4 +50,4 @@
 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
+Extra constant evaluation: evaluated: 40, effectively constant: 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 a7aa057..fd257f0 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
@@ -82,4 +82,4 @@
 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
+Extra constant evaluation: evaluated: 39, effectively constant: 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 fb783b9..be653d9 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
@@ -68,4 +68,4 @@
 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
+Extra constant evaluation: evaluated: 9, effectively constant: 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 9d3cb8e..27e25ce 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
@@ -39,4 +39,4 @@
 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
+Extra constant evaluation: evaluated: 22, effectively constant: 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 aab9b99..4dfd530 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
@@ -58,4 +58,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 30955c5..dcd9757 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
@@ -132,4 +132,4 @@
 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
+Extra constant evaluation: evaluated: 79, effectively constant: 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 6e1c5fd..e03bb94 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
@@ -67,4 +67,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 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 bd80008..513d138 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
@@ -48,4 +48,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 f8bacc6..6e4c566 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
@@ -91,4 +91,4 @@
 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
+Extra constant evaluation: evaluated: 24, effectively constant: 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 f723036..8a420c1 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
@@ -87,4 +87,4 @@
 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
+Extra constant evaluation: evaluated: 19, effectively constant: 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 a0cdefd..c81571e 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
@@ -33,4 +33,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 0a63c6f..59a56b80 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
@@ -41,4 +41,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 878ce86..cf93dc7 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
@@ -31,4 +31,4 @@
 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
+Extra constant evaluation: evaluated: 10, effectively constant: 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 f44fb74..69a5847 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
@@ -46,4 +46,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 43a5a8b..6b1da0c 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
@@ -69,4 +69,4 @@
 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
+Extra constant evaluation: evaluated: 16, effectively constant: 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 8a438d1..40e53fb 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
@@ -34,4 +34,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 228bf79..b321f75 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
@@ -28,4 +28,4 @@
 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
+Extra constant evaluation: evaluated: 8, effectively constant: 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 d34c55c..7c74a0a 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
@@ -39,4 +39,4 @@
 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
+Extra constant evaluation: evaluated: 10, effectively constant: 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 f3f2e8b..e523dd2 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
@@ -61,4 +61,4 @@
 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
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/rasta/enum.dart.outline.expect b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
index ee249a7..2be4a63 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
@@ -31,4 +31,4 @@
 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
+Extra constant evaluation: evaluated: 7, effectively constant: 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 8a4fbe0..d8064f6 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
@@ -47,4 +47,4 @@
 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
+Extra constant evaluation: evaluated: 4, effectively constant: 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 27bb674..9a23794 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
@@ -23,4 +23,4 @@
 
 Extra constant evaluation status:
 Evaluated: TypeLiteral @ org-dartlang-testcase:///issue_000043.dart:6:14 -> TypeLiteralConstant(C*)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 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 0a88a49..c9a26da 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
@@ -22,4 +22,4 @@
 Extra constant evaluation status:
 Evaluated: StringConcatenation @ org-dartlang-testcase:///issue_000045.dart:6:1 -> StringConstant("1
 \"\"\"")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 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 a99869d..9fbd201 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -54,4 +54,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 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 6eb4bee..8b6d4d8 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
@@ -38,4 +38,4 @@
 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
+Extra constant evaluation: evaluated: 33, effectively constant: 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 531daa2..7c94fe0 100644
--- a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
@@ -345,4 +345,4 @@
 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
+Extra constant evaluation: evaluated: 122, effectively constant: 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 a1307d9..b50aab5 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
@@ -545,4 +545,4 @@
 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
+Extra constant evaluation: evaluated: 72, effectively constant: 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 c70ff3c..2fda16d 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
@@ -35,4 +35,4 @@
 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
+Extra constant evaluation: evaluated: 3, effectively constant: 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 6f30679..85061fb 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
@@ -265,4 +265,4 @@
 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
+Extra constant evaluation: evaluated: 85, effectively constant: 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 29d84c1..83eb83e 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
@@ -37,4 +37,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///issue_30838.dart:15:15 -> StringConstant("hello")
-Extra constant evaluation: tries: 7, successes: 1
+Extra constant evaluation: evaluated: 7, effectively constant: 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 2bb9e3f..49cab5b 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
@@ -18,4 +18,4 @@
 
 Extra constant evaluation status:
 Evaluated: Let @ org-dartlang-testcase:///issue_31180.dart:6:10 -> NullConstant(null)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 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 c697a08..14ec668 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
@@ -18,4 +18,4 @@
 
 Extra constant evaluation status:
 Evaluated: IsExpression @ org-dartlang-testcase:///issue_31846.dart:6:14 -> BoolConstant(true)
-Extra constant evaluation: tries: 26, successes: 1
+Extra constant evaluation: evaluated: 26, effectively constant: 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 a5f5964..2538af6 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
@@ -36,4 +36,4 @@
 
 Extra constant evaluation status:
 Evaluated: Not @ org-dartlang-testcase:///issue_35220.dart:6:25 -> BoolConstant(true)
-Extra constant evaluation: tries: 3, successes: 1
+Extra constant evaluation: evaluated: 3, effectively constant: 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 969fc91..8436fb3 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
@@ -21,4 +21,4 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///issue_36793.dart:7:2 -> IntConstant(42)
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 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 013a7ab..84c4721 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
@@ -30,4 +30,4 @@
 
 Extra constant evaluation status:
 Evaluated: VariableGet @ org-dartlang-testcase:///contravariant_getter.dart:18:49 -> DoubleConstant(1.5)
-Extra constant evaluation: tries: 14, successes: 1
+Extra constant evaluation: evaluated: 14, effectively constant: 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 d832e66..12c20f9 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
@@ -33,4 +33,4 @@
 
 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
+Extra constant evaluation: evaluated: 10, effectively constant: 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 2a5053a..4656a41 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
@@ -64,4 +64,4 @@
 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
+Extra constant evaluation: evaluated: 58, effectively constant: 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 45354e3..c4d3d9c 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
@@ -92,4 +92,4 @@
 
 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
+Extra constant evaluation: evaluated: 58, effectively constant: 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 1b209c7..e094433 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
@@ -57,4 +57,4 @@
 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
+Extra constant evaluation: evaluated: 64, effectively constant: 8
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 1619610..3d0f6a4 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -161,8 +161,8 @@
 late_lowering/later: FormatterCrash
 late_lowering/override: FormatterCrash
 late_lowering/override_getter_setter: FormatterCrash
-late_lowering_sentinel/late_fields: FormatterCrash
 late_lowering/uninitialized_non_nullable_late_fields: FormatterCrash
+late_lowering_sentinel/late_fields: FormatterCrash
 nnbd/abstract_field_errors: FormatterCrash
 nnbd/covariant_late_field: FormatterCrash
 nnbd/extension_bounds: FormatterCrash
@@ -177,6 +177,7 @@
 nnbd/issue41597: FormatterCrash
 nnbd/issue42967: FormatterCrash
 nnbd/issue43278: FormatterCrash
+nnbd/issue43354: FormatterCrash
 nnbd/late: FormatterCrash
 nnbd/later: FormatterCrash
 nnbd/no_null_shorting_explicit_extension: 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 47b50a0..b5ffe41 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
@@ -16,4 +16,4 @@
 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
+Extra constant evaluation: evaluated: 10, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart
index 031deb0..a878e4a 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart
@@ -5,18 +5,47 @@
 import 'value_class_support_lib.dart';
 
 class Animal {
-  final int numberOfLegs;
+  final int? numberOfLegs;
   Animal({required this.numberOfLegs});
 }
 
 @valueClass
 class Cat extends Animal {
-  final int numberOfWhiskers;
+  final int? numberOfWhiskers;
 }
 
+class Foo {
+  int? bar, bar2;
+  Foo({this.bar, this.bar2});
+  Foo copyWith({int bar, int bar2}) {
+    return Foo(bar, bar2);
+  }
+}
+
+@valueClass
+class A {}
+
 main() {
  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
- (cat as dynamic).copyWith(numberOfWhiskers: 4);
+ // positive case
+ Cat cat2 = (cat as dynamic).copyWith(numberOfWhiskers: 4) as Cat;
+ // nested case
+ Cat cat3 = ((((cat as dynamic).copyWith(numberOfWhiskers: 4) as Cat) as dynamic).copyWith(numberOfLegs: 3) as Cat);
+ // wrong right hand side
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+ // empty arguments
+ Cat cat5 = (cat as dynamic).copyWith() as Cat;
+ // Some existing fields, extra arguments.
+ Cat cat6 = (cat as dynamic).copyWith(numberOfWhiskers: 4, numberOfHorns: 5) as Cat;
+
+ A a;
+ // No fields, extra arguments.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+
+
+ Foo foo = Foo(bar: 4, bar2: 5);
+ // wrong left hand side
+ Foo foo2 = (foo as dynamic).copyWith(bar: 4) as Foo;
 }
 
 
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 97e851f..93422d0 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
@@ -1,4 +1,15 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                     ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                              ^^^^
+//
 import self as self;
 import "dart:core" as core;
 import "value_class_support_lib.dart" as val;
@@ -6,16 +17,29 @@
 import "org-dartlang-testcase:///value_class_support_lib.dart";
 
 class Animal extends core::Object {
-  final field core::int numberOfLegs;
-  constructor •({required core::int numberOfLegs}) → self::Animal
+  final field core::int? numberOfLegs;
+  constructor •({required core::int? numberOfLegs}) → self::Animal
     ;
 }
 @val::valueClass
 class Cat extends self::Animal {
-  final field core::int numberOfWhiskers;
+  final field core::int? numberOfWhiskers;
   synthetic constructor •() → self::Cat
     ;
 }
+class Foo extends core::Object {
+  field core::int? bar;
+  field core::int? bar2;
+  constructor •({core::int? bar, core::int? bar2}) → self::Foo
+    ;
+  method copyWith({core::int bar, core::int bar2}) → self::Foo
+    ;
+}
+@val::valueClass
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
 static method main() → dynamic
   ;
 
@@ -36,4 +60,5 @@
 
 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
+Evaluated: StaticGet @ org-dartlang-testcase:///copy_with_call_sites.dart:25:2 -> StringConstant("valueClass")
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
index dd3b9ec..e404600 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.expect
@@ -2,17 +2,43 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                     ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                              ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     return Foo(bar, bar2);
+//               ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+//   Foo({this.bar, this.bar2});
+//   ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
 //  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
 //                    ^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat extends Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+//  Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+//                             ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+//  A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+//          ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numberOfWhiskers;
-//             ^^^^^^^^^^^^^^^^
+//   final int? numberOfWhiskers;
+//              ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -21,28 +47,70 @@
 import "org-dartlang-testcase:///value_class_support_lib.dart";
 
 class Animal extends core::Object {
-  final field core::int numberOfLegs;
-  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+  final field core::int? numberOfLegs;
+  constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
-  final field core::int numberOfWhiskers = null;
-  synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+  final field core::int? numberOfWhiskers = null;
+  synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
-  method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+  method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
+class Foo extends core::Object {
+  field core::int? bar;
+  field core::int? bar2;
+  constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+    : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+    ;
+  method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+    return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+    return Foo(bar, bar2);
+              ^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo;
+  }
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+    return other is self::A;
+  get /*isNullableByDefault*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
+  method /*isNullableByDefault*/ copyWith() → dynamic
+    return new self::A::•();
+}
 static method main() → dynamic {
-  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
                    ^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
-  let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+  self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+                            ^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::A a;
+  self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+         ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+  self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+  self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
index f361669..90ed8ba 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.strong.transformed.expect
@@ -2,17 +2,43 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                     ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                              ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     return Foo(bar, bar2);
+//               ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+//   Foo({this.bar, this.bar2});
+//   ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
 //  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
 //                    ^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat extends Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+//  Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+//                             ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+//  A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+//          ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numberOfWhiskers;
-//             ^^^^^^^^^^^^^^^^
+//   final int? numberOfWhiskers;
+//              ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -21,28 +47,70 @@
 import "org-dartlang-testcase:///value_class_support_lib.dart";
 
 class Animal extends core::Object {
-  final field core::int numberOfLegs;
-  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+  final field core::int? numberOfLegs;
+  constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
-  final field core::int numberOfWhiskers = null;
-  synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+  final field core::int? numberOfWhiskers = null;
+  synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
-  method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+  method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
+class Foo extends core::Object {
+  field core::int? bar;
+  field core::int? bar2;
+  constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+    : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+    ;
+  method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+    return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+    return Foo(bar, bar2);
+              ^";
+  }
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+    return other is self::A;
+  get /*isNullableByDefault*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
+  method /*isNullableByDefault*/ copyWith() → dynamic
+    return new self::A::•();
+}
 static method main() → dynamic {
-  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
                    ^^^^^^^^^^^^^^^^";
-  let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+  self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+                            ^^^^^^^^";
+  self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::A a;
+  self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+         ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+  self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+  self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
 }
 
 library /*isNonNullableByDefault*/;
@@ -70,3 +138,7 @@
   #C1 = null
   #C2 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///copy_with_call_sites.dart:26:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 128, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect
index 93a182d..55829f7 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline.expect
@@ -1,13 +1,22 @@
 import 'value_class_support_lib.dart';
 
 class Animal {
-  final int numberOfLegs;
+  final int? numberOfLegs;
   Animal({required this.numberOfLegs});
 }
 
 @valueClass
 class Cat extends Animal {
-  final int numberOfWhiskers;
+  final int? numberOfWhiskers;
 }
 
+class Foo {
+  int? bar, bar2;
+  Foo({this.bar, this.bar2});
+  Foo copyWith({int bar, int bar2}) {}
+}
+
+@valueClass
+class A {}
+
 main() {}
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect
index ce2b2e3..77c0c3c 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.textual_outline_modelled.expect
@@ -1,13 +1,22 @@
 import 'value_class_support_lib.dart';
 
+@valueClass
+class A {}
+
 class Animal {
   Animal({required this.numberOfLegs});
-  final int numberOfLegs;
+  final int? numberOfLegs;
 }
 
 @valueClass
 class Cat extends Animal {
-  final int numberOfWhiskers;
+  final int? numberOfWhiskers;
+}
+
+class Foo {
+  Foo({this.bar, this.bar2});
+  Foo copyWith({int bar, int bar2}) {}
+  int? bar, bar2;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
index dd3b9ec..e404600 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.expect
@@ -2,17 +2,43 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                     ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                              ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     return Foo(bar, bar2);
+//               ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+//   Foo({this.bar, this.bar2});
+//   ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
 //  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
 //                    ^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat extends Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+//  Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+//                             ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+//  A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+//          ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numberOfWhiskers;
-//             ^^^^^^^^^^^^^^^^
+//   final int? numberOfWhiskers;
+//              ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -21,28 +47,70 @@
 import "org-dartlang-testcase:///value_class_support_lib.dart";
 
 class Animal extends core::Object {
-  final field core::int numberOfLegs;
-  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+  final field core::int? numberOfLegs;
+  constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
-  final field core::int numberOfWhiskers = null;
-  synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+  final field core::int? numberOfWhiskers = null;
+  synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
-  method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+  method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
+class Foo extends core::Object {
+  field core::int? bar;
+  field core::int? bar2;
+  constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+    : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+    ;
+  method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+    return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+    return Foo(bar, bar2);
+              ^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo;
+  }
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+    return other is self::A;
+  get /*isNullableByDefault*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
+  method /*isNullableByDefault*/ copyWith() → dynamic
+    return new self::A::•();
+}
 static method main() → dynamic {
-  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
                    ^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
-  let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+  self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+                            ^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::A a;
+  self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+         ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+  self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+  self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
index f361669..90ed8ba 100644
--- a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.transformed.expect
@@ -2,17 +2,43 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: Optional parameter 'bar' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                     ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: Optional parameter 'bar2' should have a default value because its type 'int' doesn't allow null.
+//   Foo copyWith({int bar, int bar2}) {
+//                              ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     return Foo(bar, bar2);
+//               ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+//   Foo({this.bar, this.bar2});
+//   ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
 //  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
 //                    ^^^^^^^^^^^^^^^^
 // pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
 // class Cat extends Animal {
 //       ^
 //
-// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+//  Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+//                             ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+//  A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+//          ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
-//   final int numberOfWhiskers;
-//             ^^^^^^^^^^^^^^^^
+//   final int? numberOfWhiskers;
+//              ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -21,28 +47,70 @@
 import "org-dartlang-testcase:///value_class_support_lib.dart";
 
 class Animal extends core::Object {
-  final field core::int numberOfLegs;
-  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+  final field core::int? numberOfLegs;
+  constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
     : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
     ;
 }
 class Cat extends self::Animal {
-  final field core::int numberOfWhiskers = null;
-  synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+  final field core::int? numberOfWhiskers = null;
+  synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
     : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
     ;
   operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
-  method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
+  method /*isNullableByDefault*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
+class Foo extends core::Object {
+  field core::int? bar;
+  field core::int? bar2;
+  constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+    : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+    ;
+  method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+    return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+    return Foo(bar, bar2);
+              ^";
+  }
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator /*isNullableByDefault*/ ==(core::Object other) → core::bool
+    return other is self::A;
+  get /*isNullableByDefault*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
+  method /*isNullableByDefault*/ copyWith() → dynamic
+    return new self::A::•();
+}
 static method main() → dynamic {
-  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:18:20: Error: No named parameter with the name 'numberOfWhiskers'.
+  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
                    ^^^^^^^^^^^^^^^^";
-  let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs);
+  self::Cat cat2 = (let final dynamic #t1 = cat as{ForNonNullableByDefault} dynamic in #t1.copyWith(numberOfWhiskers: 4, numberOfLegs: #t1.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat3 = (let final dynamic #t2 = ((cat as{ForNonNullableByDefault} dynamic).copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic in #t2.copyWith(numberOfWhiskers: #t2.numberOfWhiskers, numberOfLegs: 3)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+                            ^^^^^^^^";
+  self::Cat cat5 = (let final dynamic #t3 = cat as{ForNonNullableByDefault} dynamic in #t3.copyWith(numberOfWhiskers: #t3.numberOfWhiskers, numberOfLegs: #t3.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat6 = (let final dynamic #t4 = cat as{ForNonNullableByDefault} dynamic in #t4.copyWith(numberOfWhiskers: 4, numberOfLegs: #t4.numberOfLegs)) as{ForNonNullableByDefault} self::Cat;
+  self::A a;
+  self::A a2 = (let final dynamic #t5 = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+         ^" in a) as{ForNonNullableByDefault} dynamic in #t5.copyWith()) as{ForNonNullableByDefault} self::A;
+  self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+  self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic).copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
 }
 
 library /*isNonNullableByDefault*/;
@@ -70,3 +138,7 @@
   #C1 = null
   #C2 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///copy_with_call_sites.dart:26:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 128, effectively constant: 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 7f28314..2f8fd42 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.outline.expect
@@ -30,4 +30,4 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///empty.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/empty.dart.strong.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
index e659acf..ea8f20e 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
@@ -13,6 +13,8 @@
     return other is self::EmptyClass;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "EmptyClass()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::EmptyClass::•();
 }
diff --git a/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
index e659acf..0ce153d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
@@ -13,6 +13,8 @@
     return other is self::EmptyClass;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "EmptyClass()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::EmptyClass::•();
 }
@@ -42,3 +44,7 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///empty.dart:8:7 -> StringConstant("EmptyClass()")
+Extra constant evaluation: evaluated: 40, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/empty.dart.weak.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
index e659acf..ea8f20e 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
@@ -13,6 +13,8 @@
     return other is self::EmptyClass;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "EmptyClass()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::EmptyClass::•();
 }
diff --git a/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
index e659acf..0ce153d 100644
--- a/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
@@ -13,6 +13,8 @@
     return other is self::EmptyClass;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "EmptyClass()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::EmptyClass::•();
 }
@@ -42,3 +44,7 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///empty.dart:8:7 -> StringConstant("EmptyClass()")
+Extra constant evaluation: evaluated: 40, effectively constant: 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 492c803..da7ab09 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
@@ -55,4 +55,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
index 6852df4..8f5b282 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -44,6 +46,8 @@
     return other is self::F;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "F()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::F::•();
 }
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
index 27d97db..f6df7f8 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -39,6 +41,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -50,6 +54,8 @@
     return other is self::F;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "F()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::F::•();
 }
@@ -79,3 +85,9 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:18:7 -> StringConstant("F()")
+Extra constant evaluation: evaluated: 52, effectively constant: 3
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
index 6852df4..8f5b282 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -44,6 +46,8 @@
     return other is self::F;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "F()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::F::•();
 }
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
index 27d97db..f6df7f8 100644
--- a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -39,6 +41,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -50,6 +54,8 @@
     return other is self::F;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "F()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::F::•();
 }
@@ -79,3 +85,9 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///explicit_mixin.dart:18:7 -> StringConstant("F()")
+Extra constant evaluation: evaluated: 52, effectively constant: 3
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 844ecde..941c5938 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
@@ -31,4 +31,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
index ae9077e..106c4ea 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
@@ -21,6 +21,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
index ae9077e..106c4ea 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
@@ -21,6 +21,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
index ae9077e..106c4ea 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
@@ -21,6 +21,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
index ae9077e..106c4ea 100644
--- a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
@@ -21,6 +21,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
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 83976fb..3c037ce 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
@@ -35,4 +35,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
index 805f287..8b97d06 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
@@ -22,6 +22,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
index 805f287..8b97d06 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
@@ -22,6 +22,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
index 805f287..8b97d06 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
@@ -22,6 +22,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
index 805f287..8b97d06 100644
--- a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
@@ -22,6 +22,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
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 e21ab6e..a164ad8 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
@@ -36,4 +36,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
index 95373ed..c12b1c3 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
@@ -27,6 +27,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
index 95373ed..c12b1c3 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
@@ -27,6 +27,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
index 95373ed..c12b1c3 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
@@ -27,6 +27,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
index 95373ed..c12b1c3 100644
--- a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
@@ -27,6 +27,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
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 133d2e8..fd0c916 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
@@ -33,4 +33,4 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///simple.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
index 862862f..67bbec1 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
@@ -43,6 +43,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
index 3213a78..88adc14 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
@@ -43,6 +43,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
index 862862f..67bbec1 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
@@ -43,6 +43,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
index 3213a78..88adc14 100644
--- a/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
@@ -43,6 +43,8 @@
     return other is self::Animal && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Animal}.{self::Animal::numberOfLegs});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs}) → dynamic
     return new self::Animal::•(numberOfLegs: numberOfLegs);
 }
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 b9fa359..6b5a117 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
@@ -38,4 +38,4 @@
 
 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
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
index d02e298..8ab2483 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
@@ -49,6 +49,8 @@
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
index 6ed1828..2227f34 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
@@ -49,6 +49,8 @@
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
index d02e298..8ab2483 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
@@ -49,6 +49,8 @@
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
index 6ed1828..2227f34 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
@@ -49,6 +49,8 @@
     return other is self::Cat && this.{self::Animal::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Animal::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}, this.{self::Animal::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
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 817542e..a1dd54d 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
@@ -46,4 +46,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
index 240ae96..95e0356 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
@@ -31,6 +31,8 @@
     return other is self::Cat;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat::•();
 }
@@ -48,6 +50,8 @@
     return other is self::Cat2;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat2::•();
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
index 240ae96..b55acf5 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
@@ -31,6 +31,8 @@
     return other is self::Cat;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat::•();
 }
@@ -48,6 +50,8 @@
     return other is self::Cat2;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat2::•();
 }
@@ -77,3 +81,8 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:12:7 -> StringConstant("Cat()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:19:7 -> StringConstant("Cat2()")
+Extra constant evaluation: evaluated: 46, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
index 240ae96..95e0356 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
@@ -31,6 +31,8 @@
     return other is self::Cat;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat::•();
 }
@@ -48,6 +50,8 @@
     return other is self::Cat2;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat2::•();
 }
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
index 240ae96..b55acf5 100644
--- a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
@@ -31,6 +31,8 @@
     return other is self::Cat;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat::•();
 }
@@ -48,6 +50,8 @@
     return other is self::Cat2;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::Cat2::•();
 }
@@ -77,3 +81,8 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:12:7 -> StringConstant("Cat()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_extends_non_value_error.dart:19:7 -> StringConstant("Cat2()")
+Extra constant evaluation: evaluated: 46, effectively constant: 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 09d9e5f..73b6a82 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
@@ -85,4 +85,4 @@
 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
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
index 81644f5..0c996cf 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
@@ -92,6 +92,8 @@
     return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -111,6 +113,8 @@
     return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
index bcf2a6e..8073f01 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
@@ -92,6 +92,8 @@
     return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -111,6 +113,8 @@
     return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
index 5c550c6..25f2810 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
@@ -92,6 +92,8 @@
     return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -111,6 +113,8 @@
     return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
index 455ce4f..97545af 100644
--- a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
@@ -92,6 +92,8 @@
     return other is self::Cat && this.{self::Cat::numberOfLegs}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfLegs}) && this.{self::Cat::numberOfWhiskers}.{core::num::==}(other{self::Cat}.{self::Cat::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}, this.{self::Cat::numberOfLegs}.{core::num::hashCode}), this.{self::Cat::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
@@ -111,6 +113,8 @@
     return other is self::Cat2 && this.{self::Cat2::numberOfLegs}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfLegs}) && this.{self::Cat2::numberOfWhiskers}.{core::num::==}(other{self::Cat2}.{self::Cat2::numberOfWhiskers});
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}, this.{self::Cat2::numberOfLegs}.{core::num::hashCode}), this.{self::Cat2::numberOfWhiskers}.{core::num::hashCode}));
+  method /*isNullableByDefault*/ toString() → core::String
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}.{core::int::toString}()}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}.{core::int::toString}()})";
   method /*isNullableByDefault*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
     return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
 }
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 e4f0339..cbe7b43 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
@@ -52,4 +52,4 @@
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///value_mixin_error.dart:7:2 -> StringConstant("valueClass")
-Extra constant evaluation: tries: 1, successes: 1
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
index f0c520b..5b97acf 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
index 4ea2146..5b474c0 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -29,6 +31,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -73,3 +77,8 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 46, effectively constant: 2
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
index f0c520b..5b97acf 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
index 4ea2146..5b474c0 100644
--- a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
@@ -13,6 +13,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -29,6 +31,8 @@
     return other is self::A;
   get /*isNullableByDefault*/ hashCode() → core::int
     return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode});
+  method /*isNullableByDefault*/ toString() → core::String
+    return "A()";
   method /*isNullableByDefault*/ copyWith() → dynamic
     return new self::A::•();
 }
@@ -73,3 +77,8 @@
 constants  {
   #C1 = "valueClass"
 }
+
+Extra constant evaluation status:
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Evaluated: StringConcatenation @ org-dartlang-testcase:///value_mixin_error.dart:8:7 -> StringConstant("A()")
+Extra constant evaluation: evaluated: 46, effectively constant: 2
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 217885d..22cd762 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
@@ -180,4 +180,4 @@
 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
+Extra constant evaluation: evaluated: 42, effectively constant: 13
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index c0f3e48..a82fc45 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -4339,14 +4339,25 @@
   }
 }
 
+enum LogicalExpressionOperator { AND, OR }
+
+String logicalExpressionOperatorToString(LogicalExpressionOperator operator) {
+  switch (operator) {
+    case LogicalExpressionOperator.AND:
+      return "&&";
+    case LogicalExpressionOperator.OR:
+      return "||";
+  }
+  throw "Unhandled LogicalExpressionOperator: ${operator}";
+}
+
 /// 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 ??
+  LogicalExpressionOperator operatorEnum; // AND (&&) or OR (||).
   Expression right;
 
-  LogicalExpression(this.left, this.operator, this.right) {
+  LogicalExpression(this.left, this.operatorEnum, this.right) {
     left?.parent = this;
     right?.parent = this;
   }
@@ -4383,7 +4394,7 @@
   void toTextInternal(AstPrinter printer) {
     int minimumPrecedence = precedence;
     printer.writeExpression(left, minimumPrecedence: minimumPrecedence);
-    printer.write(' $operator ');
+    printer.write(' ${logicalExpressionOperatorToString(operatorEnum)} ');
     printer.writeExpression(right, minimumPrecedence: minimumPrecedence + 1);
   }
 }
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 63cbbf3..34b3512 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1638,12 +1638,12 @@
     return variableStack[index];
   }
 
-  String logicalOperatorToString(int index) {
+  LogicalExpressionOperator logicalOperatorToEnum(int index) {
     switch (index) {
       case 0:
-        return '&&';
+        return LogicalExpressionOperator.AND;
       case 1:
-        return '||';
+        return LogicalExpressionOperator.OR;
       default:
         throw fail('unexpected logical operator index: $index');
     }
@@ -1786,7 +1786,7 @@
         return new NullCheck(readExpression())..fileOffset = offset;
       case Tag.LogicalExpression:
         return new LogicalExpression(readExpression(),
-            logicalOperatorToString(readByte()), readExpression());
+            logicalOperatorToEnum(readByte()), readExpression());
       case Tag.ConditionalExpression:
         return new ConditionalExpression(readExpression(), readExpression(),
             readExpression(), readDartTypeOption());
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index f85987b..9489134 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1549,11 +1549,11 @@
     writeNode(node.operand);
   }
 
-  int logicalOperatorIndex(String operator) {
+  int logicalOperatorIndex(LogicalExpressionOperator operator) {
     switch (operator) {
-      case '&&':
+      case LogicalExpressionOperator.AND:
         return 0;
-      case '||':
+      case LogicalExpressionOperator.OR:
         return 1;
     }
     throw new ArgumentError('Not a logical operator: $operator');
@@ -1563,7 +1563,7 @@
   void visitLogicalExpression(LogicalExpression node) {
     writeByte(Tag.LogicalExpression);
     writeNode(node.left);
-    writeByte(logicalOperatorIndex(node.operator));
+    writeByte(logicalOperatorIndex(node.operatorEnum));
     writeNode(node.right);
   }
 
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 6b7bbad..e326843 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -203,7 +203,7 @@
 
   visitLogicalExpression(LogicalExpression node) {
     return new LogicalExpression(
-        clone(node.left), node.operator, clone(node.right));
+        clone(node.left), node.operatorEnum, clone(node.right));
   }
 
   visitConditionalExpression(ConditionalExpression node) {
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 2597bba..3bbef8a 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -376,7 +376,8 @@
   if (!allowSuperBounded) return result;
 
   result = null;
-  type = convertSuperBoundedToRegularBounded(typeEnvironment, type, bottomType);
+  type = convertSuperBoundedToRegularBounded(
+      library, typeEnvironment, type, bottomType);
   List<DartType> argumentsToReport = arguments.toList();
   if (type is InterfaceType) {
     variables = type.classNode.typeParameters;
@@ -483,13 +484,16 @@
 /// Replaces all covariant occurrences of `dynamic`, `Object`, and `void` with
 /// [BottomType] and all contravariant occurrences of `Null` and [BottomType]
 /// with `Object`.
-DartType convertSuperBoundedToRegularBounded(
+DartType convertSuperBoundedToRegularBounded(Library clientLibrary,
     TypeEnvironment typeEnvironment, DartType type, DartType bottomType,
     {bool isCovariant = true}) {
-  if ((type is DynamicType ||
+  bool isTop = clientLibrary.isNonNullableByDefault
+      ? typeEnvironment.coreTypes.isTop(type)
+      : type is DynamicType ||
           type is VoidType ||
-          isObject(typeEnvironment, type)) &&
-      isCovariant) {
+          type is InterfaceType &&
+              type.classNode == typeEnvironment.coreTypes.objectClass;
+  if (isTop && isCovariant) {
     return bottomType;
   } else if ((type == bottomType || type is BottomType) && !isCovariant) {
     return typeEnvironment.coreTypes.objectLegacyRawType;
@@ -498,7 +502,7 @@
         new List<DartType>(type.typeArguments.length);
     for (int i = 0; i < replacedTypeArguments.length; i++) {
       replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
-          typeEnvironment, type.typeArguments[i], bottomType,
+          clientLibrary, typeEnvironment, type.typeArguments[i], bottomType,
           isCovariant: isCovariant);
     }
     return new InterfaceType(
@@ -508,20 +512,23 @@
         new List<DartType>(type.typeArguments.length);
     for (int i = 0; i < replacedTypeArguments.length; i++) {
       replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
-          typeEnvironment, type.typeArguments[i], bottomType,
+          clientLibrary, typeEnvironment, type.typeArguments[i], bottomType,
           isCovariant: isCovariant);
     }
     return new TypedefType(
         type.typedefNode, type.nullability, replacedTypeArguments);
   } else if (type is FunctionType) {
     var replacedReturnType = convertSuperBoundedToRegularBounded(
-        typeEnvironment, type.returnType, bottomType,
+        clientLibrary, typeEnvironment, type.returnType, bottomType,
         isCovariant: isCovariant);
     var replacedPositionalParameters =
         new List<DartType>(type.positionalParameters.length);
     for (int i = 0; i < replacedPositionalParameters.length; i++) {
       replacedPositionalParameters[i] = convertSuperBoundedToRegularBounded(
-          typeEnvironment, type.positionalParameters[i], bottomType,
+          clientLibrary,
+          typeEnvironment,
+          type.positionalParameters[i],
+          bottomType,
           isCovariant: !isCovariant);
     }
     var replacedNamedParameters =
@@ -529,8 +536,8 @@
     for (int i = 0; i < replacedNamedParameters.length; i++) {
       replacedNamedParameters[i] = new NamedType(
           type.namedParameters[i].name,
-          convertSuperBoundedToRegularBounded(
-              typeEnvironment, type.namedParameters[i].type, bottomType,
+          convertSuperBoundedToRegularBounded(clientLibrary, typeEnvironment,
+              type.namedParameters[i].type, bottomType,
               isCovariant: !isCovariant));
     }
     return new FunctionType(
@@ -542,17 +549,12 @@
   } else if (type is FutureOrType) {
     return new FutureOrType(
         convertSuperBoundedToRegularBounded(
-            typeEnvironment, type.typeArgument, bottomType),
+            clientLibrary, typeEnvironment, type.typeArgument, bottomType),
         type.declaredNullability);
   }
   return type;
 }
 
-bool isObject(TypeEnvironment typeEnvironment, DartType type) {
-  return type is InterfaceType &&
-      type.classNode == typeEnvironment.coreTypes.objectClass;
-}
-
 int computeVariance(TypeParameter typeParameter, DartType type,
     {Map<TypeParameter, Map<DartType, int>> computedVariances}) {
   computedVariances ??= new Map<TypeParameter, Map<DartType, int>>.identity();
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 209122a..da9af2b 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1383,9 +1383,10 @@
   }
 
   visitLogicalExpression(LogicalExpression node) {
-    int precedence = Precedence.binaryPrecedence[node.operator];
+    int precedence = Precedence
+        .binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
     writeExpression(node.left, precedence);
-    writeSpaced(node.operator);
+    writeSpaced(logicalExpressionOperatorToString(node.operatorEnum));
     writeExpression(node.right, precedence + 1);
   }
 
@@ -2484,7 +2485,7 @@
   int visitNot(Not node) => PREFIX;
   int visitNullCheck(NullCheck node) => PRIMARY;
   int visitLogicalExpression(LogicalExpression node) =>
-      binaryPrecedence[node.operator];
+      binaryPrecedence[logicalExpressionOperatorToString(node.operatorEnum)];
   int visitConditionalExpression(ConditionalExpression node) => CONDITIONAL;
   int visitStringConcatenation(StringConcatenation node) => PRIMARY;
   int visitIsExpression(IsExpression node) => RELATIONAL;
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index ef7c689..60a3e19 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -45,7 +45,7 @@
   String visitInvalidExpression(InvalidExpression _) => "invalid";
   String visitNot(Not _) => "not";
   String visitLogicalExpression(LogicalExpression expression) {
-    return expression.operator;
+    return logicalExpressionOperatorToString(expression.operatorEnum);
   }
 
   String visitStringConcatenation(StringConcatenation _) => "concat";
@@ -143,7 +143,8 @@
 }
 
 LogicalExpression wrapLogicalAnd(Tuple2<Expression, Expression> tuple) {
-  return new LogicalExpression(tuple.first, '&&', tuple.second);
+  return new LogicalExpression(
+      tuple.first, LogicalExpressionOperator.AND, tuple.second);
 }
 
 TextSerializer<LogicalExpression> logicalOrSerializer = new Wrapped(
@@ -152,7 +153,8 @@
     new Tuple2Serializer(expressionSerializer, expressionSerializer));
 
 LogicalExpression wrapLogicalOr(Tuple2<Expression, Expression> tuple) {
-  return new LogicalExpression(tuple.first, '||', tuple.second);
+  return new LogicalExpression(
+      tuple.first, LogicalExpressionOperator.OR, tuple.second);
 }
 
 TextSerializer<StringConcatenation> stringConcatenationSerializer = new Wrapped(
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 9d5b372..5c32065 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -351,7 +351,7 @@
         new MethodInvocation(expr.right, new Name('=='),
             new Arguments(<Expression>[new BoolLiteral(true)])))));
     var then, otherwise;
-    if (expr.operator == '&&') {
+    if (expr.operatorEnum == LogicalExpressionOperator.AND) {
       then = rightBody;
       otherwise = null;
     } else {
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index c616cea..d56989a 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -76,7 +76,6 @@
 
 void transformValueClass(Class cls, CoreTypes coreTypes,
     ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {
-  List<VariableDeclaration> allVariables = queryAllInstanceVariables(cls);
   Constructor syntheticConstructor = null;
   for (Constructor constructor in cls.constructors) {
     if (constructor.isSynthetic) {
@@ -84,11 +83,16 @@
     }
   }
 
+  List<VariableDeclaration> allVariables = queryAllInstanceVariables(cls);
+  List<VariableDeclaration> allVariablesList = allVariables.toList();
+  allVariablesList.sort((a, b) => a.name.compareTo(b.name));
+
   addConstructor(cls, coreTypes, syntheticConstructor);
-  addEqualsOperator(cls, coreTypes, hierarchy, allVariables.toList());
-  addHashCode(cls, coreTypes, hierarchy, allVariables.toList());
-  addCopyWith(cls, coreTypes, hierarchy, allVariables.toList(),
-      syntheticConstructor, typeEnvironment);
+  addEqualsOperator(cls, coreTypes, hierarchy, allVariablesList);
+  addHashCode(cls, coreTypes, hierarchy, allVariablesList);
+  addToString(cls, coreTypes, hierarchy, allVariablesList);
+  addCopyWith(cls, coreTypes, hierarchy, allVariablesList, syntheticConstructor,
+      typeEnvironment);
 }
 
 void addConstructor(
@@ -128,7 +132,8 @@
 }
 
 void addEqualsOperator(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariables) {
+    List<VariableDeclaration> allVariablesList) {
+  List<VariableDeclaration> allVariables = allVariablesList.toList();
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Operator &&
         procedure.name.text == "==") {
@@ -136,9 +141,7 @@
       return;
     }
   }
-  DartType returnType = cls.enclosingLibrary.isNonNullableByDefault
-      ? coreTypes.boolNonNullableRawType
-      : coreTypes.boolLegacyRawType;
+  DartType returnType = coreTypes.boolRawType(cls.enclosingLibrary.nonNullable);
   DartType myType = coreTypes.thisInterfaceType(cls, Nullability.nonNullable);
 
   VariableDeclaration other = VariableDeclaration("other",
@@ -174,8 +177,8 @@
                   targetsEquals[f]))
               .fold(
                   IsExpression(VariableGet(other), myType),
-                  (previousValue, element) =>
-                      LogicalExpression(previousValue, '&&', element))),
+                  (previousValue, element) => LogicalExpression(
+                      previousValue, LogicalExpressionOperator.AND, element))),
           returnType: returnType,
           positionalParameters: [other]),
       fileUri: cls.fileUri)
@@ -184,7 +187,8 @@
 }
 
 void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariables) {
+    List<VariableDeclaration> allVariablesList) {
+  List<VariableDeclaration> allVariables = allVariablesList.toList();
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Getter &&
         procedure.name.text == "hashCode") {
@@ -192,9 +196,7 @@
       return;
     }
   }
-  DartType returnType = cls.enclosingLibrary.isNonNullableByDefault
-      ? coreTypes.intNonNullableRawType
-      : coreTypes.intLegacyRawType;
+  DartType returnType = coreTypes.intRawType(cls.enclosingLibrary.nonNullable);
 
   Procedure hashCombine, hashFinish;
   HashCombineMethodsScanner hashCombineMethodsScanner =
@@ -252,13 +254,48 @@
     ..fileOffset = cls.fileOffset);
 }
 
+void addToString(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
+    List<VariableDeclaration> allVariablesList) {
+  List<Expression> wording = [StringLiteral("${cls.name}(")];
+
+  for (VariableDeclaration variable in allVariablesList) {
+    wording.add(StringLiteral("${variable.name}: "));
+    wording.add(MethodInvocation(
+        PropertyGet(ThisExpression(), Name(variable.name),
+            hierarchy.getInterfaceMember(cls, Name(variable.name))),
+        Name("toString"),
+        Arguments([]),
+        (variable.type is InterfaceType)
+            ? hierarchy.getInterfaceMember(
+                (variable.type as InterfaceType).classNode, Name("toString"))
+            : null));
+    wording.add(StringLiteral(", "));
+  }
+  if (allVariablesList.length != 0) {
+    wording[wording.length - 1] = StringLiteral(")");
+  } else {
+    wording.add(StringLiteral(")"));
+  }
+  DartType returnType =
+      coreTypes.stringRawType(cls.enclosingLibrary.nonNullable);
+  cls.addMember(Procedure(
+      Name("toString"),
+      ProcedureKind.Method,
+      FunctionNode(ReturnStatement(StringConcatenation(wording)),
+          returnType: returnType),
+      fileUri: cls.fileUri)
+    ..fileOffset = cls.fileOffset);
+}
+
 void addCopyWith(
     Class cls,
     CoreTypes coreTypes,
     ClassHierarchy hierarchy,
-    List<VariableDeclaration> allVariables,
+    List<VariableDeclaration> allVariablesList,
     Constructor syntheticConstructor,
     TypeEnvironment typeEnvironment) {
+  List<VariableDeclaration> allVariables = allVariablesList.toList();
+
   Map<VariableDeclaration, Member> targetsEquals = new Map();
   Map<VariableDeclaration, Member> targets = new Map();
   for (VariableDeclaration variable in allVariables) {
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 905375c..6bf0a97 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -57,7 +57,7 @@
       VariableDeclaration variable = test.makeVariable();
       test.addNode(LogicalExpression(
           new Let(variable, new VariableGet(variable)),
-          '&&',
+          LogicalExpressionOperator.AND,
           new VariableGet(variable)));
       return variable;
     },
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 2140235..5a8f2bb 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/pkg/testing/lib/src/chain.dart b/pkg/testing/lib/src/chain.dart
index e51bcb4..a6c982d 100644
--- a/pkg/testing/lib/src/chain.dart
+++ b/pkg/testing/lib/src/chain.dart
@@ -354,7 +354,12 @@
 
   final List<String> logs = <String>[];
 
-  Result(this.output, this.outcome, this.error, this.trace);
+  /// If set, running the test with '-D$autoFixCommand' will automatically
+  /// update the test to match new expectations.
+  final String autoFixCommand;
+
+  Result(this.output, this.outcome, this.error, this.trace,
+      {this.autoFixCommand});
 
   Result.pass(O output) : this(output, Expectation.Pass, null, null);
 
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 2a54a62..1846f60 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -1635,8 +1635,7 @@
     if (condition is Not) {
       _genConditionAndJumpIf(condition.operand, !value, dest);
     } else if (condition is LogicalExpression) {
-      assert(condition.operator == '||' || condition.operator == '&&');
-      final isOR = (condition.operator == '||');
+      final isOR = (condition.operatorEnum == LogicalExpressionOperator.OR);
 
       Label shortCircuit, done;
       if (isOR == value) {
@@ -3221,12 +3220,10 @@
 
   @override
   visitLogicalExpression(LogicalExpression node) {
-    assert(node.operator == '||' || node.operator == '&&');
-
     final Label shortCircuit = new Label();
     final Label done = new Label();
     final int temp = locals.tempIndexInFrame(node);
-    final isOR = (node.operator == '||');
+    final isOR = (node.operatorEnum == LogicalExpressionOperator.OR);
 
     _genConditionAndJumpIf(node.left, isOR, shortCircuit);
 
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 0f04cfa..fb0fc33 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -1317,8 +1317,7 @@
       _variableValues = null;
       return;
     } else if (node is LogicalExpression) {
-      assert(node.operator == '||' || node.operator == '&&');
-      final isOR = (node.operator == '||');
+      final isOR = (node.operatorEnum == LogicalExpressionOperator.OR);
       _visitCondition(node.left, trueState, falseState);
       if (isOR) {
         // expr1 || expr2
diff --git a/pkg/vm/lib/transformations/unreachable_code_elimination.dart b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
index 6dd07b5..8444ce7 100644
--- a/pkg/vm/lib/transformations/unreachable_code_elimination.dart
+++ b/pkg/vm/lib/transformations/unreachable_code_elimination.dart
@@ -79,22 +79,23 @@
     node.transformChildren(this);
     final left = node.left;
     final right = node.right;
-    final operator = node.operator;
+    final operatorEnum = node.operatorEnum;
     if (_isBoolConstant(left)) {
       final leftValue = _getBoolConstantValue(left);
       if (_isBoolConstant(right)) {
         final rightValue = _getBoolConstantValue(right);
-        if (operator == '||') {
+        if (operatorEnum == LogicalExpressionOperator.OR) {
           return _createBoolLiteral(leftValue || rightValue, node.fileOffset);
-        } else if (operator == '&&') {
+        } else if (operatorEnum == LogicalExpressionOperator.AND) {
           return _createBoolLiteral(leftValue && rightValue, node.fileOffset);
         } else {
-          throw 'Unexpected LogicalExpression operator ${operator}: $node';
+          throw 'Unexpected LogicalExpression operator ${operatorEnum}: $node';
         }
       } else {
-        if (leftValue && operator == '||') {
+        if (leftValue && operatorEnum == LogicalExpressionOperator.OR) {
           return _createBoolLiteral(true, node.fileOffset);
-        } else if (!leftValue && operator == '&&') {
+        } else if (!leftValue &&
+            operatorEnum == LogicalExpressionOperator.AND) {
           return _createBoolLiteral(false, node.fileOffset);
         }
       }
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index b049853..ca07f4f 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Changelog
 
+## 5.3.0
+- Added support for `dart:io` extensions version 1.4.
+- Update to version `3.40.0` of the spec.
+- Added `IsolateFlag` class.
+- Added `isolateFlags` property to `Isolate`.
+
 ## 5.2.0
 - Added support for `dart:io` extensions version 1.3.
 - Added combination getter/setter `httpEnableTimelineLogging`.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index 52746bd..e2ae6d1 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -47,6 +47,13 @@
   return list;
 }
 
+List<vms.IsolateFlag> assertListOfIsolateFlag(List<vms.IsolateFlag> list) {
+  for (vms.IsolateFlag elem in list) {
+    assertIsolateFlag(elem);
+  }
+  return list;
+}
+
 String assertString(String obj) {
   assertNotNull(obj);
   if (obj.isEmpty) throw 'expected non-zero length string';
@@ -667,6 +674,7 @@
   assertString(obj.number);
   assertString(obj.name);
   assertBool(obj.isSystemIsolate);
+  assertListOfIsolateFlag(obj.isolateFlags);
   assertInt(obj.startTime);
   assertBool(obj.runnable);
   assertInt(obj.livePorts);
@@ -678,6 +686,13 @@
   return obj;
 }
 
+vms.IsolateFlag assertIsolateFlag(vms.IsolateFlag obj) {
+  assertNotNull(obj);
+  assertString(obj.name);
+  assertString(obj.valueAsString);
+  return obj;
+}
+
 vms.IsolateGroupRef assertIsolateGroupRef(vms.IsolateGroupRef obj) {
   assertNotNull(obj);
   assertString(obj.type);
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index fbcce7d..ae6691f 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -79,6 +79,7 @@
 src/org/dartlang/vm/service/element/InstanceRef.java
 src/org/dartlang/vm/service/element/InstanceSet.java
 src/org/dartlang/vm/service/element/Isolate.java
+src/org/dartlang/vm/service/element/IsolateFlag.java
 src/org/dartlang/vm/service/element/IsolateGroup.java
 src/org/dartlang/vm/service/element/IsolateGroupRef.java
 src/org/dartlang/vm/service/element/IsolateRef.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index e076127..d0564a6 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.39
+version=3.40
diff --git a/pkg/vm_service/lib/src/dart_io_extensions.dart b/pkg/vm_service/lib/src/dart_io_extensions.dart
index ce777d6..886b947 100644
--- a/pkg/vm_service/lib/src/dart_io_extensions.dart
+++ b/pkg/vm_service/lib/src/dart_io_extensions.dart
@@ -12,6 +12,14 @@
 
 extension DartIOExtension on VmService {
   static bool _factoriesRegistered = false;
+  static Map<String, Version> _isolateVersion = {};
+
+  Future<Version> _version(String isolateId) async {
+    if (_isolateVersion[isolateId] == null) {
+      _isolateVersion[isolateId] = await getDartIOVersion(isolateId);
+    }
+    return _isolateVersion[isolateId];
+  }
 
   /// The `getDartIOVersion` RPC returns the available version of the dart:io
   /// service protocol extensions.
@@ -58,11 +66,26 @@
         'enable': enable,
       });
 
+  /// The _httpEnableTimelineLogging_ RPC is used to set and inspect the value of
+  /// `HttpClient.enableTimelineLogging`, which determines if HTTP client requests
+  /// should be logged to the timeline. If `enabled` is provided, the state of
+  /// `HttpClient.enableTimelineLogging` will be updated to the value of `enabled`.
+  ///
+  /// If the value of `HttpClient.enableTimelineLogging` is changed, a
+  /// `HttpTimelineLoggingStateChange` event will be sent on the `Extension` stream.
   Future<HttpTimelineLoggingState> httpEnableTimelineLogging(String isolateId,
-          [bool enable]) =>
-      _callHelper('ext.dart.io.httpEnableTimelineLogging', isolateId, args: {
-        if (enable != null) 'enable': enable,
-      });
+      [bool enabled]) async {
+    final version = await _version(isolateId);
+    // Parameter name changed in version 1.4.
+    final enableKey =
+        ((version.major == 1 && version.minor > 3) || version.major >= 2)
+            ? 'enabled'
+            : 'enable';
+    return _callHelper('ext.dart.io.httpEnableTimelineLogging', isolateId,
+        args: {
+          if (enabled != null) enableKey: enabled,
+        });
+  }
 
   /// The `getOpenFiles` RPC is used to retrieve the list of files currently
   /// opened files by `dart:io` from a given isolate.
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 4f63e01..fd20c5b 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.39.0';
+const String vmServiceVersion = '3.40.0';
 
 /// @optional
 const String optional = 'optional';
@@ -139,6 +139,7 @@
   'Instance': Instance.parse,
   '@Isolate': IsolateRef.parse,
   'Isolate': Isolate.parse,
+  'IsolateFlag': IsolateFlag.parse,
   '@IsolateGroup': IsolateGroupRef.parse,
   'IsolateGroup': IsolateGroup.parse,
   'InboundReferences': InboundReferences.parse,
@@ -4745,6 +4746,10 @@
   /// internal use. If `false`, this isolate is likely running user code.
   bool isSystemIsolate;
 
+  /// The list of isolate flags provided to this isolate. See Dart_IsolateFlags
+  /// in dart_api.h for the list of accepted isolate flags.
+  List<IsolateFlag> isolateFlags;
+
   /// The time that the VM started in milliseconds since the epoch.
   ///
   /// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
@@ -4794,6 +4799,7 @@
     @required this.number,
     @required this.name,
     @required this.isSystemIsolate,
+    @required this.isolateFlags,
     @required this.startTime,
     @required this.runnable,
     @required this.livePorts,
@@ -4812,6 +4818,8 @@
     number = json['number'];
     name = json['name'];
     isSystemIsolate = json['isSystemIsolate'];
+    isolateFlags = List<IsolateFlag>.from(
+        createServiceObject(json['isolateFlags'], const ['IsolateFlag']) ?? []);
     startTime = json['startTime'];
     runnable = json['runnable'];
     livePorts = json['livePorts'];
@@ -4838,6 +4846,7 @@
       'number': number,
       'name': name,
       'isSystemIsolate': isSystemIsolate,
+      'isolateFlags': isolateFlags.map((f) => f.toJson()).toList(),
       'startTime': startTime,
       'runnable': runnable,
       'livePorts': livePorts,
@@ -4861,6 +4870,40 @@
   String toString() => '[Isolate]';
 }
 
+/// Represents the value of a single isolate flag. See [Isolate].
+class IsolateFlag {
+  static IsolateFlag parse(Map<String, dynamic> json) =>
+      json == null ? null : IsolateFlag._fromJson(json);
+
+  /// The name of the flag.
+  String name;
+
+  /// The value of this flag as a string.
+  String valueAsString;
+
+  IsolateFlag({
+    @required this.name,
+    @required this.valueAsString,
+  });
+
+  IsolateFlag._fromJson(Map<String, dynamic> json) {
+    name = json['name'];
+    valueAsString = json['valueAsString'];
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'name': name,
+      'valueAsString': valueAsString,
+    });
+    return json;
+  }
+
+  String toString() =>
+      '[IsolateFlag name: ${name}, valueAsString: ${valueAsString}]';
+}
+
 /// `IsolateGroupRef` is a reference to an `IsolateGroup` object.
 class IsolateGroupRef extends Response {
   static IsolateGroupRef parse(Map<String, dynamic> json) =>
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index c2280d1..690f8b6 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
-version: 5.2.0
+version: 5.3.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/test/get_isolate_rpc_test.dart b/pkg/vm_service/test/get_isolate_rpc_test.dart
new file mode 100644
index 0000000..ed901a3
--- /dev/null
+++ b/pkg/vm_service/test/get_isolate_rpc_test.dart
@@ -0,0 +1,60 @@
+// 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:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+var tests = <VMTest>[
+  (VmService service) async {
+    final vm = await service.getVM();
+    final result = await service.getIsolate(vm.isolates.first.id);
+    expect(result.id, startsWith('isolates/'));
+    expect(result.number, isNotNull);
+    expect(result.isolateFlags, isNotNull);
+    expect(result.isolateFlags.length, isPositive);
+    expect(result.isSystemIsolate, isFalse);
+    expect(result.json['_originNumber'], result.number);
+    expect(result.startTime, isPositive);
+    expect(result.livePorts, isPositive);
+    expect(result.pauseOnExit, isFalse);
+    expect(result.pauseEvent.type, 'Event');
+    expect(result.error, isNull);
+    expect(result.json['_numZoneHandles'], isPositive);
+    expect(result.json['_numScopedHandles'], isPositive);
+    expect(result.rootLib, isNotNull);
+    expect(result.libraries.length, isPositive);
+    expect(result.libraries[0], isNotNull);
+    expect(result.breakpoints.length, isZero);
+    expect(result.json['_heaps']['new']['type'], 'HeapSpace');
+    expect(result.json['_heaps']['old']['type'], 'HeapSpace');
+  },
+
+  (VmService service) async {
+    bool caughtException;
+    try {
+      await service.getIsolate('badid');
+      expect(false, isTrue, reason: 'Unreachable');
+    } on RPCError catch (e) {
+      caughtException = true;
+      expect(e.code, equals(RPCError.kInvalidParams));
+      expect(e.details, "getIsolate: invalid 'isolateId' parameter: badid");
+    }
+    expect(caughtException, isTrue);
+  },
+
+  // Plausible isolate id, not found.
+  (VmService service) async {
+    try {
+      await service.getIsolate('isolates/9999999999');
+      fail('successfully got isolate with bad ID');
+    } on SentinelException catch (e) {
+      expect(e.sentinel.kind, 'Collected');
+      expect(e.sentinel.valueAsString, '<collected>');
+    }
+  },
+];
+
+main(args) async => runVMTests(args, tests);
diff --git a/pkg/vm_service/test/server_test.dart b/pkg/vm_service/test/server_test.dart
index 37a9549..739af84 100644
--- a/pkg/vm_service/test/server_test.dart
+++ b/pkg/vm_service/test/server_test.dart
@@ -50,6 +50,7 @@
         startTime: 1,
         runnable: true,
         livePorts: 2,
+        isolateFlags: [],
         pauseOnExit: false,
         pauseEvent: Event(
           kind: EventKind.kResume,
@@ -78,6 +79,7 @@
         startTime: 1,
         runnable: true,
         livePorts: 2,
+        isolateFlags: [],
         pauseOnExit: false,
         pauseEvent: Event(
           kind: EventKind.kResume,
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 1fbe545..49fb41a 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -936,6 +936,13 @@
   return list;
 }
 
+List<vms.IsolateFlag> assertListOfIsolateFlag(List<vms.IsolateFlag> list) {
+  for (vms.IsolateFlag elem in list) {
+    assertIsolateFlag(elem);
+  }
+  return list;
+}
+
 String assertString(String obj) {
   assertNotNull(obj);
   if (obj.isEmpty) throw 'expected non-zero length string';
diff --git a/runtime/bin/builtin_impl_sources.gni b/runtime/bin/builtin_impl_sources.gni
index b8ea4eb..58323d0 100644
--- a/runtime/bin/builtin_impl_sources.gni
+++ b/runtime/bin/builtin_impl_sources.gni
@@ -45,6 +45,7 @@
   "file_macos.cc",
   "file_support.cc",
   "file_win.cc",
+  "file_win.h",
   "io_buffer.cc",
   "io_buffer.h",
   "isolate_data.cc",
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index ec96863..16b0984 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -13,6 +13,7 @@
 #include "bin/crypto.h"
 #include "bin/dartutils.h"
 #include "bin/file.h"
+#include "bin/file_win.h"
 #include "bin/namespace.h"
 #include "bin/utils.h"
 #include "bin/utils_win.h"
@@ -21,8 +22,6 @@
 
 #undef DeleteFile
 
-#define MAX_LONG_PATH 32767
-
 namespace dart {
 namespace bin {
 
@@ -278,7 +277,12 @@
 }
 
 static bool DeleteRecursively(PathBuffer* path) {
-  DWORD attributes = GetFileAttributesW(path->AsStringW());
+  PathBuffer prefixed_path;
+  if (!prefixed_path.Add(PrefixLongDirectoryPath(path->AsScopedString()))) {
+    return false;
+  }
+
+  DWORD attributes = GetFileAttributesW(prefixed_path.AsStringW());
   if (attributes == INVALID_FILE_ATTRIBUTES) {
     return false;
   }
@@ -286,33 +290,34 @@
   // filesystem that we do not want to recurse into.
   if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
     // Just delete the junction itself.
-    return RemoveDirectoryW(path->AsStringW()) != 0;
+    return RemoveDirectoryW(prefixed_path.AsStringW()) != 0;
   }
   // If it's a file, remove it directly.
   if ((attributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
-    return DeleteFile(L"", path);
+    return DeleteFile(L"", &prefixed_path);
   }
 
-  if (!path->AddW(L"\\*")) {
+  if (!prefixed_path.AddW(L"\\*")) {
     return false;
   }
 
   WIN32_FIND_DATAW find_file_data;
-  HANDLE find_handle = FindFirstFileW(path->AsStringW(), &find_file_data);
+  HANDLE find_handle =
+      FindFirstFileW(prefixed_path.AsStringW(), &find_file_data);
 
   if (find_handle == INVALID_HANDLE_VALUE) {
     return false;
   }
 
   // Adjust the path by removing the '*' used for the search.
-  int path_length = path->length() - 1;
-  path->Reset(path_length);
+  int path_length = prefixed_path.length() - 1;
+  prefixed_path.Reset(path_length);
 
   do {
-    if (!DeleteEntry(&find_file_data, path)) {
+    if (!DeleteEntry(&find_file_data, &prefixed_path)) {
       break;
     }
-    path->Reset(path_length);  // DeleteEntry adds to the path.
+    prefixed_path.Reset(path_length);  // DeleteEntry adds to the path.
   } while (FindNextFileW(find_handle, &find_file_data) != 0);
 
   DWORD last_error = GetLastError();
@@ -324,8 +329,9 @@
     return false;
   }
   // All content deleted succesfully, try to delete directory.
-  path->Reset(path_length - 1);  // Drop the "\" from the end of the path.
-  return RemoveDirectoryW(path->AsStringW()) != 0;
+  prefixed_path.Reset(path_length -
+                      1);  // Drop the "\" from the end of the path.
+  return RemoveDirectoryW(prefixed_path.AsStringW()) != 0;
 }
 
 static Directory::ExistsResult ExistsHelper(const wchar_t* dir_name) {
@@ -349,7 +355,8 @@
 
 Directory::ExistsResult Directory::Exists(Namespace* namespc,
                                           const char* dir_name) {
-  Utf8ToWideScope system_name(dir_name);
+  const char* prefixed_dir_name = PrefixLongDirectoryPath(dir_name);
+  Utf8ToWideScope system_name(prefixed_dir_name);
   return ExistsHelper(system_name.wide());
 }
 
@@ -369,7 +376,8 @@
 }
 
 bool Directory::Create(Namespace* namespc, const char* dir_name) {
-  Utf8ToWideScope system_name(dir_name);
+  const char* prefixed_dir_name = PrefixLongDirectoryPath(dir_name);
+  Utf8ToWideScope system_name(prefixed_dir_name);
   int create_status = CreateDirectoryW(system_name.wide(), NULL);
   // If the directory already existed, treat it as a success.
   if ((create_status == 0) && (GetLastError() == ERROR_ALREADY_EXISTS) &&
@@ -475,10 +483,11 @@
 bool Directory::Delete(Namespace* namespc,
                        const char* dir_name,
                        bool recursive) {
+  const char* prefixed_dir_name = PrefixLongDirectoryPath(dir_name);
   bool result = false;
-  Utf8ToWideScope system_dir_name(dir_name);
+  Utf8ToWideScope system_dir_name(prefixed_dir_name);
   if (!recursive) {
-    if (File::GetType(namespc, dir_name, true) == File::kIsDirectory) {
+    if (File::GetType(namespc, prefixed_dir_name, true) == File::kIsDirectory) {
       result = (RemoveDirectoryW(system_dir_name.wide()) != 0);
     } else {
       SetLastError(ERROR_FILE_NOT_FOUND);
@@ -495,18 +504,20 @@
 bool Directory::Rename(Namespace* namespc,
                        const char* path,
                        const char* new_path) {
-  Utf8ToWideScope system_path(path);
-  Utf8ToWideScope system_new_path(new_path);
+  const char* prefixed_dir = PrefixLongDirectoryPath(path);
+  Utf8ToWideScope system_path(prefixed_dir);
   ExistsResult exists = ExistsHelper(system_path.wide());
   if (exists != EXISTS) {
     return false;
   }
+  const char* prefixed_new_dir = PrefixLongDirectoryPath(new_path);
+  Utf8ToWideScope system_new_path(prefixed_new_dir);
   ExistsResult new_exists = ExistsHelper(system_new_path.wide());
   // MoveFile does not allow replacing existing directories. Therefore,
   // if the new_path is currently a directory we need to delete it
   // first.
   if (new_exists == EXISTS) {
-    bool success = Delete(namespc, new_path, true);
+    bool success = Delete(namespc, prefixed_new_dir, true);
     if (!success) {
       return false;
     }
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 21f8df2..46425dc 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -5,13 +5,15 @@
 #include "platform/globals.h"
 #if defined(HOST_OS_WINDOWS)
 
-#include "bin/file.h"
+#include <functional>
+#include <memory>
+#include <string>
 
+#include <Shlwapi.h>  // NOLINT
 #include <WinIoCtl.h>  // NOLINT
 #include <fcntl.h>     // NOLINT
 #include <io.h>        // NOLINT
-#include <Shlwapi.h>   // NOLINT
-#undef StrDup  // defined in Shlwapi.h as StrDupW
+#undef StrDup          // defined in Shlwapi.h as StrDupW
 #include <stdio.h>     // NOLINT
 #include <string.h>    // NOLINT
 #include <sys/stat.h>  // NOLINT
@@ -20,6 +22,8 @@
 #include "bin/builtin.h"
 #include "bin/crypto.h"
 #include "bin/directory.h"
+#include "bin/file.h"
+#include "bin/file_win.h"
 #include "bin/namespace.h"
 #include "bin/utils.h"
 #include "bin/utils_win.h"
@@ -298,8 +302,146 @@
   return new File(new FileHandle(fd));
 }
 
+class StringRAII {
+ public:
+  explicit StringRAII(const char* s) : s_(s), own_(false) {}
+  explicit StringRAII(char* s) : s_(s), own_(true) {}
+  ~StringRAII() {
+    if (own_) {
+      free(const_cast<char*>(s_));
+    }
+  }
+  const char* str() const { return s_; }
+  const char* release() {
+    own_ = false;
+    return s_;
+  }
+
+ private:
+  bool own_;
+  const char* s_;
+};
+
+class Wchart {
+ public:
+  explicit Wchart(int size) {
+    buf_ = reinterpret_cast<wchar_t*>(malloc(size * sizeof(wchar_t)));
+  }
+  ~Wchart() { free(buf_); }
+  wchar_t* buf() const { return buf_; }
+
+ private:
+  wchar_t* buf_;
+};
+
+static StringRAII ConvertToAbsolutePath(const char* path,
+                                        bool* p_has_converted_successfully) {
+  const int kPathLength = 16384;
+  Wchart buffer(kPathLength);  // use some reasonably large initial buffer
+  Utf8ToWideScope path_utf8_to_wide(path);
+  *p_has_converted_successfully = true;
+  int full_path_length =
+      GetFullPathNameW(path_utf8_to_wide.wide(), kPathLength, buffer.buf(),
+                       /*lpFilePart=*/nullptr);
+  if (full_path_length == 0) {
+    *p_has_converted_successfully = false;
+    // GetFullPathNameW failed
+    return StringRAII(path);
+  }
+  if (full_path_length < kPathLength) {
+    WideToUtf8Scope scope(buffer.buf());
+    return StringRAII(strdup(scope.utf8()));
+  }
+
+  // Try again with bigger buffer.
+  Wchart bigger_buffer(full_path_length);
+  if (GetFullPathNameW(path_utf8_to_wide.wide(), full_path_length,
+                       bigger_buffer.buf(),
+                       /*lpFilePart=*/nullptr) == 0) {
+    *p_has_converted_successfully = false;
+    // GetFullPathNameW failed
+    return StringRAII(path);
+  }
+  WideToUtf8Scope scope(bigger_buffer.buf());
+  return StringRAII(strdup(scope.utf8()));
+}
+
+static StringRAII PrefixLongPathIfExceedLimit(
+    const char* path,
+    bool is_file,
+    std::function<char*(int)> allocate) {
+  // File name and Directory name have different size limit.
+  // Reference: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation
+  const int path_short_limit = is_file ? MAX_PATH : MAX_DIRECTORY_PATH;
+
+  const char* kLongPathPrefix = "\\\\?\\";
+  const int kLongPathPrefixLength = 4;
+
+  // if absolute path is short or already prefixed, just return it.
+  if ((File::IsAbsolutePath(path) && strlen(path) < path_short_limit) ||
+      strncmp(path, kLongPathPrefix, kLongPathPrefixLength) == 0) {
+    return StringRAII(path);
+  }
+
+  // Long relative path have to be converted to absolute path before prefixing.
+  bool is_ok = true;
+  StringRAII absolute_path_raii = File::IsAbsolutePath(path)
+                                      ? StringRAII(path)
+                                      : ConvertToAbsolutePath(path, &is_ok);
+  if (!is_ok) {
+    return StringRAII(path);
+  }
+  const char* absolute_path = absolute_path_raii.str();
+  int length = strlen(absolute_path);
+  if (length < path_short_limit) {
+    // No need for a prefix if absolute path is short
+    return StringRAII(path);
+  }
+  if (strncmp(absolute_path, kLongPathPrefix, kLongPathPrefixLength) == 0) {
+    // Relative path converted to absolute could get a prefix.
+    return StringRAII(absolute_path);
+  }
+
+  // Add prefix and replace forward slashes with backward slashes.
+  char* result = allocate((kLongPathPrefixLength + length + 1) * sizeof(char));
+  strncpy(result, kLongPathPrefix, kLongPathPrefixLength);
+  for (int i = 0; i < length; i++) {
+    result[kLongPathPrefixLength + i] =
+        absolute_path[i] == '/' ? '\\' : absolute_path[i];
+  }
+  result[length + kLongPathPrefixLength] = '\0';
+  return StringRAII(result);
+}
+
+static const char* PrefixLongFilePath(const char* path) {
+  return PrefixLongPathIfExceedLimit(
+             path, /*is_file=*/true,
+             [](int size) {
+               return reinterpret_cast<char*>(Dart_ScopeAllocate(size));
+             })
+      .release();
+}
+
+static StringRAII PrefixLongFilePathNoScope(const char* path) {
+  return PrefixLongPathIfExceedLimit(path, /*is_file=*/true, [](int size) {
+    return reinterpret_cast<char*>(malloc(size));
+  });
+}
+
+const char* PrefixLongDirectoryPath(const char* path) {
+  return PrefixLongPathIfExceedLimit(
+             path, /*is_file=*/false,
+             [](int size) {
+               return reinterpret_cast<char*>(Dart_ScopeAllocate(size));
+             })
+      .release();
+}
+
 File* File::Open(Namespace* namespc, const char* path, FileOpenMode mode) {
-  Utf8ToWideScope system_name(path);
+  // File::Open can be called without scope(when launching isolate),
+  // so it mallocs prefixed path
+  StringRAII string_raii = PrefixLongFilePathNoScope(path);
+  Utf8ToWideScope system_name(string_raii.str());
   File* file = FileOpenW(system_name.wide(), mode);
   return file;
 }
@@ -364,8 +506,9 @@
 }
 
 bool File::Exists(Namespace* namespc, const char* name) {
+  StringRAII string_raii = PrefixLongFilePathNoScope(name);
+  Utf8ToWideScope system_name(string_raii.str());
   struct __stat64 st;
-  Utf8ToWideScope system_name(name);
   return StatHelper(system_name.wide(), &st);
 }
 
@@ -379,7 +522,7 @@
 }
 
 bool File::Create(Namespace* namespc, const char* name) {
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   int fd = _wopen(system_name.wide(), O_RDONLY | O_CREAT, 0666);
   if (fd < 0) {
     return false;
@@ -426,8 +569,8 @@
 bool File::CreateLink(Namespace* namespc,
                       const char* utf8_name,
                       const char* utf8_target) {
-  Utf8ToWideScope name(utf8_name);
-  Utf8ToWideScope target(utf8_target);
+  Utf8ToWideScope name(PrefixLongFilePath(utf8_name));
+  Utf8ToWideScope target(PrefixLongFilePath(utf8_target));
   DWORD flags = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE;
 
   File::Type type = File::GetType(namespc, utf8_target, true);
@@ -449,13 +592,13 @@
 }
 
 bool File::Delete(Namespace* namespc, const char* name) {
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   int status = _wremove(system_name.wide());
   return status != -1;
 }
 
 bool File::DeleteLink(Namespace* namespc, const char* name) {
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   bool result = false;
   DWORD attributes = GetFileAttributesW(system_name.wide());
   if ((attributes == INVALID_FILE_ATTRIBUTES) ||
@@ -477,13 +620,15 @@
 bool File::Rename(Namespace* namespc,
                   const char* old_path,
                   const char* new_path) {
-  File::Type type = GetType(namespc, old_path, false);
+  const char* prefixed_old_path = PrefixLongFilePath(old_path);
+  File::Type type = GetType(namespc, prefixed_old_path, false);
   if (type != kIsFile) {
     SetLastError(ERROR_FILE_NOT_FOUND);
     return false;
   }
-  Utf8ToWideScope system_old_path(old_path);
-  Utf8ToWideScope system_new_path(new_path);
+  const char* prefixed_new_path = PrefixLongFilePath(new_path);
+  Utf8ToWideScope system_old_path(prefixed_old_path);
+  Utf8ToWideScope system_new_path(prefixed_new_path);
   DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
   int move_status =
       MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags);
@@ -493,23 +638,25 @@
 bool File::RenameLink(Namespace* namespc,
                       const char* old_path,
                       const char* new_path) {
-  File::Type type = GetType(namespc, old_path, false);
+  const char* prefixed_old_path = PrefixLongFilePath(old_path);
+  File::Type type = GetType(namespc, prefixed_old_path, false);
   if (type != kIsLink) {
     SetLastError(ERROR_FILE_NOT_FOUND);
     return false;
   }
-  Utf8ToWideScope system_old_path(old_path);
-  Utf8ToWideScope system_new_path(new_path);
+  Utf8ToWideScope system_old_path(prefixed_old_path);
+  const char* prefixed_new_path = PrefixLongFilePath(new_path);
+  Utf8ToWideScope system_new_path(prefixed_new_path);
   DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
 
   // Junction links on Windows appear as special directories. MoveFileExW's
   // MOVEFILE_REPLACE_EXISTING does not allow for replacement of directories,
   // so we need to remove it before renaming a link. This step is only
   // necessary for junctions created by the old Link.create implementation.
-  if ((Directory::Exists(namespc, new_path) == Directory::EXISTS) &&
-      (GetType(namespc, new_path, false) == kIsLink)) {
+  if ((Directory::Exists(namespc, prefixed_new_path) == Directory::EXISTS) &&
+      (GetType(namespc, prefixed_new_path, false) == kIsLink)) {
     // Bail out if the DeleteLink call fails.
-    if (!DeleteLink(namespc, new_path)) {
+    if (!DeleteLink(namespc, prefixed_new_path)) {
       return false;
     }
   }
@@ -615,24 +762,26 @@
 bool File::Copy(Namespace* namespc,
                 const char* old_path,
                 const char* new_path) {
-  File::Type type = GetType(namespc, old_path, false);
+  const char* prefixed_old_path = PrefixLongFilePath(old_path);
+  const char* prefixed_new_path = PrefixLongFilePath(new_path);
+  File::Type type = GetType(namespc, prefixed_old_path, false);
   if (type != kIsFile) {
     SetLastError(ERROR_FILE_NOT_FOUND);
     return false;
   }
 
-  wchar_t* temp_file = CopyIntoTempFile(old_path, new_path);
+  wchar_t* temp_file = CopyIntoTempFile(prefixed_old_path, prefixed_new_path);
   if (temp_file == NULL) {
     // If temp file creation fails, fall back on doing a direct copy.
-    Utf8ToWideScope system_old_path(old_path);
-    Utf8ToWideScope system_new_path(new_path);
+    Utf8ToWideScope system_old_path(prefixed_old_path);
+    Utf8ToWideScope system_new_path(prefixed_new_path);
     return CopyFileExW(system_old_path.wide(), system_new_path.wide(), NULL,
                        NULL, NULL, 0) != 0;
   }
-  Utf8ToWideScope system_new_dest(new_path);
+  Utf8ToWideScope system_new_dest(prefixed_new_path);
 
   // Remove the existing file. Otherwise, renaming will fail.
-  if (Exists(namespc, new_path)) {
+  if (Exists(namespc, prefixed_new_path)) {
     DeleteFileW(system_new_dest.wide());
   }
 
@@ -647,7 +796,7 @@
 
 int64_t File::LengthFromPath(Namespace* namespc, const char* name) {
   struct __stat64 st;
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   if (!StatHelper(system_name.wide(), &st)) {
     return -1;
   }
@@ -658,7 +807,8 @@
                              const char* pathname,
                              char* dest,
                              int dest_size) {
-  const wchar_t* name = StringUtilsWin::Utf8ToWide(pathname);
+  const wchar_t* name =
+      StringUtilsWin::Utf8ToWide(PrefixLongFilePath(pathname));
   HANDLE dir_handle = CreateFileW(
       name, GENERIC_READ,
       FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
@@ -668,8 +818,10 @@
     return NULL;
   }
 
+  // Allocate a buffer for regular paths (smaller than MAX_PATH). If buffer is
+  // too small for a long path, allocate a bigger buffer and try again.
   int buffer_size =
-      sizeof(REPARSE_DATA_BUFFER) + 2 * (MAX_PATH + 1) * sizeof(WCHAR);
+      sizeof(REPARSE_DATA_BUFFER) + (MAX_PATH + 1) * sizeof(WCHAR);
   REPARSE_DATA_BUFFER* buffer =
       reinterpret_cast<REPARSE_DATA_BUFFER*>(Dart_ScopeAllocate(buffer_size));
   DWORD received_bytes;  // Value is not used.
@@ -677,9 +829,26 @@
                                buffer, buffer_size, &received_bytes, NULL);
   if (result == 0) {
     DWORD error = GetLastError();
-    CloseHandle(dir_handle);
-    SetLastError(error);
-    return NULL;
+    // If ERROR_MORE_DATA is thrown, the target path exceeds the size limit. A
+    // bigger buffer will be required.
+    if (error == ERROR_MORE_DATA) {
+      // Allocate a bigger buffer with MAX_LONG_PATH
+      buffer_size =
+          sizeof(REPARSE_DATA_BUFFER) + (MAX_LONG_PATH + 1) * sizeof(WCHAR);
+      buffer = reinterpret_cast<REPARSE_DATA_BUFFER*>(
+          Dart_ScopeAllocate(buffer_size));
+      result = DeviceIoControl(dir_handle, FSCTL_GET_REPARSE_POINT, NULL, 0,
+                               buffer, buffer_size, &received_bytes, NULL);
+      if (result == 0) {
+        // Overwrite the ERROR_MORE_DATA.
+        error = GetLastError();
+      }
+    }
+    if (result == 0) {
+      CloseHandle(dir_handle);
+      SetLastError(error);
+      return NULL;
+    }
   }
   if (CloseHandle(dir_handle) == 0) {
     return NULL;
@@ -726,11 +895,12 @@
 }
 
 void File::Stat(Namespace* namespc, const char* name, int64_t* data) {
-  File::Type type = GetType(namespc, name, false);
+  const char* prefixed_name = PrefixLongFilePath(name);
+  File::Type type = GetType(namespc, prefixed_name, false);
   data[kType] = type;
   if (type != kDoesNotExist) {
     struct _stat64 st;
-    Utf8ToWideScope system_name(name);
+    Utf8ToWideScope system_name(prefixed_name);
     int stat_status = _wstat64(system_name.wide(), &st);
     if (stat_status == 0) {
       data[kCreatedTime] = st.st_ctime * 1000;
@@ -746,7 +916,7 @@
 
 time_t File::LastAccessed(Namespace* namespc, const char* name) {
   struct __stat64 st;
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   if (!StatHelper(system_name.wide(), &st)) {
     return -1;
   }
@@ -755,7 +925,7 @@
 
 time_t File::LastModified(Namespace* namespc, const char* name) {
   struct __stat64 st;
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   if (!StatHelper(system_name.wide(), &st)) {
     return -1;
   }
@@ -767,7 +937,7 @@
                            int64_t millis) {
   // First get the current times.
   struct __stat64 st;
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   if (!StatHelper(system_name.wide(), &st)) {
     return false;
   }
@@ -784,7 +954,7 @@
                            int64_t millis) {
   // First get the current times.
   struct __stat64 st;
-  Utf8ToWideScope system_name(name);
+  Utf8ToWideScope system_name(PrefixLongFilePath(name));
   if (!StatHelper(system_name.wide(), &st)) {
     return false;
   }
@@ -801,7 +971,6 @@
 bool File::IsAbsolutePath(const char* pathname) {
   if (pathname == NULL) return false;
   char first = pathname[0];
-  if (pathname == 0) return false;
   char second = pathname[1];
   if (first == '\\' && second == '\\') return true;
   if (second != ':') return false;
@@ -814,7 +983,7 @@
                                    const char* pathname,
                                    char* dest,
                                    int dest_size) {
-  Utf8ToWideScope system_name(pathname);
+  Utf8ToWideScope system_name(PrefixLongFilePath(pathname));
   HANDLE file_handle =
       CreateFileW(system_name.wide(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                   FILE_FLAG_BACKUP_SEMANTICS, NULL);
@@ -838,9 +1007,8 @@
 
   // Remove leading \\?\ if possible, unless input used it.
   int offset = 0;
-  if ((result_size < MAX_PATH - 1 + 4) && (result_size > 4) &&
-      (wcsncmp(path.get(), L"\\\\?\\", 4) == 0) &&
-      (wcsncmp(system_name.wide(), L"\\\\?\\", 4) != 0)) {
+  if ((result_size > 4) && (wcsncmp(path.get(), L"\\\\?\\", 4) == 0) &&
+      (strncmp(pathname, "\\\\?\\", 4) != 0)) {
     offset = 4;
   }
   int utf8_size = WideCharToMultiByte(CP_UTF8, 0, path.get() + offset, -1,
@@ -878,8 +1046,13 @@
 File::Type File::GetType(Namespace* namespc,
                          const char* pathname,
                          bool follow_links) {
+  // File::GetType can be called without scope(when launching isolate),
+  // so it mallocs prefixed path.
+  StringRAII string_raii = PrefixLongFilePathNoScope(pathname);
+  const char* prefixed_path = string_raii.str();
+
   // Convert to wchar_t string.
-  Utf8ToWideScope name(pathname);
+  Utf8ToWideScope name(prefixed_path);
   DWORD attributes = GetFileAttributesW(name.wide());
   File::Type result = kIsFile;
   if (attributes == INVALID_FILE_ATTRIBUTES) {
@@ -919,7 +1092,8 @@
   USE(namespc_1);
   USE(namespc_2);
   BY_HANDLE_FILE_INFORMATION file_info[2];
-  const char* file_names[2] = {file_1, file_2};
+  const char* file_names[2] = {PrefixLongFilePath(file_1),
+                               PrefixLongFilePath(file_2)};
   for (int i = 0; i < 2; ++i) {
     Utf8ToWideScope wide_name(file_names[i]);
     HANDLE file_handle = CreateFileW(
diff --git a/runtime/bin/file_win.h b/runtime/bin/file_win.h
new file mode 100644
index 0000000..ef5f732
--- /dev/null
+++ b/runtime/bin/file_win.h
@@ -0,0 +1,22 @@
+// 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.
+
+#ifndef RUNTIME_BIN_FILE_WIN_H_
+#define RUNTIME_BIN_FILE_WIN_H_
+
+#include "bin/file.h"
+
+// The limit for a regular directory is 248.
+// Reference: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation
+#define MAX_DIRECTORY_PATH (MAX_PATH - 12)
+
+namespace dart {
+namespace bin {
+
+const char* PrefixLongDirectoryPath(const char* path);
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // RUNTIME_BIN_FILE_WIN_H_
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 6c36240..9730817 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -117,7 +117,9 @@
   V(SecureSocket_Destroy, 1)                                                   \
   V(SecureSocket_FilterPointer, 1)                                             \
   V(SecureSocket_GetSelectedProtocol, 1)                                       \
-  V(SecureSocket_Handshake, 1)                                                 \
+  V(SecureSocket_Handshake, 2)                                                 \
+  V(SecureSocket_MarkAsTrusted, 3)                                             \
+  V(SecureSocket_NewX509CertificateWrapper, 1)                                 \
   V(SecureSocket_Init, 1)                                                      \
   V(SecureSocket_PeerCertificate, 1)                                           \
   V(SecureSocket_RegisterBadCertificateCallback, 2)                            \
diff --git a/runtime/bin/namespace_win.cc b/runtime/bin/namespace_win.cc
index f31d37a1d..09a05f5 100644
--- a/runtime/bin/namespace_win.cc
+++ b/runtime/bin/namespace_win.cc
@@ -10,6 +10,8 @@
 #include <errno.h>
 #include <sys/stat.h>
 
+#include "bin/file.h"
+#include "bin/file_win.h"
 #include "bin/utils.h"
 #include "bin/utils_win.h"
 
@@ -46,6 +48,9 @@
 }
 
 bool Namespace::SetCurrent(Namespace* namespc, const char* path) {
+  // TODO(zichangguo): "\\?\" prepended long path doesn't work.
+  // https://github.com/dart-lang/sdk/issues/42416
+  path = PrefixLongDirectoryPath(path);
   Utf8ToWideScope system_path(path);
   bool result = SetCurrentDirectoryW(system_path.wide()) != 0;
   return result;
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 495eceb..f5495d8 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -625,7 +625,8 @@
     LOG_INFO("ProcessStarter: Start() Calling fdio_spawn_vmo\n");
     zx_handle_t process = ZX_HANDLE_INVALID;
     char err_msg[FDIO_SPAWN_ERR_MSG_MAX_LENGTH];
-    uint32_t flags = FDIO_SPAWN_CLONE_JOB | FDIO_SPAWN_DEFAULT_LDSVC;
+    uint32_t flags = FDIO_SPAWN_CLONE_JOB | FDIO_SPAWN_DEFAULT_LDSVC |
+                     FDIO_SPAWN_CLONE_UTC_CLOCK;
     status = fdio_spawn_vmo(ZX_HANDLE_INVALID, flags, vmo, program_arguments_,
                             program_environment_, actions_count, actions,
                             &process, err_msg);
diff --git a/runtime/bin/secure_socket_filter.cc b/runtime/bin/secure_socket_filter.cc
index 207971f..c7a89a5 100644
--- a/runtime/bin/secure_socket_filter.cc
+++ b/runtime/bin/secure_socket_filter.cc
@@ -32,6 +32,7 @@
 // To protect library initialization.
 Mutex* SSLFilter::mutex_ = nullptr;
 int SSLFilter::filter_ssl_index;
+int SSLFilter::ssl_cert_context_index;
 
 void SSLFilter::Init() {
   ASSERT(SSLFilter::mutex_ == nullptr);
@@ -143,7 +144,26 @@
 }
 
 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) {
-  GetFilter(args)->Handshake();
+  Dart_Handle port = ThrowIfError(Dart_GetNativeArgument(args, 1));
+  ASSERT(!Dart_IsNull(port));
+
+  Dart_Port port_id;
+  ThrowIfError(Dart_SendPortGetId(port, &port_id));
+  int result = GetFilter(args)->Handshake(port_id);
+  Dart_SetReturnValue(args, Dart_NewInteger(result));
+}
+
+void FUNCTION_NAME(SecureSocket_MarkAsTrusted)(Dart_NativeArguments args) {
+  GetFilter(args)->MarkAsTrusted(args);
+}
+
+void FUNCTION_NAME(SecureSocket_NewX509CertificateWrapper)(
+    Dart_NativeArguments args) {
+  intptr_t x509_pointer = DartUtils::GetNativeIntptrArgument(args, 0);
+  ASSERT(x509_pointer != 0);
+  X509* x509 = reinterpret_cast<X509*>(x509_pointer);
+  X509_up_ref(x509);
+  Dart_SetReturnValue(args, X509Helper::WrappedX509Certificate(x509));
 }
 
 void FUNCTION_NAME(SecureSocket_GetSelectedProtocol)(
@@ -447,6 +467,8 @@
     SSL_library_init();
     filter_ssl_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
     ASSERT(filter_ssl_index >= 0);
+    ssl_cert_context_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
+    ASSERT(ssl_cert_context_index >= 0);
     library_initialized_ = true;
   }
 }
@@ -477,7 +499,15 @@
   SSL_set_mode(ssl_, SSL_MODE_AUTO_RETRY);  // TODO(whesse): Is this right?
   SSL_set_ex_data(ssl_, filter_ssl_index, this);
   context->RegisterCallbacks(ssl_);
+  SSL_set_ex_data(ssl_, ssl_cert_context_index, context);
 
+  TrustEvaluateHandlerFunc trust_evaluate_handler =
+      context->GetTrustEvaluateHandler();
+  if (trust_evaluate_handler != nullptr) {
+    trust_evaluate_reply_port_ = Dart_NewNativePort(
+        "SSLCertContextTrustEvaluate", trust_evaluate_handler,
+        /*handle_concurrently=*/false);
+  }
   if (is_server_) {
     int certificate_mode =
         request_client_certificate ? SSL_VERIFY_PEER : SSL_VERIFY_NONE;
@@ -529,13 +559,37 @@
       }
     }
   }
-  Handshake();
+  // We don't expect certificate evaluation on first attempt,
+  // we expect requests for more bytes, therefore we could get away
+  // with passing illegal port.
+  Handshake(ILLEGAL_PORT);
 }
 
-void SSLFilter::Handshake() {
+void SSLFilter::MarkAsTrusted(Dart_NativeArguments args) {
+  intptr_t certificate_pointer = DartUtils::GetNativeIntptrArgument(args, 1);
+  ASSERT(certificate_pointer != 0);
+  certificate_trust_state_.reset(
+      new X509TrustState(reinterpret_cast<X509*>(certificate_pointer),
+                         DartUtils::GetNativeBooleanArgument(args, 2)));
+  if (SSL_LOG_STATUS) {
+    Syslog::Print("Mark %p as %strusted certificate\n",
+                  certificate_trust_state_.get()->x509(),
+                  certificate_trust_state_.get()->is_trusted() ? "" : "not ");
+  }
+}
+
+int SSLFilter::Handshake(Dart_Port reply_port) {
+  // Set reply port to be used by CertificateVerificationCallback
+  // invoked by SSL_do_handshake: this is where results of
+  // certificate evaluation will be communicated to.
+  reply_port_ = reply_port;
+
   // Try and push handshake along.
-  int status;
-  status = SSL_do_handshake(ssl_);
+  int status = SSL_do_handshake(ssl_);
+  int error = SSL_get_error(ssl_, status);
+  if (error == SSL_ERROR_WANT_CERTIFICATE_VERIFY) {
+    return SSL_ERROR_WANT_CERTIFICATE_VERIFY;
+  }
   if (callback_error != NULL) {
     // The SSL_do_handshake will try performing a handshake and might call
     // a CertificateCallback. If the certificate validation
@@ -545,7 +599,7 @@
   }
   if (SSL_want_write(ssl_) || SSL_want_read(ssl_)) {
     in_handshake_ = true;
-    return;
+    return error;
   }
   SecureSocketUtils::CheckStatusSSL(
       status, "HandshakeException",
@@ -572,6 +626,8 @@
         Dart_HandleFromPersistent(handshake_complete_), 0, NULL));
     in_handshake_ = false;
   }
+
+  return error;
 }
 
 void SSLFilter::GetSelectedProtocol(Dart_NativeArguments args) {
@@ -644,6 +700,10 @@
     Dart_DeletePersistentHandle(bad_certificate_callback_);
     bad_certificate_callback_ = NULL;
   }
+  if (trust_evaluate_reply_port_ != ILLEGAL_PORT) {
+    Dart_CloseNativePort(trust_evaluate_reply_port_);
+    trust_evaluate_reply_port_ = ILLEGAL_PORT;
+  }
   FreeResources();
 }
 
diff --git a/runtime/bin/secure_socket_filter.h b/runtime/bin/secure_socket_filter.h
index 70ad32e..826e28f 100644
--- a/runtime/bin/secure_socket_filter.h
+++ b/runtime/bin/secure_socket_filter.h
@@ -9,6 +9,8 @@
 #include <openssl/ssl.h>
 #include <openssl/x509.h>
 
+#include <memory>
+
 #include "bin/builtin.h"
 #include "bin/reference_counting.h"
 #include "bin/security_context.h"
@@ -21,6 +23,21 @@
 extern const unsigned char* root_certificates_pem;
 extern unsigned int root_certificates_pem_length;
 
+class X509TrustState {
+ public:
+  X509TrustState(const X509* x509, bool is_trusted)
+      : x509_(x509), is_trusted_(is_trusted) {}
+
+  const X509* x509() const { return x509_; }
+  bool is_trusted() const { return is_trusted_; }
+
+ private:
+  const X509* x509_;
+  bool is_trusted_;
+
+  DISALLOW_COPY_AND_ASSIGN(X509TrustState);
+};
+
 class SSLFilter : public ReferenceCounted<SSLFilter> {
  public:
   static void Init();
@@ -65,7 +82,8 @@
                Dart_Handle protocols_handle);
   void Destroy();
   void FreeResources();
-  void Handshake();
+  void MarkAsTrusted(Dart_NativeArguments args);
+  int Handshake(Dart_Port reply_port);
   void GetSelectedProtocol(Dart_NativeArguments args);
   void Renegotiate(bool use_session_cache,
                    bool request_client_certificate,
@@ -90,6 +108,17 @@
 
   // The index of the external data field in _ssl that points to the SSLFilter.
   static int filter_ssl_index;
+  // The index of the external data field in _ssl that points to the
+  // SSLCertContext.
+  static int ssl_cert_context_index;
+
+  const X509TrustState* certificate_trust_state() {
+    return certificate_trust_state_.get();
+  }
+  Dart_Port reply_port() const { return reply_port_; }
+  Dart_Port trust_evaluate_reply_port() const {
+    return trust_evaluate_reply_port_;
+  }
 
  private:
   static const intptr_t kInternalBIOSize;
@@ -98,6 +127,9 @@
 
   SSL* ssl_;
   BIO* socket_side_;
+  // Currently only one(root) certificate is evaluated via
+  // TrustEvaluate mechanism.
+  std::unique_ptr<X509TrustState> certificate_trust_state_;
 
   uint8_t* buffers_[kNumBuffers];
   int buffer_size_;
@@ -111,6 +143,9 @@
   bool is_server_;
   char* hostname_;
 
+  Dart_Port reply_port_ = ILLEGAL_PORT;
+  Dart_Port trust_evaluate_reply_port_ = ILLEGAL_PORT;
+
   static bool IsBufferEncrypted(int i) {
     return static_cast<BufferIndex>(i) >= kFirstEncrypted;
   }
diff --git a/runtime/bin/secure_socket_unsupported.cc b/runtime/bin/secure_socket_unsupported.cc
index 6a72909..8d2b2fc 100644
--- a/runtime/bin/secure_socket_unsupported.cc
+++ b/runtime/bin/secure_socket_unsupported.cc
@@ -36,6 +36,17 @@
       "Secure Sockets unsupported on this platform"));
 }
 
+void FUNCTION_NAME(SecureSocket_MarkAsTrusted)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Secure Sockets unsupported on this platform"));
+}
+
+void FUNCTION_NAME(SecureSocket_NewX509CertificateWrapper)(
+    Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Secure Sockets unsupported on this platform"));
+}
+
 void FUNCTION_NAME(SecureSocket_GetSelectedProtocol)(
     Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
diff --git a/runtime/bin/security_context.h b/runtime/bin/security_context.h
index 8c37365..206a859 100644
--- a/runtime/bin/security_context.h
+++ b/runtime/bin/security_context.h
@@ -18,6 +18,9 @@
 // Forward declaration
 class SSLFilter;
 
+typedef void (*TrustEvaluateHandlerFunc)(Dart_Port dest_port_id,
+                                         Dart_CObject* message);
+
 class SSLCertContext : public ReferenceCounted<SSLCertContext> {
  public:
   static const intptr_t kApproximateSize;
@@ -83,6 +86,7 @@
   void set_trust_builtin(bool trust_builtin) { trust_builtin_ = trust_builtin; }
 
   void RegisterCallbacks(SSL* ssl);
+  TrustEvaluateHandlerFunc GetTrustEvaluateHandler() const;
 
  private:
   void AddCompiledInCerts();
diff --git a/runtime/bin/security_context_android.cc b/runtime/bin/security_context_android.cc
index d474999..e0e9378 100644
--- a/runtime/bin/security_context_android.cc
+++ b/runtime/bin/security_context_android.cc
@@ -57,6 +57,10 @@
   // verification mechanism.
 }
 
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+  return nullptr;
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/security_context_fuchsia.cc b/runtime/bin/security_context_fuchsia.cc
index f66500e..e8f2f7a 100644
--- a/runtime/bin/security_context_fuchsia.cc
+++ b/runtime/bin/security_context_fuchsia.cc
@@ -50,6 +50,10 @@
   // verification mechanism.
 }
 
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+  return nullptr;
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/security_context_linux.cc b/runtime/bin/security_context_linux.cc
index 8ca9049..e4a9312 100644
--- a/runtime/bin/security_context_linux.cc
+++ b/runtime/bin/security_context_linux.cc
@@ -70,6 +70,10 @@
   // verification mechanism.
 }
 
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+  return nullptr;
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/security_context_macos.cc b/runtime/bin/security_context_macos.cc
index ea642aa..c130b6a 100644
--- a/runtime/bin/security_context_macos.cc
+++ b/runtime/bin/security_context_macos.cc
@@ -102,36 +102,110 @@
   return SecCertificateCreateWithData(NULL, cert_buf.get());
 }
 
-static int CertificateVerificationCallback(X509_STORE_CTX* ctx, void* arg) {
-  SSLCertContext* context = static_cast<SSLCertContext*>(arg);
+static ssl_verify_result_t CertificateVerificationCallback(SSL* ssl,
+                                                           uint8_t* out_alert) {
+  SSLFilter* filter = static_cast<SSLFilter*>(
+      SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index));
+
+  const X509TrustState* certificate_trust_state =
+      filter->certificate_trust_state();
+  if (certificate_trust_state != nullptr) {
+    // Callback have been previously called to explicitly evaluate root_cert.
+    STACK_OF(X509)* unverified = sk_X509_dup(SSL_get_peer_full_cert_chain(ssl));
+    X509* root_cert = nullptr;
+    for (uintptr_t i = sk_X509_num(unverified); i > 0; i--) {
+      root_cert = sk_X509_shift(unverified);
+      if (root_cert == nullptr) {
+        break;
+      }
+    }
+    if (certificate_trust_state->x509() == root_cert) {
+      return certificate_trust_state->is_trusted() ? ssl_verify_ok
+                                                   : ssl_verify_invalid;
+    }
+  }
+
+  Dart_CObject dart_cobject_ssl;
+  dart_cobject_ssl.type = Dart_CObject_kInt64;
+  dart_cobject_ssl.value.as_int64 = reinterpret_cast<intptr_t>(ssl);
+
+  Dart_CObject reply_send_port;
+  reply_send_port.type = Dart_CObject_kSendPort;
+  reply_send_port.value.as_send_port.id = filter->reply_port();
+
+  Dart_CObject array;
+  array.type = Dart_CObject_kArray;
+  array.value.as_array.length = 2;
+  Dart_CObject* values[] = {&dart_cobject_ssl, &reply_send_port};
+  array.value.as_array.values = values;
+
+  Dart_PostCObject(filter->trust_evaluate_reply_port(), &array);
+  return ssl_verify_retry;
+}
+
+static void postReply(Dart_Port reply_port_id,
+                      bool success,
+                      X509* certificate = nullptr) {
+  Dart_CObject dart_cobject_success;
+  dart_cobject_success.type = Dart_CObject_kBool;
+  dart_cobject_success.value.as_bool = success;
+
+  Dart_CObject dart_cobject_certificate;
+  dart_cobject_certificate.type = Dart_CObject_kInt64;
+  dart_cobject_certificate.value.as_int64 =
+      reinterpret_cast<intptr_t>(certificate);
+
+  Dart_CObject array;
+  array.type = Dart_CObject_kArray;
+  array.value.as_array.length = 2;
+  Dart_CObject* values[] = {&dart_cobject_success, &dart_cobject_certificate};
+  array.value.as_array.values = values;
+
+  Dart_PostCObject(reply_port_id, &array);
+}
+
+static void TrustEvaluateHandler(Dart_Port dest_port_id,
+                                 Dart_CObject* message) {
+  CObjectArray request(message);
+  ASSERT(request.Length() == 2);
+
+  CObjectIntptr ssl_cobject(request[0]);
+  SSL* ssl = reinterpret_cast<SSL*>(ssl_cobject.Value());
+  SSLFilter* filter = static_cast<SSLFilter*>(
+      SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index));
+  SSLCertContext* context = static_cast<SSLCertContext*>(
+      SSL_get_ex_data(ssl, SSLFilter::ssl_cert_context_index));
+  CObjectSendPort reply_port(request[1]);
+  Dart_Port reply_port_id = reply_port.Value();
+
+  STACK_OF(X509)* unverified = sk_X509_dup(SSL_get_peer_full_cert_chain(ssl));
 
   // Convert BoringSSL formatted certificates to SecCertificate certificates.
   ScopedCFMutableArrayRef cert_chain(NULL);
   X509* root_cert = NULL;
-  if (ctx->untrusted != NULL) {
-    STACK_OF(X509)* user_provided_certs = ctx->untrusted;
-    int num_certs = sk_X509_num(user_provided_certs);
-    int current_cert = 0;
-    cert_chain.set(CFArrayCreateMutable(NULL, num_certs, NULL));
-    X509* ca;
-    while ((ca = sk_X509_shift(user_provided_certs)) != NULL) {
-      ScopedSecCertificateRef cert(CreateSecCertificateFromX509(ca));
-      if (cert == NULL) {
-        return ctx->verify_cb(0, ctx);
-      }
-      CFArrayAppendValue(cert_chain.get(), cert.release());
-      ++current_cert;
+  int num_certs = sk_X509_num(unverified);
+  int current_cert = 0;
+  cert_chain.set(CFArrayCreateMutable(NULL, num_certs, NULL));
+  X509* ca;
+  while ((ca = sk_X509_shift(unverified)) != NULL) {
+    ScopedSecCertificateRef cert(CreateSecCertificateFromX509(ca));
+    if (cert == NULL) {
+      postReply(reply_port_id, /*success=*/false);
+      return;
+    }
+    CFArrayAppendValue(cert_chain.get(), cert.release());
+    ++current_cert;
 
-      if (current_cert == num_certs) {
-        root_cert = ca;
-      }
+    if (current_cert == num_certs) {
+      root_cert = ca;
     }
   }
 
+  SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(ssl);
+  X509_STORE* store = SSL_CTX_get_cert_store(ssl_ctx);
   // Convert all trusted certificates provided by the user via
   // setTrustedCertificatesBytes or the command line into SecCertificates.
   ScopedCFMutableArrayRef trusted_certs(CFArrayCreateMutable(NULL, 0, NULL));
-  X509_STORE* store = ctx->ctx;
   ASSERT(store != NULL);
 
   if (store->objs != NULL) {
@@ -139,17 +213,14 @@
       X509* ca = sk_X509_OBJECT_value(store->objs, i)->data.x509;
       ScopedSecCertificateRef cert(CreateSecCertificateFromX509(ca));
       if (cert == NULL) {
-        return ctx->verify_cb(0, ctx);
+        postReply(reply_port_id, /*success=*/false);
+        return;
       }
       CFArrayAppendValue(trusted_certs.get(), cert.release());
     }
   }
 
   // Generate a policy for validating chains for SSL.
-  const int ssl_index = SSL_get_ex_data_X509_STORE_CTX_idx();
-  SSL* ssl = static_cast<SSL*>(X509_STORE_CTX_get_ex_data(ctx, ssl_index));
-  SSLFilter* filter = static_cast<SSLFilter*>(
-      SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index));
   CFStringRef cfhostname = NULL;
   if (filter->hostname() != NULL) {
     cfhostname = CFStringCreateWithCString(NULL, filter->hostname(),
@@ -164,7 +235,8 @@
   OSStatus status = SecTrustCreateWithCertificates(cert_chain.get(),
                                                    policy.get(), trust.ptr());
   if (status != noErr) {
-    return ctx->verify_cb(0, ctx);
+    postReply(reply_port_id, /*success=*/false);
+    return;
   }
 
   // If the user provided any additional CA certificates, add them to the trust
@@ -172,7 +244,8 @@
   if (CFArrayGetCount(trusted_certs.get()) > 0) {
     status = SecTrustSetAnchorCertificates(trust.get(), trusted_certs.get());
     if (status != noErr) {
-      return ctx->verify_cb(0, ctx);
+      postReply(reply_port_id, /*success=*/false);
+      return;
     }
   }
 
@@ -181,7 +254,8 @@
   status =
       SecTrustSetAnchorCertificatesOnly(trust.get(), !context->trust_builtin());
   if (status != noErr) {
-    return ctx->verify_cb(0, ctx);
+    postReply(reply_port_id, /*success=*/false);
+    return;
   }
 
   SecTrustResultType trust_result;
@@ -199,29 +273,23 @@
   USE(res);
   status = SecTrustGetTrustResult(trust.get(), &trust_result);
 #else
+
   // SecTrustEvaluate is deprecated as of OSX 10.15 and iOS 13.
   status = SecTrustEvaluate(trust.get(), &trust_result);
 #endif
 
-  if (status != noErr) {
-    return ctx->verify_cb(0, ctx);
-  }
-
-  if ((trust_result == kSecTrustResultProceed) ||
-      (trust_result == kSecTrustResultUnspecified)) {
-    // Successfully verified certificate!
-    return ctx->verify_cb(1, ctx);
-  }
-
-  // Set current_cert to the root of the certificate chain. This will be passed
-  // to the callback provided by the user for additional verification steps.
-  ctx->current_cert = root_cert;
-  return ctx->verify_cb(0, ctx);
+  postReply(reply_port_id,
+            status == noErr && (trust_result == kSecTrustResultProceed ||
+                                trust_result == kSecTrustResultUnspecified),
+            root_cert);
 }
 
 void SSLCertContext::RegisterCallbacks(SSL* ssl) {
-  SSL_CTX* ctx = SSL_get_SSL_CTX(ssl);
-  SSL_CTX_set_cert_verify_callback(ctx, CertificateVerificationCallback, this);
+  SSL_set_custom_verify(ssl, SSL_VERIFY_PEER, CertificateVerificationCallback);
+}
+
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+  return &TrustEvaluateHandler;
 }
 
 void SSLCertContext::TrustBuiltinRoots() {
diff --git a/runtime/bin/security_context_win.cc b/runtime/bin/security_context_win.cc
index 95673ca..1b49292 100644
--- a/runtime/bin/security_context_win.cc
+++ b/runtime/bin/security_context_win.cc
@@ -134,6 +134,10 @@
   // verification mechanism.
 }
 
+TrustEvaluateHandlerFunc SSLCertContext::GetTrustEvaluateHandler() const {
+  return nullptr;
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/utils_win.h b/runtime/bin/utils_win.h
index fdb4909..0e4fae9 100644
--- a/runtime/bin/utils_win.h
+++ b/runtime/bin/utils_win.h
@@ -9,6 +9,8 @@
 
 #include "platform/utils.h"
 
+#define MAX_LONG_PATH 32767
+
 namespace dart {
 namespace bin {
 
diff --git a/runtime/observatory/tests/service/get_isolate_rpc_test.dart b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
index adffeb7..4e79317 100644
--- a/runtime/observatory/tests/service/get_isolate_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
@@ -16,6 +16,8 @@
     expect(result['type'], equals('Isolate'));
     expect(result['id'], startsWith('isolates/'));
     expect(result['number'], isA<String>());
+    expect(result['isolateFlags'], isA<List>());
+    expect(result['isolateFlags'].length, isPositive);
     expect(result['isSystemIsolate'], isFalse);
     expect(result['_originNumber'], equals(result['number']));
     expect(result['startTime'], isPositive);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 8e949ec..8b56393 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(39));
+    expect(result['minor'], equals(40));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/tests/vm/dart/regress_43464_test.dart b/runtime/tests/vm/dart/regress_43464_test.dart
new file mode 100644
index 0000000..43a3c113
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_43464_test.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.
+
+import 'package:expect/expect.dart';
+
+class A {}
+
+abstract class B<T> {
+  dynamic foo(T a);
+}
+
+class C extends B<A> {
+  dynamic foo(A a) {
+    return () => a;
+  }
+}
+
+main() {
+  Expect.throws(() => (C().foo as dynamic)(1));
+}
diff --git a/runtime/tests/vm/dart/thread_priority_macos_test.dart b/runtime/tests/vm/dart/thread_priority_macos_test.dart
index b466eb0..b7c8280 100644
--- a/runtime/tests/vm/dart/thread_priority_macos_test.dart
+++ b/runtime/tests/vm/dart/thread_priority_macos_test.dart
@@ -29,7 +29,7 @@
 //  struct sched_param { int sched_priority; }
 class SchedParam extends Struct {
   @Int32()
-  int schedPriority;
+  external int schedPriority;
 }
 
 main(args) {
diff --git a/runtime/tests/vm/dart_2/regress_43464_test.dart b/runtime/tests/vm/dart_2/regress_43464_test.dart
new file mode 100644
index 0000000..43a3c113
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress_43464_test.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.
+
+import 'package:expect/expect.dart';
+
+class A {}
+
+abstract class B<T> {
+  dynamic foo(T a);
+}
+
+class C extends B<A> {
+  dynamic foo(A a) {
+    return () => a;
+  }
+}
+
+main() {
+  Expect.throws(() => (C().foo as dynamic)(1));
+}
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 6c35a83..3877f45 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1405,6 +1405,12 @@
 }
 
 CompileType LoadLocalInstr::ComputeType() const {
+  if (local().needs_covariant_check_in_method()) {
+    // We may not yet have checked the actual type of the parameter value.
+    // Assuming that the value has the required type can lead to unsound
+    // optimizations. See dartbug.com/43464.
+    return CompileType::FromCid(kDynamicCid);
+  }
   const AbstractType& local_type = local().type();
   TraceStrongModeType(this, local_type);
   return CompileType::FromAbstractType(local_type);
diff --git a/runtime/vm/compiler/backend/typed_data_aot_test.cc b/runtime/vm/compiler/backend/typed_data_aot_test.cc
index d978e86..30d58db 100644
--- a/runtime/vm/compiler/backend/typed_data_aot_test.cc
+++ b/runtime/vm/compiler/backend/typed_data_aot_test.cc
@@ -451,6 +451,61 @@
   }
 }
 
+ISOLATE_UNIT_TEST_CASE(IRTest_TypedDataAOT_Regress43534) {
+  const char* kScript =
+      R"(
+      import 'dart:typed_data';
+
+      @pragma('vm:never-inline')
+      void callWith<T>(void Function(T arg) fun, T arg) {
+        fun(arg);
+      }
+
+      void test() {
+        callWith<Uint8List>((Uint8List list) {
+          if (list[0] != 0) throw 'a';
+        }, Uint8List(10));
+      }
+      )";
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  Invoke(root_library, "test");
+  const auto& test_function =
+      Function::Handle(GetFunction(root_library, "test"));
+  const auto& closures = GrowableObjectArray::Handle(
+      Isolate::Current()->object_store()->closure_functions());
+  auto& function = Function::Handle();
+  for (intptr_t i = closures.Length() - 1; 0 <= i; ++i) {
+    function ^= closures.At(i);
+    if (function.parent_function() == test_function.raw()) {
+      break;
+    }
+    function = Function::null();
+  }
+  RELEASE_ASSERT(!function.IsNull());
+  TestPipeline pipeline(function, CompilerPass::kAOT);
+  FlowGraph* flow_graph = pipeline.RunPasses({});
+
+  auto entry = flow_graph->graph_entry()->normal_entry();
+  EXPECT(entry != nullptr);
+  ILMatcher cursor(flow_graph, entry, /*trace=*/true);
+  RELEASE_ASSERT(cursor.TryMatch(
+      {
+          kMatchAndMoveGoto,
+          kMatchAndMoveBranchFalse,
+          kMatchAndMoveAssertAssignable,
+          kMatchAndMoveGoto,
+          kMatchAndMoveLoadField,
+          kMatchAndMoveGenericCheckBound,
+          kMatchAndMoveLoadUntagged,
+          kMatchAndMoveLoadIndexed,
+          kMatchAndMoveBranchFalse,
+          kMoveGlob,
+          kMatchReturn,
+      },
+      kMoveGlob));
+}
+
 #endif  // defined(DART_PRECOMPILER)
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 2c7f4dc..d1ad68b 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -1571,16 +1571,17 @@
 
     const intptr_t receiver_index = call->FirstArgIndex();
 
-    CompileType* receiver_type = call->ArgumentAt(receiver_index + 0)->Type();
+    CompileType* receiver_type =
+        call->ArgumentValueAt(receiver_index + 0)->Type();
 
     CompileType* index_type = nullptr;
     if (is_index_get || is_index_set) {
-      index_type = call->ArgumentAt(receiver_index + 1)->Type();
+      index_type = call->ArgumentValueAt(receiver_index + 1)->Type();
     }
 
     CompileType* value_type = nullptr;
     if (is_index_set) {
-      value_type = call->ArgumentAt(receiver_index + 2)->Type();
+      value_type = call->ArgumentValueAt(receiver_index + 2)->Type();
     }
 
     auto& type_class = Class::Handle(zone_);
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index f1c672a..0efb336 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -188,6 +188,7 @@
   "backend/yield_position_test.cc",
   "cha_test.cc",
   "frontend/kernel_binary_flowgraph_test.cc",
+  "frontend/multiple_entrypoints_test.cc",
   "write_barrier_elimination_test.cc",
 ]
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5944069..87a3298 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1822,8 +1822,10 @@
     Fragment* checks = is_covariant ? explicit_checks : implicit_checks;
 
     *checks += LoadLocal(param);
-    *checks += CheckAssignable(*target_type, name,
-                               AssertAssignableInstr::kParameterCheck);
+    *checks += AssertAssignableLoadTypeArguments(
+        TokenPosition::kNoSource, *target_type, name,
+        AssertAssignableInstr::kParameterCheck);
+    *checks += StoreLocal(param);
     *checks += Drop();
 
     if (!is_covariant && implicit_redefinitions != nullptr && optimizing_) {
diff --git a/runtime/vm/compiler/frontend/multiple_entrypoints_test.cc b/runtime/vm/compiler/frontend/multiple_entrypoints_test.cc
new file mode 100644
index 0000000..9ae1679
--- /dev/null
+++ b/runtime/vm/compiler/frontend/multiple_entrypoints_test.cc
@@ -0,0 +1,106 @@
+// 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.
+
+#include "vm/compiler/backend/il_test_helper.h"
+#include "vm/compiler/compiler_pass.h"
+#include "vm/object.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+#if defined(DART_PRECOMPILER)
+
+ISOLATE_UNIT_TEST_CASE(IRTest_MultilpeEntryPoints_Regress43534) {
+  const char* kScript =
+      R"(
+      import 'dart:typed_data';
+
+      @pragma('vm:never-inline')
+      void callWith<T>(void Function(T arg) fun, T arg) {
+        fun(arg);
+      }
+
+      @pragma('vm:never-inline')
+      void use(dynamic arg) {}
+
+      void test() {
+        callWith<Uint8List>((Uint8List list) {
+          use(list);
+        }, Uint8List(10));
+      }
+      )";
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  Invoke(root_library, "test");
+  const auto& test_function =
+      Function::Handle(GetFunction(root_library, "test"));
+  const auto& closures = GrowableObjectArray::Handle(
+      Isolate::Current()->object_store()->closure_functions());
+  auto& function = Function::Handle();
+  for (intptr_t i = closures.Length() - 1; 0 <= i; ++i) {
+    function ^= closures.At(i);
+    if (function.parent_function() == test_function.raw()) {
+      break;
+    }
+    function = Function::null();
+  }
+  RELEASE_ASSERT(!function.IsNull());
+  TestPipeline pipeline(function, CompilerPass::kAOT);
+  FlowGraph* flow_graph = pipeline.RunPasses({CompilerPass::kComputeSSA});
+
+  auto entry = flow_graph->graph_entry()->normal_entry();
+  EXPECT(entry != nullptr);
+
+  auto unchecked_entry = flow_graph->graph_entry()->unchecked_entry();
+  EXPECT(unchecked_entry != nullptr);
+
+  AssertAssignableInstr* assert_assignable = nullptr;
+  StaticCallInstr* static_call = nullptr;
+
+  // Normal entry
+  ILMatcher cursor(flow_graph, entry, /*trace=*/true);
+  RELEASE_ASSERT(cursor.TryMatch(
+      {
+          kMatchAndMoveGoto,
+          kMatchAndMoveBranchFalse,
+          {kMatchAndMoveAssertAssignable, &assert_assignable},
+          kMatchAndMoveGoto,
+          {kMatchAndMoveStaticCall, &static_call},
+          kMatchReturn,
+      },
+      kMoveGlob));
+
+  RedefinitionInstr* redefinition = nullptr;
+  StaticCallInstr* static_call2 = nullptr;
+
+  // Unchecked entry
+  ILMatcher cursor2(flow_graph, entry, /*trace=*/true);
+  RELEASE_ASSERT(cursor2.TryMatch(
+      {
+          kMatchAndMoveGoto,
+          kMatchAndMoveBranchTrue,
+          {kMatchAndMoveRedefinition, &redefinition},
+          kMatchAndMoveGoto,
+          {kMatchAndMoveStaticCall, &static_call2},
+          kMatchReturn,
+      },
+      kMoveGlob));
+
+  // Ensure the value the static call uses is a Phi node with 2 inputs:
+  //   a) Normal entry: AssertAssignable
+  //   b) Unchecked entry: Redefinition
+  RELEASE_ASSERT(static_call->ArgumentAt(0)->IsPhi());
+  auto phi = static_call->ArgumentAt(0)->AsPhi();
+  auto input_a = phi->InputAt(0)->definition();
+  auto input_b = phi->InputAt(1)->definition();
+  RELEASE_ASSERT(input_a->IsRedefinition());
+  RELEASE_ASSERT(input_b->IsAssertAssignable());
+  RELEASE_ASSERT(input_a == redefinition);
+  RELEASE_ASSERT(input_b == assert_assignable);
+  RELEASE_ASSERT(static_call == static_call2);
+}
+
+#endif  // defined(DART_PRECOMPILER)
+
+}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index e736c7a..b859d99 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -1601,6 +1601,9 @@
       helper.IsCovariant() ||
       (helper.IsGenericCovariantImpl() &&
        (attrs.has_non_this_uses || attrs.has_tearoff_uses));
+  if (needs_covariant_check_in_method) {
+    variable->set_needs_covariant_check_in_method();
+  }
 
   switch (type_check_mode) {
     case kTypeCheckAllParameters:
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index e9f8516a..7044628 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, 0x6c0c3295)                                      \
+  V(Future, wait, FutureWait, 0x9a812df7)                                      \
 
 // List of intrinsics:
 // (class-name, function-name, intrinsification method, fingerprint).
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 142c890..9cba5d4 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -252,7 +252,7 @@
   void ExecuteCatchEntryMoves(const CatchEntryMoves& moves) {
     Zone* zone = Thread::Current()->zone();
     auto& value = Object::Handle(zone);
-    auto& dst_values = Array::Handle(zone, Array::New(moves.count()));
+    GrowableArray<Object*> dst_values;
 
     uword fp = handler_fp;
     ObjectPool* pool = nullptr;
@@ -309,7 +309,7 @@
           UNREACHABLE();
       }
 
-      dst_values.SetAt(j, value);
+      dst_values.Add(&Object::Handle(zone, value.raw()));
     }
 
     {
@@ -317,8 +317,7 @@
 
       for (int j = 0; j < moves.count(); j++) {
         const CatchEntryMove& move = moves.At(j);
-        value = dst_values.At(j);
-        *TaggedSlotAt(fp, move.dest_slot()) = value.raw();
+        *TaggedSlotAt(fp, move.dest_slot()) = dst_values[j]->raw();
       }
     }
   }
@@ -879,7 +878,10 @@
     // the isolate etc.). This can happen in the compiler, which is not
     // allowed to allocate in new space, so we pass the kOld argument.
     const UnhandledException& unhandled_exception = UnhandledException::Handle(
-        zone, UnhandledException::New(exception, stacktrace, Heap::kOld));
+        zone, exception.raw() == isolate->object_store()->out_of_memory()
+                  ? isolate->isolate_object_store()
+                        ->preallocated_unhandled_exception()
+                  : UnhandledException::New(exception, stacktrace, Heap::kOld));
     stacktrace = StackTrace::null();
     JumpToExceptionHandler(thread, handler_pc, handler_sp, handler_fp,
                            unhandled_exception, stacktrace);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index f94e466..8f475f6 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1511,29 +1511,24 @@
   api_flags->version = DART_FLAGS_CURRENT_VERSION;
 #define INIT_FROM_FLAG(when, name, bitname, isolate_flag, flag)                \
   api_flags->isolate_flag = flag;
-  ISOLATE_FLAG_LIST(INIT_FROM_FLAG)
+  BOOL_ISOLATE_FLAG_LIST(INIT_FROM_FLAG)
 #undef INIT_FROM_FLAG
   api_flags->entry_points = NULL;
-  api_flags->load_vmservice_library = false;
   api_flags->copy_parent_code = false;
-  api_flags->null_safety = false;
-  api_flags->is_system_isolate = false;
 }
 
 void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const {
   api_flags->version = DART_FLAGS_CURRENT_VERSION;
 #define INIT_FROM_FIELD(when, name, bitname, isolate_flag, flag)               \
   api_flags->isolate_flag = name();
-  ISOLATE_FLAG_LIST(INIT_FROM_FIELD)
+  BOOL_ISOLATE_FLAG_LIST(INIT_FROM_FIELD)
 #undef INIT_FROM_FIELD
   api_flags->entry_points = NULL;
-  api_flags->load_vmservice_library = should_load_vmservice();
   api_flags->copy_parent_code = false;
-  api_flags->null_safety = null_safety();
-  api_flags->is_system_isolate = is_system_isolate();
 }
 
 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) {
+  const bool copy_parent_code_ = copy_parent_code();
 #if defined(DART_PRECOMPILER)
 #define FLAG_FOR_PRECOMPILER(action) action
 #else
@@ -1552,16 +1547,16 @@
   FLAG_FOR_##when(isolate_flags_ = bitname##Bit::update(                       \
                       api_flags.isolate_flag, isolate_flags_));
 
-  ISOLATE_FLAG_LIST(SET_FROM_FLAG)
-
+  BOOL_ISOLATE_FLAG_LIST(SET_FROM_FLAG)
+  isolate_flags_ = CopyParentCodeBit::update(copy_parent_code_, isolate_flags_);
+  // Needs to be called manually, otherwise we don't set the null_safety_set
+  // bit.
+  set_null_safety(api_flags.null_safety);
 #undef FLAG_FOR_NONPRODUCT
 #undef FLAG_FOR_PRECOMPILER
 #undef FLAG_FOR_PRODUCT
 #undef SET_FROM_FLAG
 
-  set_should_load_vmservice(api_flags.load_vmservice_library);
-  set_null_safety(api_flags.null_safety);
-  set_is_system_isolate(api_flags.is_system_isolate);
   // Copy entry points list.
   ASSERT(embedder_entry_points_ == NULL);
   if (api_flags.entry_points != NULL) {
@@ -3088,6 +3083,25 @@
     heap()->PrintToJSONObject(Heap::kOld, &jsheap);
   }
 
+  {
+// Stringification macros
+// See https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html
+#define TO_STRING(s) STR(s)
+#define STR(s) #s
+
+#define ADD_ISOLATE_FLAGS(when, name, bitname, isolate_flag_name, flag_name)   \
+  {                                                                            \
+    JSONObject jsflag(&jsflags);                                               \
+    jsflag.AddProperty("name", TO_STRING(name));                               \
+    jsflag.AddProperty("valueAsString", name() ? "true" : "false");            \
+  }
+    JSONArray jsflags(&jsobj, "isolateFlags");
+    BOOL_ISOLATE_FLAG_LIST(ADD_ISOLATE_FLAGS)
+#undef ADD_ISOLATE_FLAGS
+#undef TO_STRING
+#undef STR
+  }
+
   jsobj.AddProperty("runnable", is_runnable());
   jsobj.AddProperty("livePorts", message_handler()->live_ports());
   jsobj.AddProperty("pauseOnExit", message_handler()->should_pause_on_exit());
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index f59147d..66ff4ec 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -177,15 +177,33 @@
 
 // List of Isolate flags with corresponding members of Dart_IsolateFlags and
 // corresponding global command line flags.
+#define BOOL_ISOLATE_FLAG_LIST(V)                                              \
+  BOOL_ISOLATE_FLAG_LIST_DEFAULT_GETTER(V)                                     \
+  BOOL_ISOLATE_FLAG_LIST_CUSTOM_GETTER(V)
+
+// List of Isolate flags with default getters.
 //
-//       V(when, name, bit-name, Dart_IsolateFlags-name, command-line-flag-name)
+//     V(when, name, bit-name, Dart_IsolateFlags-name, command-line-flag-name)
 //
-#define ISOLATE_FLAG_LIST(V)                                                   \
+#define BOOL_ISOLATE_FLAG_LIST_DEFAULT_GETTER(V)                               \
   V(NONPRODUCT, asserts, EnableAsserts, enable_asserts, FLAG_enable_asserts)   \
   V(NONPRODUCT, use_field_guards, UseFieldGuards, use_field_guards,            \
     FLAG_use_field_guards)                                                     \
   V(NONPRODUCT, use_osr, UseOsr, use_osr, FLAG_use_osr)                        \
-  V(PRECOMPILER, obfuscate, Obfuscate, obfuscate, false_by_default)
+  V(PRECOMPILER, obfuscate, Obfuscate, obfuscate, false_by_default)            \
+  V(PRODUCT, should_load_vmservice_library, ShouldLoadVmService,               \
+    load_vmservice_library, false_by_default)                                  \
+  V(PRODUCT, copy_parent_code, CopyParentCode, copy_parent_code,               \
+    false_by_default)                                                          \
+  V(PRODUCT, is_system_isolate, IsSystemIsolate, is_system_isolate,            \
+    false_by_default)
+
+// List of Isolate flags with custom getters named #name().
+//
+//     V(when, name, bit-name, Dart_IsolateFlags-name, default_value)
+//
+#define BOOL_ISOLATE_FLAG_LIST_CUSTOM_GETTER(V)                                \
+  V(PRODUCT, null_safety, NullSafety, null_safety, false_by_default)
 
 // Represents the information used for spawning the first isolate within an
 // isolate group.
@@ -1275,7 +1293,7 @@
     USE(false_by_default);                                                     \
     return FLAG_FOR_##when(bitname##Bit::decode(isolate_flags_), flag_name);   \
   }
-  ISOLATE_FLAG_LIST(DECLARE_GETTER)
+  BOOL_ISOLATE_FLAG_LIST_DEFAULT_GETTER(DECLARE_GETTER)
 #undef FLAG_FOR_NONPRODUCT
 #undef FLAG_FOR_PRECOMPILER
 #undef FLAG_FOR_PRODUCT
@@ -1297,6 +1315,7 @@
     ASSERT(!null_safety_not_set());
     return NullSafetyBit::decode(isolate_flags_);
   }
+
   void set_null_safety(bool null_safety) {
     isolate_flags_ = NullSafetySetBit::update(true, isolate_flags_);
     isolate_flags_ = NullSafetyBit::update(null_safety, isolate_flags_);
@@ -1404,7 +1423,6 @@
   void set_is_system_isolate(bool is_system_isolate) {
     is_system_isolate_ = is_system_isolate;
   }
-  bool is_system_isolate() const { return is_system_isolate_; }
 
 #if !defined(PRODUCT)
   GrowableObjectArrayPtr GetAndClearPendingServiceExtensionCalls();
@@ -1478,9 +1496,11 @@
   V(UseFieldGuards)                                                            \
   V(UseOsr)                                                                    \
   V(Obfuscate)                                                                 \
+  V(CopyParentCode)                                                            \
   V(ShouldLoadVmService)                                                       \
   V(NullSafety)                                                                \
-  V(NullSafetySet)
+  V(NullSafetySet)                                                             \
+  V(IsSystemIsolate)
 
   // Isolate specific flags.
   enum FlagBits {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 9f873d9..9902dc6 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -211,6 +211,9 @@
       if (variable->is_explicit_covariant_parameter()) {
         raw_parameter->set_is_explicit_covariant_parameter();
       }
+      if (variable->needs_covariant_check_in_method()) {
+        raw_parameter->set_needs_covariant_check_in_method();
+      }
       raw_parameter->set_type_check_mode(variable->type_check_mode());
       if (function().HasOptionalParameters()) {
         bool ok = scope->AddVariable(raw_parameter);
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index a9761d7..b003324 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -91,7 +91,7 @@
         is_invisible_(false),
         is_captured_parameter_(false),
         is_forced_stack_(false),
-        is_explicit_covariant_parameter_(false),
+        covariance_mode_(kNotCovariant),
         is_late_(false),
         is_chained_future_(false),
         expected_context_index_(-1),
@@ -147,10 +147,17 @@
   }
 
   bool is_explicit_covariant_parameter() const {
-    return is_explicit_covariant_parameter_;
+    return covariance_mode_ == kExplicit;
   }
-  void set_is_explicit_covariant_parameter() {
-    is_explicit_covariant_parameter_ = true;
+  void set_is_explicit_covariant_parameter() { covariance_mode_ = kExplicit; }
+
+  bool needs_covariant_check_in_method() const {
+    return covariance_mode_ != kNotCovariant;
+  }
+  void set_needs_covariant_check_in_method() {
+    if (covariance_mode_ == kNotCovariant) {
+      covariance_mode_ = kImplicit;
+    }
   }
 
   enum TypeCheckMode {
@@ -208,6 +215,12 @@
   bool Equals(const LocalVariable& other) const;
 
  private:
+  enum CovarianceMode {
+    kNotCovariant,
+    kImplicit,
+    kExplicit,
+  };
+
   static const int kUninitializedIndex = INT_MIN;
 
   const TokenPosition declaration_pos_;
@@ -228,7 +241,7 @@
   bool is_invisible_;
   bool is_captured_parameter_;
   bool is_forced_stack_;
-  bool is_explicit_covariant_parameter_;
+  CovarianceMode covariance_mode_;
   bool is_late_;
   bool is_chained_future_;
   intptr_t expected_context_index_;
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index a3cf970..bf1d99b 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 39
+#define SERVICE_PROTOCOL_MINOR_VERSION 40
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 69dde47..b8d0906 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.39
+# Dart VM Service Protocol 3.40
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.39_ of the Dart VM Service Protocol. This
+This document describes of _version 3.40_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -102,6 +102,7 @@
   - [Instance](#instance)
   - [InstanceSet](#instanceset)
   - [Isolate](#isolate)
+  - [IsolateFlag](#isolateflag)
   - [IsolateGroup](#isolategroup)
   - [Library](#library)
   - [LibraryDependency](#librarydependency)
@@ -2785,6 +2786,10 @@
   // internal use. If `false`, this isolate is likely running user code.
   bool isSystemIsolate;
 
+  // The list of isolate flags provided to this isolate. See Dart_IsolateFlags
+  // in dart_api.h for the list of accepted isolate flags.
+  IsolateFlag[] isolateFlags;
+
   // The time that the VM started in milliseconds since the epoch.
   //
   // Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
@@ -2830,6 +2835,20 @@
 
 An _Isolate_ object provides information about one isolate in the VM.
 
+### IsolateFlag
+
+```
+class IsolateFlag {
+  // The name of the flag.
+  string name;
+
+  // The value of this flag as a string.
+  string valueAsString;
+}
+```
+
+Represents the value of a single isolate flag. See [Isolate](#isolate).
+
 ### IsolateGroup
 
 ```
@@ -2845,7 +2864,7 @@
 
   // Specifies whether the isolate group was spawned by the VM or embedder for
   // internal use. If `false`, this isolate group is likely running user code.
-  bool isSystemIsolateGroup;  
+  bool isSystemIsolateGroup;
 }
 ```
 
@@ -2865,7 +2884,7 @@
 
   // Specifies whether the isolate group was spawned by the VM or embedder for
   // internal use. If `false`, this isolate group is likely running user code.
-  bool isSystemIsolateGroup;  
+  bool isSystemIsolateGroup;
 
   // A list of all isolates in this isolate group.
   @Isolate[] isolates;
@@ -3835,5 +3854,6 @@
 3.37 | Added `getWebSocketTarget` RPC and `WebSocketTarget` object.
 3.38 | Added `isSystemIsolate` property to `@Isolate` and `Isolate`, `isSystemIsolateGroup` property to `@IsolateGroup` and `IsolateGroup`, and properties `systemIsolates` and `systemIsolateGroups` to `VM`.
 3.39 | Removed the following deprecated RPCs and objects: `getClientName`, `getWebSocketTarget`, `setClientName`, `requireResumeApproval`, `ClientName`, and `WebSocketTarget`.
+3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/service_extension.md b/runtime/vm/service/service_extension.md
index b564c2a..5cb05ff 100644
--- a/runtime/vm/service/service_extension.md
+++ b/runtime/vm/service/service_extension.md
@@ -1,4 +1,4 @@
-# Dart VM Service Protocol Extension 1.2
+# Dart VM Service Protocol Extension 1.4
 
 This protocol describes service extensions that are made available through
 the Dart core libraries, but are not part of the core
@@ -10,7 +10,7 @@
 
 ## dart:io Extensions
 
-This section describes _version 1.2_ of the dart:io service protocol extensions.
+This section describes _version 1.4_ of the dart:io service protocol extensions.
 
 ### getVersion
 
@@ -135,13 +135,13 @@
 ### httpEnableTimelineLogging
 
 ```
-HttpTimelineLoggingState httpEnableTimelineLogging(string isolateId, bool enable [optional])
+HttpTimelineLoggingState httpEnableTimelineLogging(string isolateId, bool enabled [optional])
 ```
 
 The _httpEnableTimelineLogging_ RPC is used to set and inspect the value of
 `HttpClient.enableTimelineLogging`, which determines if HTTP client requests
-should be logged to the timeline. If `enable` is provided, the state of
-`HttpClient.enableTimelineLogging` will be updated to the value of `enable`.
+should be logged to the timeline. If `enabled` is provided, the state of
+`HttpClient.enableTimelineLogging` will be updated to the value of `enabled`.
 
 If the value of `HttpClient.enableTimelineLogging` is changed, a
 `HttpTimelineLoggingStateChange` event will be sent on the `Extension` stream.
@@ -344,3 +344,4 @@
 1.1 | Added `lastReadTime` and `lastWriteTime` properties to `SocketStatistic`.
 1.2 | Added `getOpenFiles`, `getOpenFileById`, `getSpawnedProcesses`, and `getSpawnedProcessById` RPCs and added `OpenFile` and `SpawnedProcess` objects.
 1.3 | Added `httpEnableTimelineLogging` RPC and `HttpTimelineLoggingStateChange` event, deprecated `getHttpEnableTimelineLogging` and `setHttpEnableTimelineLogging`.
+1.4 | Updated `httpEnableTimelineLogging` parameter `enable` to `enabled`. `enable` will continue to be accepted.
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index b7ca682..76d2c68 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -1945,8 +1945,9 @@
    * and only for the status codes [HttpStatus.movedPermanently]
    * (301), [HttpStatus.found] (302),
    * [HttpStatus.movedTemporarily] (302, alias for
-   * [HttpStatus.found]), [HttpStatus.seeOther] (303) and
-   * [HttpStatus.temporaryRedirect] (307). For
+   * [HttpStatus.found]), [HttpStatus.seeOther] (303),
+   * [HttpStatus.temporaryRedirect] (307) and
+   * [HttpStatus.permanentRedirect] (308). For
    * [HttpStatus.seeOther] (303) automatic redirect will also happen
    * for "POST" requests with the method changed to "GET" when
    * following the redirect.
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 4731868..eac06c4 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -350,6 +350,7 @@
   bool get isRedirect {
     if (_httpRequest.method == "GET" || _httpRequest.method == "HEAD") {
       return statusCode == HttpStatus.movedPermanently ||
+          statusCode == HttpStatus.permanentRedirect ||
           statusCode == HttpStatus.found ||
           statusCode == HttpStatus.seeOther ||
           statusCode == HttpStatus.temporaryRedirect;
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index 5c5f484..772263c 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -70,9 +70,9 @@
 class Primitives {
   static int? parseInt(@nullCheck String source, int? _radix) {
     var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
-    // TODO(jmesserly): this isn't reified List<String>, but it's safe to use as
-    // long as we use it locally and don't expose it to user code.
-    List<String>? match = JS('', '#.exec(#)', re, source);
+    // This isn't reified List<String?>?, but it's safe to use as long as we use
+    // it locally and don't expose it to user code.
+    var match = JS<List<String?>?>('', '#.exec(#)', re, source);
     int digitsIndex = 1;
     int hexIndex = 2;
     int decimalIndex = 3;
@@ -82,7 +82,7 @@
       // again.
       return null;
     }
-    String? decimalMatch = match[decimalIndex];
+    var decimalMatch = match[decimalIndex];
     if (_radix == null) {
       if (decimalMatch != null) {
         // Cannot fail because we know that the digits are all decimal.
@@ -304,13 +304,17 @@
     // Example: "Wed May 16 2012 21:13:00 GMT+0200 (CEST)".
     // We extract this name using a regexp.
     var d = lazyAsJsDate(receiver);
-    List? match = JS('JSArray|Null', r'/\((.*)\)/.exec(#.toString())', d);
+    // In this method all calls to `exec()` include a single capture group and
+    // it is only read if there is a match so a value will be present. To avoid
+    // extra null checks or casts from dynamic we type the return type of
+    // `exec()` to always contain non-nullable Strings.
+    var match = JS<List<String>?>('', r'/\((.*)\)/.exec(#.toString())', d);
     if (match != null) return match[1];
 
     // Internet Explorer 10+ emits the zone name without parenthesis:
     // Example: Thu Oct 31 14:07:44 PDT 2013
-    match = JS(
-        'JSArray|Null',
+    match = JS<List<String>?>(
+        '',
         // Thu followed by a space.
         r'/^[A-Z,a-z]{3}\s'
             // Oct 31 followed by space.
@@ -329,7 +333,8 @@
     // UTC/GMT offset.
     // Example (IE9): Wed Nov 20 09:51:00 UTC+0100 2013
     //       (Opera): Wed Nov 20 2013 11:03:38 GMT+0100
-    match = JS('JSArray|Null', r'/(?:GMT|UTC)[+-]\d{4}/.exec(#.toString())', d);
+    match =
+        JS<List<String>?>('', r'/(?:GMT|UTC)[+-]\d{4}/.exec(#.toString())', d);
     if (match != null) return match[0];
     return "";
   }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
index 6ce53ac..73f95fb 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
@@ -116,8 +116,9 @@
   }
 
   RegExpMatch? firstMatch(@nullCheck String string) {
-    List<String>? m =
-        JS('JSExtendableArray|Null', r'#.exec(#)', _nativeRegExp, string);
+    // This isn't reified List<String?>?, but it's safe to use as long as we use
+    // it locally and don't expose it to user code.
+    var m = JS<List<String?>?>('', r'#.exec(#)', _nativeRegExp, string);
     if (m == null) return null;
     return _MatchImplementation(this, m);
   }
@@ -144,8 +145,9 @@
   RegExpMatch? _execGlobal(String string, int start) {
     Object regexp = _nativeGlobalVersion;
     JS("void", "#.lastIndex = #", regexp, start);
-    List<String>? match =
-        JS("JSExtendableArray|Null", "#.exec(#)", regexp, string);
+    // This isn't reified List<String?>?, but it's safe to use as long as we use
+    // it locally and don't expose it to user code.
+    var match = JS<List<String?>?>("", "#.exec(#)", regexp, string);
     if (match == null) return null;
     return _MatchImplementation(this, match);
   }
@@ -153,8 +155,9 @@
   RegExpMatch? _execAnchored(String string, int start) {
     Object regexp = _nativeAnchoredVersion;
     JS("void", "#.lastIndex = #", regexp, start);
-    List<String>? match =
-        JS("JSExtendableArray|Null", "#.exec(#)", regexp, string);
+    // This isn't reified List<String?>?, but it's safe to use as long as we use
+    // it locally and don't expose it to user code.
+    var match = JS<List<String?>?>("", "#.exec(#)", regexp, string);
     if (match == null) return null;
     // If the last capture group participated, the original regexp did not
     // match at the start position.
@@ -178,9 +181,12 @@
 
 class _MatchImplementation implements RegExpMatch {
   final Pattern pattern;
-  // Contains a JS RegExp match object.
-  // It is an Array of String values with extra "index" and "input" properties.
-  final List<String> _match;
+  // Contains a JS RegExp match object that is an Array with extra "index" and
+  // "input" properties. The array contains Strings but the values at indices
+  // related to capture groups can be undefined.
+  // This isn't reified List<String?>, but it's safe to use as long as we use
+  // it locally and don't expose it to user code.
+  final List<String?> _match;
 
   _MatchImplementation(this.pattern, this._match) {
     assert(JS("var", "#.input", _match) is String);
@@ -189,7 +195,7 @@
 
   String get input => JS("String", "#.input", _match);
   int get start => JS("int", "#.index", _match);
-  int get end => start + _match[0].length;
+  int get end => start + _match[0]!.length;
 
   String? group(int index) => _match[index];
   String? operator [](int index) => group(index);
diff --git a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
index 9a0586d..5989763 100644
--- a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
@@ -98,7 +98,61 @@
 
   void _destroy() native "SecureSocket_Destroy";
 
-  void handshake() native "SecureSocket_Handshake";
+  int _handshake(SendPort replyPort) native "SecureSocket_Handshake";
+
+  void _markAsTrusted(int certificatePtr, bool isTrusted)
+      native "SecureSocket_MarkAsTrusted";
+
+  static X509Certificate _newX509CertificateWrapper(int certificatePtr)
+      native "SecureSocket_NewX509CertificateWrapper";
+
+  Future<bool> handshake() {
+    Completer<bool> evaluatorCompleter = Completer<bool>();
+
+    ReceivePort rpEvaluateResponse = ReceivePort();
+    rpEvaluateResponse.listen((data) {
+      List list = data as List;
+      // incoming messages (bool isTrusted, int certificatePtr) is
+      // sent by TrustEvaluator native port after system evaluates
+      // the certificate chain
+      if (list.length != 2) {
+        throw Exception("Invalid number of arguments in evaluate response");
+      }
+      bool isTrusted = list[0] as bool;
+      int certificatePtr = list[1] as int;
+      if (!isTrusted) {
+        if (badCertificateCallback != null) {
+          try {
+            isTrusted = badCertificateCallback!(
+                _newX509CertificateWrapper(certificatePtr));
+          } catch (e, st) {
+            evaluatorCompleter.completeError(e, st);
+            rpEvaluateResponse.close();
+            return;
+          }
+        }
+      }
+      _markAsTrusted(certificatePtr, isTrusted);
+      evaluatorCompleter.complete(true);
+      rpEvaluateResponse.close();
+    });
+
+    const int kSslErrorWantCertificateVerify = 16; // ssl.h:558
+    int handshakeResult;
+    try {
+      handshakeResult = _handshake(rpEvaluateResponse.sendPort);
+    } catch (e, st) {
+      rpEvaluateResponse.close();
+      rethrow;
+    }
+    if (handshakeResult == kSslErrorWantCertificateVerify) {
+      return evaluatorCompleter.future;
+    } else {
+      // Response is ready, no need for evaluate response receive port
+      rpEvaluateResponse.close();
+      return Future<bool>.value(false);
+    }
+  }
 
   void rehandshake() => throw new UnimplementedError();
 
@@ -113,9 +167,16 @@
 
   X509Certificate? get peerCertificate native "SecureSocket_PeerCertificate";
 
-  void registerBadCertificateCallback(Function callback)
+  void _registerBadCertificateCallback(Function callback)
       native "SecureSocket_RegisterBadCertificateCallback";
 
+  Function? badCertificateCallback;
+
+  void registerBadCertificateCallback(Function callback) {
+    badCertificateCallback = callback;
+    _registerBadCertificateCallback(callback);
+  }
+
   void registerHandshakeCompleteCallback(Function handshakeCompleteHandler)
       native "SecureSocket_RegisterHandshakeCompleteCallback";
 
@@ -205,7 +266,7 @@
 class _X509CertificateImpl extends NativeFieldWrapperClass1
     implements X509Certificate {
   // The native field must be set manually on a new object, in native code.
-  // This is done by WrappedX509 in secure_socket.cc.
+  // This is done by WrappedX509Certificate in security_context.cc.
   _X509CertificateImpl._();
 
   Uint8List get _der native "X509_Der";
diff --git a/sdk/lib/core/iterator.dart b/sdk/lib/core/iterator.dart
index e9a6284..13c76b4 100644
--- a/sdk/lib/core/iterator.dart
+++ b/sdk/lib/core/iterator.dart
@@ -38,7 +38,7 @@
    * Advances the iterator to the next element of the iteration.
    *
    * Should be called before reading [current].
-   * It the call to `moveNext` returns `true`,
+   * If the call to `moveNext` returns `true`,
    * then [current] will contain the next element of the iteration
    * until `moveNext` is called again.
    * If the call returns `false`, there are no further elements
diff --git a/sdk/lib/io/network_profiling.dart b/sdk/lib/io/network_profiling.dart
index cb3d1ba..5c1c620 100644
--- a/sdk/lib/io/network_profiling.dart
+++ b/sdk/lib/io/network_profiling.dart
@@ -6,7 +6,7 @@
 
 // TODO(bkonyi): refactor into io_resource_info.dart
 const int _versionMajor = 1;
-const int _versionMinor = 3;
+const int _versionMinor = 4;
 
 const String _tcpSocket = 'tcp';
 const String _udpSocket = 'udp';
@@ -57,7 +57,15 @@
           responseJson = _setHttpEnableTimelineLogging(parameters);
           break;
         case _kHttpEnableTimelineLogging:
-          if (parameters.containsKey('enable')) {
+          if (parameters.containsKey('enabled') ||
+              parameters.containsKey('enable')) {
+            // TODO(bkonyi): Backwards compatibility.
+            // See https://github.com/dart-lang/sdk/issues/43638.
+            assert(_versionMajor == 1,
+                "'enable' is deprecated and should be removed (See #43638)");
+            if (parameters.containsKey('enabled')) {
+              parameters['enable'] = parameters['enabled']!;
+            }
             _setHttpEnableTimelineLogging(parameters);
           }
           responseJson = _getHttpEnableTimelineLogging();
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 08e9bf7..98d2dcf 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -812,11 +812,19 @@
 
   void _secureHandshake() {
     try {
-      _secureFilter!.handshake();
-      _filterStatus.writeEmpty = false;
-      _readSocket();
-      _writeSocket();
-      _scheduleFilter();
+      _secureFilter!.handshake().then((needRetryHandshake) {
+        if (needRetryHandshake) {
+          // Some certificates have been evaluated, need to rety handshake.
+          _secureHandshake();
+        } else {
+          _filterStatus.writeEmpty = false;
+          _readSocket();
+          _writeSocket();
+          _scheduleFilter();
+        }
+      }).catchError((e, stackTrace) {
+        _reportError(e, stackTrace);
+      });
     } catch (e, stackTrace) {
       _reportError(e, stackTrace);
     }
@@ -1235,7 +1243,7 @@
       bool requireClientCertificate,
       Uint8List protocols);
   void destroy();
-  void handshake();
+  Future<bool> handshake();
   String? selectedProtocol();
   void rehandshake();
   void renegotiate(bool useSessionCache, bool requestClientCertificate,
diff --git a/sdk/lib/vmservice/running_isolates.dart b/sdk/lib/vmservice/running_isolates.dart
index 6b6667a..03a6811 100644
--- a/sdk/lib/vmservice/running_isolates.dart
+++ b/sdk/lib/vmservice/running_isolates.dart
@@ -75,14 +75,6 @@
   _Evaluator(this._message, this._isolate, this._service);
 
   Future<Response> run() async {
-    if (_service.ddsUri != null) {
-      return Response.from(encodeRpcError(
-        _message,
-        kInternalError,
-        details: 'Fell through to VM Service expression evaluation when a DDS '
-            'instance was connected. Please file an issue on GitHub.',
-      ));
-    }
     final buildScopeResponse = await _buildScope();
     final responseJson = buildScopeResponse.decodeJson();
 
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index 1ca6f0b..7600e13 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -36,11 +36,8 @@
 LanguageFeatures/Instantiate-to-bound/typedef/*: Skip # Not migrated to NNBD
 LanguageFeatures/Instantiate-to-bound/typedef/dynamic/*: Skip # Not migrated to NNBD
 LanguageFeatures/Instantiate-to-bound/typedef/static/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/dynamic/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/dynamic/type-aliases/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/static/*: Skip # Not migrated to NNBD
-LanguageFeatures/Simple-bounds/static/type-aliases/*: Skip # Not migrated to NNBD
+LanguageFeatures/Simple-bounds/dynamic/type-aliases/*: Skip # Type aliases are not fully implemented
+LanguageFeatures/Simple-bounds/static/type-aliases/*: Skip # Type aliases are not fully implemented
 LanguageFeatures/Triple-Shift/*: Skip # Triple shift is not implemented yet
 LanguageFeatures/regression/34560_t02/01: Skip # Type aliases are not fully implemented
 LibTest/io/RawDatagramSocket/*: Skip # https://github.com/dart-lang/co19/issues/195
diff --git a/tests/language/await/null_aware_test.dart b/tests/language/await/null_aware_test.dart
index 88f16f0..819de12 100644
--- a/tests/language/await/null_aware_test.dart
+++ b/tests/language/await/null_aware_test.dart
@@ -13,11 +13,11 @@
 }
 
 main() async {
-  var x = 1 as int?;
+  int? x = 1;
   x ??= await f();
   Expect.equals(1, x);
 
-  var y = 1 as int?;
+  int? y = 1;
   y = y ?? await f();
   Expect.equals(1, y);
 }
diff --git a/tests/language/constructor/missing_initializer_test.dart b/tests/language/constructor/missing_initializer_test.dart
index 3736c5f..2de088e 100644
--- a/tests/language/constructor/missing_initializer_test.dart
+++ b/tests/language/constructor/missing_initializer_test.dart
@@ -12,7 +12,7 @@
   final dynamic n;
   //            ^
   // [analyzer] COMPILE_TIME_ERROR.FINAL_NOT_INITIALIZED
-  // [cfe] unspecified
+  // [cfe] Final field 'n' is not initialized.
 
   // Uninitialized, but no errors.
   abstract final int x1;
@@ -34,6 +34,7 @@
 class C = Object with A;
   //  ^
   // [analyzer] COMPILE_TIME_ERROR.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER
+  // [cfe] The non-abstract class 'C' is missing implementations for these members:
 
 // Has a generative constructor: default.
 abstract class D {
diff --git a/tests/language/if_null/assignment_static_test.dart b/tests/language/if_null/assignment_static_test.dart
index 7eee56b..14edd3c 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).
-  var c = new ClassWithInstanceGetters() as ClassWithInstanceGetters?;
+  ClassWithInstanceGetters? c = new 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 a55d7f5..a679108 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() {
-  var one = 1 as int?;
-  var b = B('B') as B?;
+  int? one = 1;
+  B? b = B('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 c4da142..ca78ab4 100644
--- a/tests/language/if_null/evaluation_order_test.dart
+++ b/tests/language/if_null/evaluation_order_test.dart
@@ -27,7 +27,7 @@
 }
 
 main() {
-  var one = 1 as int?;
+  int? one = 1;
   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 c29d634..7c91b32 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;
-  var a = new B() as A?;
+  A? a = new B();
   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 59c115e..535c7db 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() {
-  var c = new C() as C?;
+  C? c = new C();
   A a = new B();
   c?.f(a);
 //     ^
diff --git a/tests/language/mixin/regress_flutter_66859_test.dart b/tests/language/mixin/regress_flutter_66859_test.dart
new file mode 100644
index 0000000..544da53
--- /dev/null
+++ b/tests/language/mixin/regress_flutter_66859_test.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// Verifies that mixin supertypes are properly maintained even if marked as
+// deferred (e.g., in a circular hierarchy).
+// Regression test for: https://github.com/flutter/flutter/issues/66859
+
+import "package:expect/expect.dart";
+
+mixin M {}
+
+mixin N {}
+
+class A extends B<C> with M, N {}
+
+class B<T> {}
+
+class C extends A {}
+
+class Z extends B<Z> with M {}
+
+main() {
+  var z = Z();
+  Expect.isTrue(z is B<Z>);
+  Expect.isTrue(z is M);
+  var a = A();
+  Expect.isTrue(a is M);
+  Expect.isTrue(a is N);
+  Expect.isTrue(a is B<C>);
+}
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 a2a8182..4366065 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';
-    var stringQuestion = 'foo' as String?;
+    String? stringQuestion = 'foo';
     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 a6c8efd..3aa7d26 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;
-  var s = '' as String?;
+  String? s = '';
   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 131631e..b4b357e 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!;
   });
-  var x4 = 0 as Object?;
+  Object? x4 = 0;
   Expect.throws(() {
       x4 = a!;
   });
@@ -62,7 +62,7 @@
   // ignores its argument, and verify that the appropriate exception is still
   // thrown.
   var x6 = 2;
-  var i = 2 as int?;
+  int? i = 2;
   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.
-  var x8 = 2 as int?;
+  int? x8 = 2;
   -x8!;
-  var x9 = new C() as C?;
+  C? x9 = new 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 a1ade72..b67de99 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).
 
-  var c = new C(1) as C?;
+  C? c = new C(1);
   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 6db60ce3..5984802 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.
-  var c = new C(1) as C?;
+  C? c = new C(1);
   { 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 b2d1bc0..224a794 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'.
-  { var b = new C(1) as B?; Expect.equals(1, b?.v); }
-  //                                            ^
+  { B? b = new C(1); 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 ca60103..05b84a6 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.
-  { var d = new D(new E()) as D?; F? f = (d?.v += 1); Expect.identical(d!.v, f); }
+  { D? d = new D(new E()); 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 bc0cdb6..825bfc6 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).
 
-  { var c = new C(1) as C?; Expect.equals(2, c?.v = 2); Expect.equals(2, c!.v); }
+  { C? c = new C(1); 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 9507557..abcf60a 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.
-  { var d = new D(new E()) as D?; G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
+  { D? d = new D(new E()); 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 0a16c52..3c2d6c0 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).
 
-  { var c = new C(1) as C?; Expect.equals(3, c?.v += 2); Expect.equals(3, c!.v); }
+  { C? c = new C(1); 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 d7bf2f4..112b0a6 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.
-  { 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); }
-  //                                                     ^^^^^^^^
+  { 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); }
+  //                                              ^^^^^^^^
   // [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 4e9c166..03986fb 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(); var d = new D(e1) as D?; E? e2 = d?.v--; Expect.identical(e1, e2); }
+  { E e1 = new E(); D? d = new D(e1); 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 cfd1b8b..1016d22 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.
 
-  { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
+  { C? c = new C(1); 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 0677ac7..bb8c565 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.
-  { var d = new D(new E()) as D?; F? f = ++d?.v; Expect.identical(d!.v, f); }
+  { D? d = new D(new E()); 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 2927351..b2dc6b5 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.
 
-  { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
+  { C? c = new C(1); 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 903c33a..4201d15 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.
-  { var d = new D(new E()) as D?; F? f = --d?.v; Expect.identical(d!.v, f); }
+  { D? d = new D(new E()); 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 3a29ccc..67bca4a 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).
 
-  { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
+  { C? c = new C(1); 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 0cc85fb..8ca6c72 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(); var d = new D(e1) as D?; E? e2 = d?.v++; Expect.identical(e1, e2); }
+  { E e1 = new E(); D? d = new D(e1); 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 7b42679..cd3bd72 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).
 
-  { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
+  { C? c = new C(1); 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 7e80690..0b620fc 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++);
-  { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
+  { C? c = new C(1); 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(); 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); }
-  //                                              ^^^^^^
+  { 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); }
+  //                                       ^^^^^^
   // [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--);
-  { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
+  { C? c = new C(1); 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(); 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); }
-  //                                              ^^^^^^
+  { 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); }
+  //                                       ^^^^^^
   // [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);
-  { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
+  { C? c = new C(1); 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.
-  { 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); }
-  //                                     ^^^^^^
+  { 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); }
+  //                              ^^^^^^
   // [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);
-  { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
+  { C? c = new C(1); 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.
-  { 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); }
-  //                                     ^^^^^^
+  { 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); }
+  //                              ^^^^^^
   // [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 8c11b27..70a36d1 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).
 
-  var c = C() as C?;
+  C? c = 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 bbabd59..23559d8 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(...).
 
-  var c = new C() as C?;
+  C? c = new 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 b1f38e6..a1515fa 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() {
-  var c = C() as C?;
+  C? c = 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(...).
-  { var b = new C() as B?; Expect.equals(1, b?.f(() => 1)); }
-  //                                           ^
+  { B? b = new C(); Expect.equals(1, b?.f(() => 1)); }
+  //                                    ^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'f' isn't defined for the class 'B'.
-  { var i = 1 as int?; Expect.equals(null, nullC()?.f(i)); }
-  //                                                  ^
+  { int? i = 1; 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 eaaffe5..f4ce95c 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();
-  var c1q = c1 as C1?;
+  C1? c1q = c1;
   C1? c1n = null;
 
   C2 c2 = C2();
-  var c2q = c2 as C2?;
+  C2? c2q = 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 57f3848..c5bb8a7 100644
--- a/tests/language/null_aware/opt_test.dart
+++ b/tests/language/null_aware/opt_test.dart
@@ -23,17 +23,17 @@
 
 test() {
   var c;
-  var d = new C(5) as C?;
+  C? d = new C(5);
   Expect.equals(null, c?.m(bomb()));
   Expect.equals(null, getNull()?.anything(bomb()));
   Expect.equals(1, d?.m(1));
 
-  var c2 = new C(1) as C?;
+  C? c2 = new C(1);
   Expect.equals(1, c2?.f);
   Expect.equals(null, c?.v);
   Expect.equals(10, c ?? 10);
   Expect.equals(d, d ?? bomb());
-  var list = [[3]] as List<List<int>>?;
+  List<List<int>>? list = [[3]];
   Expect.equals(
       3,
       list?.expand((i) => i).toList()[0]);
@@ -58,7 +58,7 @@
   e?.f++;
   Expect.equals(201, e.f);
 
-  var five = 5 as int?;
+  int? five = 5;
   var x = five ?? bomb();
 }
 
diff --git a/tests/language/regress/regress29784_test.dart b/tests/language/regress/regress29784_test.dart
index 0df166f..37db686 100644
--- a/tests/language/regress/regress29784_test.dart
+++ b/tests/language/regress/regress29784_test.dart
@@ -16,6 +16,7 @@
   // [cfe] Can't access 'this' in a field initializer to read 'a'.
   A.ko() : assert(a == null);
   //              ^
+  // [analyzer] COMPILE_TIME_ERROR.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
   // [cfe] Can't access 'this' in a field initializer to read 'a'.
   var a, b;
 }
diff --git a/tests/language/spread_collections/const_test.dart b/tests/language/spread_collections/const_test.dart
index cab125f..1eb4d76 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 list23 = <int>[2, 3] as List<int>?;
-  const list4 = <int>[4] as List<int>?;
+  const List<int>? list23 = <int>[2, 3];
+  const List<int>? list4 = <int>[4];
   Expect.identical(list,
       const <int>[1, ...?list23, ...?(null), ...?list4]);
 
@@ -98,8 +98,8 @@
   });
 
   // Null-aware.
-  const map23 = <int, int>{2: 2, 3: 3} as Map<int, int>?;
-  const map4 = <int, int>{4: 4} as Map<int, int>?;
+  const Map<int, int>? map23 = <int, int>{2: 2, 3: 3};
+  const Map<int, int>? map4 = <int, int>{4: 4};
   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 list23 = <int>[2, 3] as List<int>?;
-  const list4 = <int>[4] as List<int>?;
+  const List<int>? list23 = <int>[2, 3];
+  const List<int>? list4 = <int>[4];
   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 baee04c..2a19168 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.
-  var list23 = [2, 3] as List<int>?;
-  var list4 = [4] as List<int>?;
+  List<int>? list23 = [2, 3];
+  List<int>? list4 = [4];
   Expect.listEquals(list, <int>[1, ...?list23, ...?(null), ...?list4]);
 
   // Does not deep flatten.
@@ -94,8 +94,8 @@
   });
 
   // Null-aware.
-  var map23 = {2: 2, 3: 3} as Map<int, int>?;
-  var map4 = {4: 4} as Map<int, int>?;
+  Map<int, int>? map23 = {2: 2, 3: 3};
+  Map<int, int>? map4 = {4: 4};
   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.
-  var list23 = [2, 3] as List<int>?;
-  var list4 = [4] as List<int>?;
+  List<int>? list23 = [2, 3];
+  List<int>? list4 = [4];
   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 ed6676f..aa6a51f 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]);
-  var nullableA = [0] as List<int>?;
+  List<int>? nullableA = [0];
   Expect.listEquals([1, 3], [1, ...?nullableA = null, 3]);
 
   var b = [2];
   Expect.listEquals([1, 2, 3, 4], [1, ...b..add(3), 4]);
-  var nullableB = [2] as List<int>?;
+  List<int>? nullableB = [2];
   Expect.listEquals([1, 2, 3, 4], [1, ...?nullableB?..add(3), 4]);
 }
diff --git a/tests/language_2/regress/regress29784_test.dart b/tests/language_2/regress/regress29784_test.dart
index 0df166f..37db686 100644
--- a/tests/language_2/regress/regress29784_test.dart
+++ b/tests/language_2/regress/regress29784_test.dart
@@ -16,6 +16,7 @@
   // [cfe] Can't access 'this' in a field initializer to read 'a'.
   A.ko() : assert(a == null);
   //              ^
+  // [analyzer] COMPILE_TIME_ERROR.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
   // [cfe] Can't access 'this' in a field initializer to read 'a'.
   var a, b;
 }
diff --git a/tests/standalone/http_launch_test.dart b/tests/standalone/http_launch_test.dart
index 1c9f8ab..07d6c13 100644
--- a/tests/standalone/http_launch_test.dart
+++ b/tests/standalone/http_launch_test.dart
@@ -9,6 +9,7 @@
 // OtherResources=http_launch_data/http_launch_main.dart
 // OtherResources=http_launch_data/http_spawn_main.dart
 // OtherResources=http_launch_data/the_packages/simple/simple.dart
+// OtherResources=http_launch_data/.dart_tool/package_config.json
 // OtherResources=http_launch_data/.packages
 //
 // Test:
diff --git a/tests/standalone/io/file_long_path_test.dart b/tests/standalone/io/file_long_path_test.dart
new file mode 100644
index 0000000..454e633d
--- /dev/null
+++ b/tests/standalone/io/file_long_path_test.dart
@@ -0,0 +1,247 @@
+// 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.
+//
+// This test is Windows-only.
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+const maxPath = 260;
+const maxDirectoryPath = maxPath - 12;
+String longName = '${'x' * 248}';
+
+Directory createLongPathDir(Directory tmp) {
+  if (tmp.path.length <= maxDirectoryPath) {
+    var path = tmp.path;
+    path += '\\${'t' * 248}';
+    var dir = Directory(path);
+    dir.createSync(recursive: true);
+    // Test the rename() of directory
+    dir = dir.renameSync(tmp.path + '\\$longName');
+    Expect.isTrue(dir.existsSync());
+    Expect.isFalse(Directory(path).existsSync());
+    return dir;
+  } else {
+    return tmp;
+  }
+}
+
+void testCreate(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  Expect.isTrue(file.existsSync());
+  file.deleteSync();
+}
+
+void testCopy(String dir) {
+  final src = '${dir}\\a_long_path_filename_1';
+  final dest = '${dir}\\a_long_path_filename_2';
+  Expect.isTrue(src.length > maxPath);
+  final file1 = File(src);
+  file1.createSync();
+
+  final file2 = file1.copySync(dest);
+  Expect.isTrue(file2.existsSync());
+  file1.deleteSync();
+  file2.deleteSync();
+}
+
+void testRename(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  Expect.isTrue(file.existsSync());
+
+  final renamedFile = file.renameSync('${path}_copy');
+
+  Expect.isFalse(file.existsSync());
+  Expect.isTrue(renamedFile.existsSync());
+  renamedFile.deleteSync();
+}
+
+void testReadWrite(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+
+  final content = "testReadWrite";
+  file.writeAsStringSync(content);
+  Expect.isTrue(file.existsSync());
+
+  int length = file.lengthSync();
+  Expect.equals(content.length, length);
+
+  final string = file.readAsStringSync();
+  Expect.equals(content, string);
+  file.deleteSync();
+}
+
+void testOpen(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  final access = file.openSync();
+  access.closeSync();
+}
+
+void testFileStat(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  final stat = FileStat.statSync(file.path);
+
+  final dateTime = DateTime.utc(2020);
+
+  file.setLastModifiedSync(dateTime);
+  Expect.notEquals(
+      stat.modified.toString(), file.lastModifiedSync().toString());
+
+  file.setLastAccessedSync(dateTime);
+  Expect.notEquals(
+      stat.accessed.toString(), file.lastAccessedSync().toString());
+}
+
+void testCreateLinkToDir(String dir) {
+  final path = '${dir}\\a_long_path_linkname';
+  Expect.isTrue(path.length > maxPath);
+  var target = '$dir\\a_long_path_target';
+  final link = Link(path)..createSync(target);
+
+  final dest = Directory(target)..createSync();
+  Expect.isTrue(dest.existsSync());
+
+  Expect.isTrue(link.existsSync());
+  Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+
+  // Rename link
+  var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+  Expect.isTrue(renamedLink.existsSync());
+  Expect.isFalse(link.existsSync());
+  Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+  // Update link target
+  target = '$dir\\an_updated_target';
+  final renamedDest = Directory(target)..createSync();
+  renamedLink.updateSync(target);
+  Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+  dest.deleteSync();
+  renamedDest.deleteSync();
+  renamedLink.deleteSync();
+}
+
+void testCreateLinkToFile(String dir) {
+  final path = '${dir}\\a_long_path_linkname';
+  Expect.isTrue(path.length > maxPath);
+  var target = '$dir\\a_long_path_target';
+  final link = Link(path)..createSync(target);
+
+  final dest = File(target)..createSync();
+  Expect.isTrue(dest.existsSync());
+
+  Expect.isTrue(link.existsSync());
+  Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+  Expect.isTrue(link.resolveSymbolicLinksSync().contains('a_long_path_target'));
+
+  // Rename link
+  var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+  Expect.isTrue(renamedLink.existsSync());
+  Expect.isFalse(link.existsSync());
+  Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+  // Update link target
+  target = '$dir\\an_updated_target';
+  final renamedDest = File(target)..createSync();
+  renamedLink.updateSync(target);
+  Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+  dest.deleteSync();
+  renamedDest.deleteSync();
+  renamedLink.deleteSync();
+}
+
+testNormalLinkToLongPath(String short, String long) {
+  var target = File('$long\\file_target')..createSync();
+  final link = Link('$short\\link')..createSync(target.path);
+  Expect.isTrue(target.path.length > maxPath);
+  Expect.isTrue(link.resolveSymbolicLinksSync().length > maxPath);
+  Expect.isTrue(link.path.length < maxPath);
+  Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+  Expect.isTrue(link.existsSync());
+  Expect.equals(target.path, link.targetSync());
+
+  var targetDir = Directory('$long\\dir_target')..createSync();
+  link.updateSync(targetDir.path);
+  Expect.equals(targetDir.path, link.targetSync());
+
+  link.deleteSync();
+  target.deleteSync();
+  targetDir.deleteSync();
+}
+
+testLongPathLinkToNormal(String short, String long) {
+  var target = File('$short\\file_target')..createSync();
+  final link = Link('$long\\link')..createSync(target.path);
+
+  Expect.isTrue(target.path.length < maxPath);
+  Expect.isTrue(link.path.length > maxPath);
+  Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+  Expect.isTrue(link.existsSync());
+  Expect.equals(target.path, link.targetSync());
+
+  var targetDir = Directory('$short\\dir_target')..createSync();
+  link.updateSync(targetDir.path);
+  Expect.equals(targetDir.path, link.targetSync());
+
+  link.deleteSync();
+  target.deleteSync();
+  targetDir.deleteSync();
+}
+
+testDirectorySetCurrent(String dir) {
+  // This tests setting a long path directory to current directory.
+  // This will fail.
+  Expect.isTrue(dir.length > maxPath);
+  Expect.throws<FileSystemException>(() {
+    Directory.current = dir;
+  }, (e) => e.toString().contains('extension is too long'));
+}
+
+void main() {
+  if (!Platform.isWindows) {
+    return;
+  }
+  final tmp = Directory.systemTemp.createTempSync('dart-file-long-path');
+  final oldCurrent = Directory.current;
+  Directory.current = tmp;
+  try {
+    String dir = createLongPathDir(tmp).path;
+    testDirectorySetCurrent(dir);
+    for (final path in [dir, ".\\$longName", ".\\$longName\\..\\$longName"]) {
+      testCreate(path);
+      testCopy(path);
+      testRename(path);
+      testReadWrite(path);
+      testOpen(path);
+      testFileStat(path);
+      testCreateLinkToDir(path);
+      testCreateLinkToFile(path);
+    }
+
+    testNormalLinkToLongPath(tmp.path, dir);
+    testLongPathLinkToNormal(tmp.path, dir);
+  } finally {
+    // Reset the current Directory.
+    Directory.current = oldCurrent;
+    tmp.deleteSync(recursive: true);
+  }
+}
diff --git a/tests/standalone/io/file_relative_long_path_test.dart b/tests/standalone/io/file_relative_long_path_test.dart
new file mode 100644
index 0000000..0c53ab3
--- /dev/null
+++ b/tests/standalone/io/file_relative_long_path_test.dart
@@ -0,0 +1,39 @@
+// 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.
+//
+// This test is Windows-only. It tests a short (shorter than 260) relative path
+// representing a long absolute path cannot be used by Windows API. Running this
+// test without proper support on long path will get an error.
+
+import 'dart:io';
+
+const maxPath = 260;
+
+void main(args) {
+  if (!Platform.isWindows) {
+    return;
+  }
+  final dir = Directory.systemTemp.createTempSync('test');
+
+  if (dir.path.length >= maxPath) {
+    return;
+  }
+
+  // Make sure oldpath is shorter than MAX_PATH (260).
+  int length = (maxPath - dir.path.length) ~/ 2;
+  final oldpath = Directory('${dir.path}\\${'x' * length}}');
+  oldpath.createSync(recursive: true);
+  final temp = Directory.current;
+
+  Directory.current = oldpath.path;
+
+  // The length of relative path is always shorter than maxPath, but it
+  // represents a path exceeding the maxPath.
+  final newpath = Directory('.\\${'y' * 2 * length}');
+  newpath.createSync();
+
+  // Reset current directory before deletion.
+  Directory.current = temp.path;
+  dir.deleteSync(recursive: true);
+}
diff --git a/tests/standalone/io/http_redirect_test.dart b/tests/standalone/io/http_redirect_test.dart
index c008a34..f68e32f 100644
--- a/tests/standalone/io/http_redirect_test.dart
+++ b/tests/standalone/io/http_redirect_test.dart
@@ -106,6 +106,7 @@
     addRedirectHandler(n++, HttpStatus.movedTemporarily);
     addRedirectHandler(n++, HttpStatus.seeOther);
     addRedirectHandler(n++, HttpStatus.temporaryRedirect);
+    addRedirectHandler(n++, HttpStatus.permanentRedirect);
     for (int i = n; i < 10; i++) {
       addRedirectHandler(i, HttpStatus.movedPermanently);
     }
diff --git a/tests/standalone/out_of_memory_slow_growth_test.dart b/tests/standalone/out_of_memory_slow_growth_test.dart
new file mode 100644
index 0000000..e534dc6
--- /dev/null
+++ b/tests/standalone/out_of_memory_slow_growth_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// VMOptions=--old_gen_heap_size=20
+// VMOptions=--old_gen_heap_size=20 --enable_vm_service --pause_isolates_on_unhandled_exceptions
+
+import "package:expect/expect.dart";
+
+main() {
+  var leak;
+  var exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+}
diff --git a/tests/standalone_2/io/file_long_path_test.dart b/tests/standalone_2/io/file_long_path_test.dart
new file mode 100644
index 0000000..454e633d
--- /dev/null
+++ b/tests/standalone_2/io/file_long_path_test.dart
@@ -0,0 +1,247 @@
+// 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.
+//
+// This test is Windows-only.
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+const maxPath = 260;
+const maxDirectoryPath = maxPath - 12;
+String longName = '${'x' * 248}';
+
+Directory createLongPathDir(Directory tmp) {
+  if (tmp.path.length <= maxDirectoryPath) {
+    var path = tmp.path;
+    path += '\\${'t' * 248}';
+    var dir = Directory(path);
+    dir.createSync(recursive: true);
+    // Test the rename() of directory
+    dir = dir.renameSync(tmp.path + '\\$longName');
+    Expect.isTrue(dir.existsSync());
+    Expect.isFalse(Directory(path).existsSync());
+    return dir;
+  } else {
+    return tmp;
+  }
+}
+
+void testCreate(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  Expect.isTrue(file.existsSync());
+  file.deleteSync();
+}
+
+void testCopy(String dir) {
+  final src = '${dir}\\a_long_path_filename_1';
+  final dest = '${dir}\\a_long_path_filename_2';
+  Expect.isTrue(src.length > maxPath);
+  final file1 = File(src);
+  file1.createSync();
+
+  final file2 = file1.copySync(dest);
+  Expect.isTrue(file2.existsSync());
+  file1.deleteSync();
+  file2.deleteSync();
+}
+
+void testRename(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  Expect.isTrue(file.existsSync());
+
+  final renamedFile = file.renameSync('${path}_copy');
+
+  Expect.isFalse(file.existsSync());
+  Expect.isTrue(renamedFile.existsSync());
+  renamedFile.deleteSync();
+}
+
+void testReadWrite(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+
+  final content = "testReadWrite";
+  file.writeAsStringSync(content);
+  Expect.isTrue(file.existsSync());
+
+  int length = file.lengthSync();
+  Expect.equals(content.length, length);
+
+  final string = file.readAsStringSync();
+  Expect.equals(content, string);
+  file.deleteSync();
+}
+
+void testOpen(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  final access = file.openSync();
+  access.closeSync();
+}
+
+void testFileStat(String dir) {
+  final path = '${dir}\\a_long_path_filename';
+  Expect.isTrue(path.length > maxPath);
+  final file = File(path);
+  file.createSync();
+  final stat = FileStat.statSync(file.path);
+
+  final dateTime = DateTime.utc(2020);
+
+  file.setLastModifiedSync(dateTime);
+  Expect.notEquals(
+      stat.modified.toString(), file.lastModifiedSync().toString());
+
+  file.setLastAccessedSync(dateTime);
+  Expect.notEquals(
+      stat.accessed.toString(), file.lastAccessedSync().toString());
+}
+
+void testCreateLinkToDir(String dir) {
+  final path = '${dir}\\a_long_path_linkname';
+  Expect.isTrue(path.length > maxPath);
+  var target = '$dir\\a_long_path_target';
+  final link = Link(path)..createSync(target);
+
+  final dest = Directory(target)..createSync();
+  Expect.isTrue(dest.existsSync());
+
+  Expect.isTrue(link.existsSync());
+  Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+
+  // Rename link
+  var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+  Expect.isTrue(renamedLink.existsSync());
+  Expect.isFalse(link.existsSync());
+  Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+  // Update link target
+  target = '$dir\\an_updated_target';
+  final renamedDest = Directory(target)..createSync();
+  renamedLink.updateSync(target);
+  Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+  dest.deleteSync();
+  renamedDest.deleteSync();
+  renamedLink.deleteSync();
+}
+
+void testCreateLinkToFile(String dir) {
+  final path = '${dir}\\a_long_path_linkname';
+  Expect.isTrue(path.length > maxPath);
+  var target = '$dir\\a_long_path_target';
+  final link = Link(path)..createSync(target);
+
+  final dest = File(target)..createSync();
+  Expect.isTrue(dest.existsSync());
+
+  Expect.isTrue(link.existsSync());
+  Expect.isTrue(link.targetSync().contains('a_long_path_target'));
+  Expect.isTrue(link.resolveSymbolicLinksSync().contains('a_long_path_target'));
+
+  // Rename link
+  var renamedLink = link.renameSync('${dir}\\a_renamed_long_path_link');
+  Expect.isTrue(renamedLink.existsSync());
+  Expect.isFalse(link.existsSync());
+  Expect.isTrue(renamedLink.targetSync().contains('a_long_path_target'));
+
+  // Update link target
+  target = '$dir\\an_updated_target';
+  final renamedDest = File(target)..createSync();
+  renamedLink.updateSync(target);
+  Expect.isTrue(renamedLink.targetSync().contains('an_updated_target'));
+
+  dest.deleteSync();
+  renamedDest.deleteSync();
+  renamedLink.deleteSync();
+}
+
+testNormalLinkToLongPath(String short, String long) {
+  var target = File('$long\\file_target')..createSync();
+  final link = Link('$short\\link')..createSync(target.path);
+  Expect.isTrue(target.path.length > maxPath);
+  Expect.isTrue(link.resolveSymbolicLinksSync().length > maxPath);
+  Expect.isTrue(link.path.length < maxPath);
+  Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+  Expect.isTrue(link.existsSync());
+  Expect.equals(target.path, link.targetSync());
+
+  var targetDir = Directory('$long\\dir_target')..createSync();
+  link.updateSync(targetDir.path);
+  Expect.equals(targetDir.path, link.targetSync());
+
+  link.deleteSync();
+  target.deleteSync();
+  targetDir.deleteSync();
+}
+
+testLongPathLinkToNormal(String short, String long) {
+  var target = File('$short\\file_target')..createSync();
+  final link = Link('$long\\link')..createSync(target.path);
+
+  Expect.isTrue(target.path.length < maxPath);
+  Expect.isTrue(link.path.length > maxPath);
+  Expect.isTrue(link.resolveSymbolicLinksSync().contains('file_target'));
+
+  Expect.isTrue(link.existsSync());
+  Expect.equals(target.path, link.targetSync());
+
+  var targetDir = Directory('$short\\dir_target')..createSync();
+  link.updateSync(targetDir.path);
+  Expect.equals(targetDir.path, link.targetSync());
+
+  link.deleteSync();
+  target.deleteSync();
+  targetDir.deleteSync();
+}
+
+testDirectorySetCurrent(String dir) {
+  // This tests setting a long path directory to current directory.
+  // This will fail.
+  Expect.isTrue(dir.length > maxPath);
+  Expect.throws<FileSystemException>(() {
+    Directory.current = dir;
+  }, (e) => e.toString().contains('extension is too long'));
+}
+
+void main() {
+  if (!Platform.isWindows) {
+    return;
+  }
+  final tmp = Directory.systemTemp.createTempSync('dart-file-long-path');
+  final oldCurrent = Directory.current;
+  Directory.current = tmp;
+  try {
+    String dir = createLongPathDir(tmp).path;
+    testDirectorySetCurrent(dir);
+    for (final path in [dir, ".\\$longName", ".\\$longName\\..\\$longName"]) {
+      testCreate(path);
+      testCopy(path);
+      testRename(path);
+      testReadWrite(path);
+      testOpen(path);
+      testFileStat(path);
+      testCreateLinkToDir(path);
+      testCreateLinkToFile(path);
+    }
+
+    testNormalLinkToLongPath(tmp.path, dir);
+    testLongPathLinkToNormal(tmp.path, dir);
+  } finally {
+    // Reset the current Directory.
+    Directory.current = oldCurrent;
+    tmp.deleteSync(recursive: true);
+  }
+}
diff --git a/tests/standalone_2/io/file_relative_long_path_test.dart b/tests/standalone_2/io/file_relative_long_path_test.dart
new file mode 100644
index 0000000..0c53ab3
--- /dev/null
+++ b/tests/standalone_2/io/file_relative_long_path_test.dart
@@ -0,0 +1,39 @@
+// 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.
+//
+// This test is Windows-only. It tests a short (shorter than 260) relative path
+// representing a long absolute path cannot be used by Windows API. Running this
+// test without proper support on long path will get an error.
+
+import 'dart:io';
+
+const maxPath = 260;
+
+void main(args) {
+  if (!Platform.isWindows) {
+    return;
+  }
+  final dir = Directory.systemTemp.createTempSync('test');
+
+  if (dir.path.length >= maxPath) {
+    return;
+  }
+
+  // Make sure oldpath is shorter than MAX_PATH (260).
+  int length = (maxPath - dir.path.length) ~/ 2;
+  final oldpath = Directory('${dir.path}\\${'x' * length}}');
+  oldpath.createSync(recursive: true);
+  final temp = Directory.current;
+
+  Directory.current = oldpath.path;
+
+  // The length of relative path is always shorter than maxPath, but it
+  // represents a path exceeding the maxPath.
+  final newpath = Directory('.\\${'y' * 2 * length}');
+  newpath.createSync();
+
+  // Reset current directory before deletion.
+  Directory.current = temp.path;
+  dir.deleteSync(recursive: true);
+}
diff --git a/tests/standalone_2/io/http_redirect_test.dart b/tests/standalone_2/io/http_redirect_test.dart
index 1e54bb9..ccb95c5 100644
--- a/tests/standalone_2/io/http_redirect_test.dart
+++ b/tests/standalone_2/io/http_redirect_test.dart
@@ -106,6 +106,7 @@
     addRedirectHandler(n++, HttpStatus.movedTemporarily);
     addRedirectHandler(n++, HttpStatus.seeOther);
     addRedirectHandler(n++, HttpStatus.temporaryRedirect);
+    addRedirectHandler(n++, HttpStatus.permanentRedirect);
     for (int i = n; i < 10; i++) {
       addRedirectHandler(i, HttpStatus.movedPermanently);
     }
diff --git a/tests/standalone_2/out_of_memory_slow_growth_test.dart b/tests/standalone_2/out_of_memory_slow_growth_test.dart
new file mode 100644
index 0000000..e534dc6
--- /dev/null
+++ b/tests/standalone_2/out_of_memory_slow_growth_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// VMOptions=--old_gen_heap_size=20
+// VMOptions=--old_gen_heap_size=20 --enable_vm_service --pause_isolates_on_unhandled_exceptions
+
+import "package:expect/expect.dart";
+
+main() {
+  var leak;
+  var exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 32d89b9..3731a6d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 181
+PRERELEASE 182
 PRERELEASE_PATCH 0
\ No newline at end of file