Version 2.10.0-2.0.dev

Merge commit 'ca743398c2145c8147f5e6cbaba1416d8643b66e' into dev
diff --git a/DEPS b/DEPS
index 85f2bd0..c9fc55e 100644
--- a/DEPS
+++ b/DEPS
@@ -44,11 +44,11 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "d79951e06e443213243e54c2c32694b79a221b65",
-  "co19_2_rev": "620c1148c8b7a3d7f74afacf348c46f109eb64f2",
+  "co19_rev": "86c948fbe7c8a9e74f572038f2ec70dfce7f20b0",
+  "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
-  "benchmarks_internal_rev": "0e59a6bc3ee912273865b87709cdb698be358e30",
+  "benchmarks_internal_rev": "9bc9e373b3d3cacdd7aba906caea77075c6cd2e3",
   "checkout_benchmarks_internal": False,
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
@@ -79,7 +79,7 @@
   "collection_rev": "583693680fc067e34ca5b72503df25e8b80579f9",
   "convert_rev": "49bde5b371eb5c2c8e721557cf762f17c75e49fc",
   "crypto_rev": "7422fb2f6584fe1839eb30bc4ca56e9f9760b801",
-  "csslib_rev": "bf372d4fdc6dfa232ad93f77a0a3de0891edd04c",
+  "csslib_rev": "451448a9ac03f87a8d0377fc0b411d8c388a6cb4",
   "dart2js_info_tag" : "0.6.0",
 
   # Note: Updates to dart_style have to be coordinated with the infrastructure
@@ -97,7 +97,7 @@
   "dart_style_tag": "1.3.6",  # Please see the note above before updating.
 
   "chromedriver_tag": "83.0.4103.39",
-  "dartdoc_tag" : "v0.32.2",
+  "dartdoc_rev" : "6d5396c2b4bc415ab9cb3d8212b87ecffd90a272",
   "ffi_rev": "454ab0f9ea6bd06942a983238d8a6818b1357edb",
   "fixnum_rev": "300c3f025e94a72b7b6770e15f76a4de15f77668",
   "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
@@ -116,7 +116,7 @@
   "linter_tag": "0.1.117",
   "logging_rev": "9561ba016ae607747ae69b846c0e10958ca58ed4",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "markdown_rev": "dd150bb64c5f3b41d31f20f399ae2a855f7f8c00",
+  "markdown_rev": "acaddfe74217f62498b5cf0cf5429efa6a700be3",
   "matcher_rev": "9cae8faa7868bf3a88a7ba45eb0bd128e66ac515",
   "mime_rev": "179b5e6a88f4b63f36dc1b8fcbc1e83e5e0cd3a7",
   "mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
@@ -326,7 +326,7 @@
   Var("dart_root") + "/third_party/pkg/dart2js_info":
       Var("dart_git") + "dart2js_info.git" + "@" + Var("dart2js_info_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
-      Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_tag"),
+      Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_rev"),
   Var("dart_root") + "/third_party/pkg/ffi":
       Var("dart_git") + "ffi.git" + "@" + Var("ffi_rev"),
   Var("dart_root") + "/third_party/pkg/fixnum":
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 276b71e..61e97af 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2308,95 +2308,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedLibraryExport =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""A library with name '#name' is exported more than once.""",
-        withArguments: _withArgumentsDuplicatedLibraryExport);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryExport =
-    const Code<Message Function(String name)>(
-        "DuplicatedLibraryExport", templateDuplicatedLibraryExport,
-        analyzerCodes: <String>["EXPORT_DUPLICATED_LIBRARY_NAMED"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryExport(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryExport,
-      message: """A library with name '${name}' is exported more than once.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateDuplicatedLibraryExportContext =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is also exported here.""",
-        withArguments: _withArgumentsDuplicatedLibraryExportContext);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryExportContext =
-    const Code<Message Function(String name)>("DuplicatedLibraryExportContext",
-        templateDuplicatedLibraryExportContext,
-        severity: Severity.context);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryExportContext(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryExportContext,
-      message: """'${name}' is also exported here.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedLibraryImport =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""A library with name '#name' is imported more than once.""",
-        withArguments: _withArgumentsDuplicatedLibraryImport);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryImport =
-    const Code<Message Function(String name)>(
-        "DuplicatedLibraryImport", templateDuplicatedLibraryImport,
-        analyzerCodes: <String>["IMPORT_DUPLICATED_LIBRARY_NAMED"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryImport(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryImport,
-      message: """A library with name '${name}' is imported more than once.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateDuplicatedLibraryImportContext =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is also imported here.""",
-        withArguments: _withArgumentsDuplicatedLibraryImportContext);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryImportContext =
-    const Code<Message Function(String name)>("DuplicatedLibraryImportContext",
-        templateDuplicatedLibraryImportContext,
-        severity: Severity.context);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryImportContext(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryImportContext,
-      message: """'${name}' is also imported here.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateDuplicatedModifier =
     const Template<Message Function(Token token)>(
         messageTemplate: r"""The modifier '#lexeme' was already specified.""",
@@ -6380,14 +6291,6 @@
     message: r"""Can only use type variables in instance methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeNonNullAwareSpreadIsNull = messageNonNullAwareSpreadIsNull;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageNonNullAwareSpreadIsNull = const MessageCode(
-    "NonNullAwareSpreadIsNull",
-    message: r"""Can't spread a value with static type Null.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateNonNullableLateDefinitelyAssignedError =
     const Template<Message Function(String name)>(
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
index ec8e355..d05ecbc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
@@ -486,10 +486,10 @@
 
     final List<Token> typeVariableEndGroups = <Token>[];
     for (Link<Token> t = typeVariableStarters; t.isNotEmpty; t = t.tail) {
+      parser.listener.beginFunctionType(start);
       typeVariableEndGroups.add(
           computeTypeParamOrArg(t.head, /* inDeclaration = */ true)
               .parseVariables(t.head, parser));
-      parser.listener.beginFunctionType(start);
     }
 
     if (gftHasReturnType == false) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
index 8b68c68..04ae6f3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
@@ -726,6 +726,14 @@
   }
 }
 
+String getTestName(FileSystemEntity entity) {
+  if (entity is Directory) {
+    return entity.uri.pathSegments[entity.uri.pathSegments.length - 2];
+  } else {
+    return entity.uri.pathSegments.last;
+  }
+}
+
 /// Check code for all tests in [dataDir] using [runTest].
 Future<void> runTests<T>(Directory dataDir,
     {List<String> args: const <String>[],
@@ -766,16 +774,14 @@
           !entity.path.endsWith('~') && !entity.path.endsWith('marker.options'))
       .toList();
   if (shards > 1) {
+    entities.sort((a, b) => getTestName(a).compareTo(getTestName(b)));
     int start = entities.length * shardIndex ~/ shards;
     int end = entities.length * (shardIndex + 1) ~/ shards;
     entities = entities.sublist(start, end);
   }
   int testCount = 0;
   for (FileSystemEntity entity in entities) {
-    String name = entity.uri.pathSegments.last;
-    if (entity is Directory) {
-      name = entity.uri.pathSegments[entity.uri.pathSegments.length - 2];
-    }
+    String name = getTestName(entity);
     if (args.isNotEmpty && !args.contains(name) && !continued) continue;
     if (shouldContinue) continued = true;
     testCount++;
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 309cbd8..a9414fd 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -655,7 +655,7 @@
 
   /// Return `true` if the new relevance computations should be used when
   /// computing code completion suggestions.
-  bool useNewRelevance = false;
+  bool useNewRelevance = true;
 
   /// The set of enabled features.
   FeatureSet featureSet = FeatureSet();
diff --git a/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart b/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
index 7fc3e1e..d15e724 100644
--- a/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
@@ -65,7 +65,7 @@
   static void fixNamedConstructorTypeArgs(DartFixRegistrar registrar,
       DartFixListener listener, EditDartfixParams params) {
     registrar.registerErrorTask(
-        StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+        CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
         FixErrorTask(listener));
   }
 }
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 24504db..6e075f6 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -827,6 +827,7 @@
     // Temporary flags.
     //
     parser.addFlag(USE_NEW_RELEVANCE,
+        defaultsTo: true,
         help: 'Use the new relevance computation for code completion.');
 
     return parser;
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 ee307b7..ec4e330 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
@@ -10,7 +10,12 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/dart/add_override.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_const.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_empty_else.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_initializer.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_unnecessary_new.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_cascade_with_dot.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_colon_with_equals.dart';
@@ -29,8 +34,16 @@
   /// generators used for non-lint diagnostics are in the [nonLintProducerMap].
   static const Map<String, ProducerGenerator> lintProducerMap = {
     LintNames.annotate_overrides: AddOverride.newInstance,
+    LintNames.avoid_annotating_with_dynamic: RemoveTypeAnnotation.newInstance,
+    LintNames.avoid_empty_else: RemoveEmptyElse.newInstance,
+    LintNames.avoid_init_to_null: RemoveInitializer.newInstance,
+    LintNames.avoid_redundant_argument_values: RemoveArgument.newInstance,
+    LintNames.avoid_return_types_on_setters: RemoveTypeAnnotation.newInstance,
     LintNames.avoid_single_cascade_in_expression_statements:
         ReplaceCascadeWithDot.newInstance,
+    LintNames.avoid_types_on_closure_parameters:
+        RemoveTypeAnnotation.newInstance,
+    LintNames.prefer_contains: ConvertToContains.newInstance,
     LintNames.prefer_equal_for_default_values:
         ReplaceColonWithEquals.newInstance,
     LintNames.slash_for_doc_comments: ConvertDocumentationIntoLine.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
index f04a6c3..48ae964 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
@@ -27,6 +27,10 @@
     var fromType = target.staticType;
     DartType toType;
     var parent = target.parent;
+    if (parent is CascadeExpression && target == parent.target) {
+      target = parent;
+      parent = target.parent;
+    }
     if (parent is AssignmentExpression && target == parent.rightHandSide) {
       toType = parent.leftHandSide.staticType;
     } else if (parent is VariableDeclaration && target == parent.initializer) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index 2474392..065deff 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
@@ -27,7 +27,7 @@
     Element targetElement;
     ArgumentList argumentList;
 
-    if (node is SimpleIdentifier) {
+    if (node is SimpleIdentifier || node is ConstructorName) {
       var invocation = node.parent;
       if (invocation is MethodInvocation) {
         targetElement = invocation.methodName.staticElement;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart
index bbcf86e..b07fa5c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart
@@ -4,6 +4,7 @@
 
 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_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -15,8 +16,12 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     await builder.addDartFileEdit(file, (builder) {
-      builder.addSimpleReplacement(
-          utils.getLinesRange(range.node(node.parent)), ';');
+      if (node is Block && node.parent is BlockFunctionBody) {
+        builder.addSimpleReplacement(
+          utils.getLinesRange(range.node(node.parent)),
+          ';',
+        );
+      }
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
index ca557b5..62037ee 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
@@ -40,8 +40,13 @@
               // The parameter to be removed and the following parameter are not
               // of the same kind, so there is a delimiter between them that we
               // can't delete.
-              builder.addDeletion(
-                  range.startStart(parameter, parameterList.leftDelimiter));
+              var leftDelimiter = parameterList.leftDelimiter;
+              if (leftDelimiter != null) {
+                builder.addDeletion(range.startStart(parameter, leftDelimiter));
+              } else {
+                // Invalid code `C(foo, bar = 1)`.
+                builder.addDeletion(range.startStart(parameter, following));
+              }
             } else {
               // The parameter to be removed and the following parameter are of
               // the same kind, so there is no delimiter between them.
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index b9c3497..332b3f5 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -14,8 +14,11 @@
 
 /// Return true if this [errorCode] is likely to have a fix associated with it.
 bool hasFix(ErrorCode errorCode) =>
-    errorCode == CompileTimeErrorCode.UNDEFINED_CLASS_BOOLEAN ||
+    errorCode == CompileTimeErrorCode.CAST_TO_NON_TYPE ||
     errorCode == CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER ||
+    errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE ||
+    errorCode == CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER ||
+    errorCode == CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION ||
     errorCode == CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR ||
     errorCode ==
         CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE ||
@@ -29,7 +32,7 @@
     errorCode ==
         CompileTimeErrorCode
             .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS ||
-    errorCode == CompileTimeErrorCode.CAST_TO_NON_TYPE ||
+    errorCode == CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT ||
     errorCode == CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME ||
     errorCode == CompileTimeErrorCode.FINAL_NOT_INITIALIZED ||
     errorCode == CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 ||
@@ -44,8 +47,13 @@
     errorCode == CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT ||
     errorCode == CompileTimeErrorCode.PART_OF_NON_PART ||
     errorCode == CompileTimeErrorCode.UNDEFINED_ANNOTATION ||
+    errorCode == CompileTimeErrorCode.UNDEFINED_CLASS_BOOLEAN ||
     errorCode ==
         CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT ||
+    errorCode == CompileTimeErrorCode.UNDEFINED_FUNCTION ||
+    errorCode == CompileTimeErrorCode.UNDEFINED_GETTER ||
+    errorCode == CompileTimeErrorCode.UNDEFINED_METHOD ||
+    errorCode == CompileTimeErrorCode.UNDEFINED_SETTER ||
     errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST ||
     errorCode == CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED ||
     errorCode == HintCode.CAN_BE_NULL_AFTER_NULL_AWARE ||
@@ -60,14 +68,6 @@
     errorCode == ParserErrorCode.EXPECTED_TOKEN ||
     errorCode == ParserErrorCode.GETTER_WITH_PARAMETERS ||
     errorCode == ParserErrorCode.VAR_AS_TYPE_NAME ||
-    errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE ||
-    errorCode == StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER ||
-    errorCode == StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION ||
-    errorCode == StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT ||
-    errorCode == StaticTypeWarningCode.UNDEFINED_FUNCTION ||
-    errorCode == StaticTypeWarningCode.UNDEFINED_GETTER ||
-    errorCode == StaticTypeWarningCode.UNDEFINED_METHOD ||
-    errorCode == StaticTypeWarningCode.UNDEFINED_SETTER ||
     errorCode == CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER ||
     (errorCode is LintCode &&
         (errorCode.name == LintNames.always_require_non_null_named_parameters ||
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 90f10f5..b971b29 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -528,6 +528,9 @@
     CompileTimeErrorCode.NON_TYPE_IN_CATCH_CLAUSE: [
       ImportLibrary.forType,
     ],
+    CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT: [
+      ImportLibrary.forType,
+    ],
     CompileTimeErrorCode.NOT_A_TYPE: [
       ImportLibrary.forType,
     ],
@@ -544,12 +547,25 @@
     CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT: [
       AddSuperConstructorInvocation.newInstance,
     ],
+    CompileTimeErrorCode.UNDEFINED_FUNCTION: [
+      ImportLibrary.forExtension,
+      ImportLibrary.forFunction,
+      ImportLibrary.forType,
+    ],
+    CompileTimeErrorCode.UNDEFINED_GETTER: [
+      ImportLibrary.forTopLevelVariable,
+      ImportLibrary.forType,
+    ],
     CompileTimeErrorCode.UNDEFINED_IDENTIFIER: [
       ImportLibrary.forExtension,
       ImportLibrary.forFunction,
       ImportLibrary.forTopLevelVariable,
       ImportLibrary.forType,
     ],
+    CompileTimeErrorCode.UNDEFINED_METHOD: [
+      ImportLibrary.forFunction,
+      ImportLibrary.forType,
+    ],
     CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
       ChangeArgumentName.newInstance,
     ],
@@ -562,22 +578,6 @@
     HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE: [
       ImportLibrary.dartAsync,
     ],
-    StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT: [
-      ImportLibrary.forType,
-    ],
-    StaticTypeWarningCode.UNDEFINED_FUNCTION: [
-      ImportLibrary.forExtension,
-      ImportLibrary.forFunction,
-      ImportLibrary.forType,
-    ],
-    StaticTypeWarningCode.UNDEFINED_GETTER: [
-      ImportLibrary.forTopLevelVariable,
-      ImportLibrary.forType,
-    ],
-    StaticTypeWarningCode.UNDEFINED_METHOD: [
-      ImportLibrary.forFunction,
-      ImportLibrary.forType,
-    ],
   };
 
   /// A map from error codes to a list of generators used to create the
@@ -651,6 +651,9 @@
     CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS: [
       AddFieldFormalParameters.newInstance,
     ],
+    CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE: [
+      ReplaceReturnTypeFuture.newInstance,
+    ],
     CompileTimeErrorCode.IMPLEMENTS_NON_CLASS: [
       ChangeTo.classOrMixin,
       CreateClass.newInstance,
@@ -658,6 +661,9 @@
     CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD: [
       CreateField.newInstance,
     ],
+    CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER: [
+      ChangeToStaticAccess.newInstance,
+    ],
     CompileTimeErrorCode.INTEGER_LITERAL_IMPRECISE_AS_DOUBLE: [
       ChangeToNearestPreciseValue.newInstance,
     ],
@@ -665,6 +671,13 @@
       ChangeTo.annotation,
       CreateClass.newInstance,
     ],
+    CompileTimeErrorCode.INVALID_ASSIGNMENT: [
+      AddExplicitCast.newInstance,
+      ChangeTypeAnnotation.newInstance,
+    ],
+    CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION: [
+      RemoveParenthesesInGetterInvocation.newInstance,
+    ],
     CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER: [
       AddRequiredKeyword.newInstance,
     ],
@@ -707,6 +720,13 @@
       CreateNoSuchMethod.newInstance,
       MakeClassAbstract.newInstance,
     ],
+    CompileTimeErrorCode.NON_BOOL_CONDITION: [
+      AddNeNull.newInstance,
+    ],
+    CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT: [
+      CreateClass.newInstance,
+      CreateMixin.newInstance,
+    ],
     CompileTimeErrorCode.NOT_A_TYPE: [
       ChangeTo.classOrMixin,
       CreateClass.newInstance,
@@ -756,6 +776,20 @@
       ChangeTo.getterOrSetter,
       CreateSetter.newInstance,
     ],
+    CompileTimeErrorCode.UNDEFINED_FUNCTION: [
+      ChangeTo.function,
+      CreateClass.newInstance,
+      CreateFunction.newInstance,
+    ],
+    CompileTimeErrorCode.UNDEFINED_GETTER: [
+      ChangeTo.getterOrSetter,
+      CreateClass.newInstance,
+      CreateField.newInstance,
+      CreateGetter.newInstance,
+      CreateLocalVariable.newInstance,
+      CreateMethodOrFunction.newInstance,
+      CreateMixin.newInstance,
+    ],
     CompileTimeErrorCode.UNDEFINED_IDENTIFIER: [
       ChangeTo.getterOrSetter,
       CreateClass.newInstance,
@@ -769,11 +803,28 @@
     CompileTimeErrorCode.UNDEFINED_IDENTIFIER_AWAIT: [
       AddAsync.newInstance,
     ],
+    CompileTimeErrorCode.UNDEFINED_METHOD: [
+      ChangeTo.method,
+      CreateClass.newInstance,
+      CreateFunction.newInstance,
+      CreateMethod.method,
+    ],
     CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
       AddMissingParameterNamed.newInstance,
       ConvertFlutterChild.newInstance,
       ConvertFlutterChildren.newInstance,
     ],
+    CompileTimeErrorCode.UNDEFINED_SETTER: [
+      ChangeTo.getterOrSetter,
+      CreateField.newInstance,
+      CreateSetter.newInstance,
+    ],
+    CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER: [
+      // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
+      //  method or setter. The existing _addFix methods would need to be
+      //  updated so that only the appropriate subset is generated.
+      QualifyReference.newInstance,
+    ],
     CompileTimeErrorCode
         .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE: [
       // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
@@ -784,6 +835,10 @@
     CompileTimeErrorCode.URI_DOES_NOT_EXIST: [
       CreateFile.newInstance,
     ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
+      MoveTypeArgumentsToClass.newInstance,
+      RemoveTypeArguments.newInstance,
+    ],
 
     HintCode.CAN_BE_NULL_AFTER_NULL_AWARE: [
       ReplaceWithNullAware.newInstance,
@@ -943,61 +998,6 @@
     ParserErrorCode.VAR_AS_TYPE_NAME: [
       ReplaceVarWithDynamic.newInstance,
     ],
-    StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE: [
-      ReplaceReturnTypeFuture.newInstance,
-    ],
-    StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER: [
-      ChangeToStaticAccess.newInstance,
-    ],
-    StaticTypeWarningCode.INVALID_ASSIGNMENT: [
-      AddExplicitCast.newInstance,
-      ChangeTypeAnnotation.newInstance,
-    ],
-    StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION: [
-      RemoveParenthesesInGetterInvocation.newInstance,
-    ],
-    StaticTypeWarningCode.NON_BOOL_CONDITION: [
-      AddNeNull.newInstance,
-    ],
-    StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT: [
-      CreateClass.newInstance,
-      CreateMixin.newInstance,
-    ],
-    StaticTypeWarningCode.UNDEFINED_FUNCTION: [
-      ChangeTo.function,
-      CreateClass.newInstance,
-      CreateFunction.newInstance,
-    ],
-    StaticTypeWarningCode.UNDEFINED_GETTER: [
-      ChangeTo.getterOrSetter,
-      CreateClass.newInstance,
-      CreateField.newInstance,
-      CreateGetter.newInstance,
-      CreateLocalVariable.newInstance,
-      CreateMethodOrFunction.newInstance,
-      CreateMixin.newInstance,
-    ],
-    StaticTypeWarningCode.UNDEFINED_METHOD: [
-      ChangeTo.method,
-      CreateClass.newInstance,
-      CreateFunction.newInstance,
-      CreateMethod.method,
-    ],
-    StaticTypeWarningCode.UNDEFINED_SETTER: [
-      ChangeTo.getterOrSetter,
-      CreateField.newInstance,
-      CreateSetter.newInstance,
-    ],
-    StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
-      MoveTypeArgumentsToClass.newInstance,
-      RemoveTypeArguments.newInstance,
-    ],
-    StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER: [
-      // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
-      //  method or setter. The existing _addFix methods would need to be
-      //  updated so that only the appropriate subset is generated.
-      QualifyReference.newInstance,
-    ],
     StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION: [
       RemoveDeadIfNull.newInstance,
     ],
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 2311453..5ee0b8a 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -587,7 +587,6 @@
             .relevance));
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/38796')
   Future<void> test_project_suggestionRelevance_constructorsAndTypes() async {
     await addProjectFile('lib/a.dart', r'''
 class A { }
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 51e813f..59af0c1 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -1544,7 +1544,7 @@
   ]);
 
   AnalysisError invalid_assignment_error =
-      AnalysisError(null, 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
+      AnalysisError(null, 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
     ['x'],
     ['y']
   ]);
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 35894eb..d9bd015 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -590,12 +590,15 @@
   }
 
   Future<void> test_invocation_sdk_relevancy_on() {
-    addTestFile('main() {Map m; m.^}');
-    return getSuggestions().then((_) {
-      // Assert that the CommonUsageComputer is working
-      expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
-          isTrue);
-    });
+    if (!server.options.useNewRelevance) {
+      addTestFile('main() {Map m; m.^}');
+      return getSuggestions().then((_) {
+        // Assert that the CommonUsageComputer is working
+        expect(
+            suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
+            isTrue);
+      });
+    }
   }
 
   Future<void> test_invocation_withTrailingStmt() {
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 424b3d0..81f936f 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -70,7 +70,9 @@
       fail('expected $expectationText, but found\n $completions');
     }
     expect(cs.kind, equals(kind));
-    expect(cs.relevance, equals(relevance));
+    if (!server.options.useNewRelevance) {
+      expect(cs.relevance, equals(relevance));
+    }
     expect(cs.selectionOffset, selectionOffset ?? completion.length);
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
index 805b561..8053be5 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
@@ -253,7 +253,57 @@
       testCode.indexOf(' // ref'),
     );
 
-    assertJsonText(results.includedSuggestionRelevanceTags, r'''
+    if (server.options.useNewRelevance) {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+  {
+    "tag": "ElementKind.PREFIX",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+    "relevanceBoost": 1
+  },
+  {
+    "tag": "ElementKind.FUNCTION",
+    "relevanceBoost": 2
+  },
+  {
+    "tag": "ElementKind.METHOD",
+    "relevanceBoost": 4
+  },
+  {
+    "tag": "ElementKind.ENUM",
+    "relevanceBoost": 9
+  },
+  {
+    "tag": "ElementKind.CLASS",
+    "relevanceBoost": 28
+  },
+  {
+    "tag": "ElementKind.LOCAL_VARIABLE",
+    "relevanceBoost": 40
+  },
+  {
+    "tag": "ElementKind.CONSTRUCTOR",
+    "relevanceBoost": 53
+  },
+  {
+    "tag": "ElementKind.FIELD",
+    "relevanceBoost": 68
+  },
+  {
+    "tag": "ElementKind.PARAMETER",
+    "relevanceBoost": 100
+  },
+  {
+    "tag": "package:test/a.dart::MyEnum",
+    "relevanceBoost": 250
+  }
+]
+''');
+    } else {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
 [
   {
     "tag": "package:test/a.dart::MyEnum",
@@ -261,6 +311,7 @@
   }
 ]
 ''');
+    }
   }
 
   Future<void> test_relevanceTags_location_argumentList_named() async {
@@ -277,7 +328,57 @@
       testCode.indexOf('); // ref'),
     );
 
-    assertJsonText(results.includedSuggestionRelevanceTags, r'''
+    if (server.options.useNewRelevance) {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+  {
+    "tag": "ElementKind.PREFIX",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.FUNCTION",
+    "relevanceBoost": 1
+  },
+  {
+    "tag": "ElementKind.METHOD",
+    "relevanceBoost": 1
+  },
+  {
+    "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+    "relevanceBoost": 3
+  },
+  {
+    "tag": "ElementKind.ENUM",
+    "relevanceBoost": 5
+  },
+  {
+    "tag": "ElementKind.CLASS",
+    "relevanceBoost": 20
+  },
+  {
+    "tag": "ElementKind.LOCAL_VARIABLE",
+    "relevanceBoost": 30
+  },
+  {
+    "tag": "ElementKind.FIELD",
+    "relevanceBoost": 41
+  },
+  {
+    "tag": "ElementKind.PARAMETER",
+    "relevanceBoost": 56
+  },
+  {
+    "tag": "ElementKind.CONSTRUCTOR",
+    "relevanceBoost": 100
+  },
+  {
+    "tag": "dart:core::String",
+    "relevanceBoost": 10
+  }
+]
+''');
+    } else {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
 [
   {
     "tag": "dart:core::String",
@@ -285,6 +386,7 @@
   }
 ]
 ''');
+    }
   }
 
   Future<void> test_relevanceTags_location_argumentList_positional() async {
@@ -301,7 +403,65 @@
       testCode.indexOf('); // ref'),
     );
 
-    assertJsonText(results.includedSuggestionRelevanceTags, r'''
+    if (server.options.useNewRelevance) {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+  {
+    "tag": "ElementKind.MIXIN",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.TYPE_PARAMETER",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.PREFIX",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.ENUM",
+    "relevanceBoost": 3
+  },
+  {
+    "tag": "ElementKind.METHOD",
+    "relevanceBoost": 4
+  },
+  {
+    "tag": "ElementKind.FUNCTION",
+    "relevanceBoost": 9
+  },
+  {
+    "tag": "ElementKind.CLASS",
+    "relevanceBoost": 13
+  },
+  {
+    "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+    "relevanceBoost": 18
+  },
+  {
+    "tag": "ElementKind.CONSTRUCTOR",
+    "relevanceBoost": 27
+  },
+  {
+    "tag": "ElementKind.FIELD",
+    "relevanceBoost": 42
+  },
+  {
+    "tag": "ElementKind.LOCAL_VARIABLE",
+    "relevanceBoost": 60
+  },
+  {
+    "tag": "ElementKind.PARAMETER",
+    "relevanceBoost": 100
+  },
+  {
+    "tag": "dart:core::double",
+    "relevanceBoost": 10
+  }
+]
+''');
+    } else {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
 [
   {
     "tag": "dart:core::double",
@@ -309,6 +469,7 @@
   }
 ]
 ''');
+    }
   }
 
   Future<void> test_relevanceTags_location_assignment() async {
@@ -324,7 +485,57 @@
       testCode.indexOf(' // ref'),
     );
 
-    assertJsonText(results.includedSuggestionRelevanceTags, r'''
+    if (server.options.useNewRelevance) {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+  {
+    "tag": "ElementKind.PREFIX",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+    "relevanceBoost": 1
+  },
+  {
+    "tag": "ElementKind.FUNCTION",
+    "relevanceBoost": 2
+  },
+  {
+    "tag": "ElementKind.METHOD",
+    "relevanceBoost": 4
+  },
+  {
+    "tag": "ElementKind.ENUM",
+    "relevanceBoost": 9
+  },
+  {
+    "tag": "ElementKind.CLASS",
+    "relevanceBoost": 28
+  },
+  {
+    "tag": "ElementKind.LOCAL_VARIABLE",
+    "relevanceBoost": 40
+  },
+  {
+    "tag": "ElementKind.CONSTRUCTOR",
+    "relevanceBoost": 53
+  },
+  {
+    "tag": "ElementKind.FIELD",
+    "relevanceBoost": 68
+  },
+  {
+    "tag": "ElementKind.PARAMETER",
+    "relevanceBoost": 100
+  },
+  {
+    "tag": "dart:core::int",
+    "relevanceBoost": 10
+  }
+]
+''');
+    } else {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
 [
   {
     "tag": "dart:core::int",
@@ -332,6 +543,7 @@
   }
 ]
 ''');
+    }
   }
 
   Future<void> test_relevanceTags_location_initializer() async {
@@ -344,7 +556,65 @@
       testCode.indexOf(' // ref'),
     );
 
-    assertJsonText(results.includedSuggestionRelevanceTags, r'''
+    if (server.options.useNewRelevance) {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+  {
+    "tag": "ElementKind.MIXIN",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.TYPE_PARAMETER",
+    "relevanceBoost": 0
+  },
+  {
+    "tag": "ElementKind.PREFIX",
+    "relevanceBoost": 1
+  },
+  {
+    "tag": "ElementKind.ENUM",
+    "relevanceBoost": 1
+  },
+  {
+    "tag": "ElementKind.METHOD",
+    "relevanceBoost": 4
+  },
+  {
+    "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+    "relevanceBoost": 6
+  },
+  {
+    "tag": "ElementKind.FUNCTION",
+    "relevanceBoost": 16
+  },
+  {
+    "tag": "ElementKind.PARAMETER",
+    "relevanceBoost": 26
+  },
+  {
+    "tag": "ElementKind.FIELD",
+    "relevanceBoost": 35
+  },
+  {
+    "tag": "ElementKind.CLASS",
+    "relevanceBoost": 56
+  },
+  {
+    "tag": "ElementKind.LOCAL_VARIABLE",
+    "relevanceBoost": 68
+  },
+  {
+    "tag": "ElementKind.CONSTRUCTOR",
+    "relevanceBoost": 100
+  },
+  {
+    "tag": "dart:core::int",
+    "relevanceBoost": 10
+  }
+]
+''');
+    } else {
+      assertJsonText(results.includedSuggestionRelevanceTags, r'''
 [
   {
     "tag": "dart:core::int",
@@ -352,6 +622,7 @@
   }
 ]
 ''');
+    }
   }
 
   Future<void> test_relevanceTags_location_listLiteral() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
index 1f84c34..cdcb95c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
@@ -64,7 +64,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(A a) {
   B b, b2;
   b = a as B;
@@ -106,7 +106,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(List<A> a) {
   List<B> b, b2;
   b = a.where((e) => e is B).cast<B>().toList();
@@ -148,7 +148,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(Map<A, B> a) {
   Map<B, A> b, b2;
   b = a.cast<B, A>();
@@ -196,7 +196,7 @@
 }
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(A a) {
   B b, b2;
   b = (a..m()) as B;
@@ -240,7 +240,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(Set<A> a) {
   Set<B> b, b2;
   b = a.cast<B>();
@@ -291,7 +291,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(A a) {
   B b = a as B;
   B b2 = a as B;
@@ -329,7 +329,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(List<A> a) {
   List<B> b = a.where((e) => e is B).cast<B>().toList();
   List<B> b2 = a.where((e) => e is B).cast<B>().toList();
@@ -367,7 +367,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(Map<A, B> a) {
   Map<B, A> b = a.cast<B, A>();
   Map<B, A> b2 = a.cast<B, A>();
@@ -411,7 +411,7 @@
 }
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(A a) {
   B b = (a..m()) as B;
   B b2 = (a..m()) as B;
@@ -451,7 +451,7 @@
 class A {}
 class B {}
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
 f(Set<A> a) {
   Set<B> b = a.cast<B>();
   Set<B> b2 = a.cast<B>();
@@ -469,7 +469,7 @@
 ''');
     await assertNoFix(
       errorFilter: (e) {
-        return e.errorCode == StaticTypeWarningCode.INVALID_ASSIGNMENT;
+        return e.errorCode == CompileTimeErrorCode.INVALID_ASSIGNMENT;
       },
     );
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
index 49a5dcf..11b0ee0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
@@ -19,7 +19,7 @@
   @override
   FixKind get kind => DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT;
 
-  Future<void> test_cons_flutter_children() async {
+  Future<void> test_constructor_flutter_children() async {
     addFlutterPackage();
     addMetaPackage();
     await resolveTestUnit('''
@@ -48,7 +48,7 @@
 ''');
   }
 
-  Future<void> test_cons_flutter_hasTrailingComma() async {
+  Future<void> test_constructor_flutter_hasTrailingComma() async {
     addFlutterPackage();
     addMetaPackage();
     await resolveTestUnit('''
@@ -77,7 +77,35 @@
 ''');
   }
 
-  Future<void> test_cons_single() async {
+  Future<void> test_constructor_named() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+class A {
+  A.named({@required int a}) {}
+}
+
+void f() {
+  A a = new A.named();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+class A {
+  A.named({@required int a}) {}
+}
+
+void f() {
+  A a = new A.named(a: null);
+  print(a);
+}
+''');
+  }
+
+  Future<void> test_constructor_single() async {
     addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
@@ -104,7 +132,7 @@
 ''');
   }
 
-  Future<void> test_cons_single_closure() async {
+  Future<void> test_constructor_single_closure() async {
     addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
@@ -133,7 +161,7 @@
 ''');
   }
 
-  Future<void> test_cons_single_closure_2() async {
+  Future<void> test_constructor_single_closure2() async {
     addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
@@ -162,7 +190,7 @@
 ''');
   }
 
-  Future<void> test_cons_single_closure_3() async {
+  Future<void> test_constructor_single_closure3() async {
     addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
@@ -191,7 +219,7 @@
 ''');
   }
 
-  Future<void> test_cons_single_closure_4() async {
+  Future<void> test_constructor_single_closure4() async {
     addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
@@ -220,7 +248,7 @@
 ''');
   }
 
-  Future<void> test_cons_single_list() async {
+  Future<void> test_constructor_single_list() async {
     addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
index a844e27..657adcc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
@@ -48,7 +48,7 @@
   }
 }
 ''');
-    await assertHasFixAllFix(StaticTypeWarningCode.NON_BOOL_CONDITION, '''
+    await assertHasFixAllFix(CompileTimeErrorCode.NON_BOOL_CONDITION, '''
 main(String p, String q) {
   if (p != null) {
     print(p);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart
new file mode 100644
index 0000000..5e7445b
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart
@@ -0,0 +1,41 @@
+// 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/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToContainsTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToContainsTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.prefer_contains;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+bool f(List<int> list, int value) {
+  return -1 != list.indexOf(value);
+}
+
+bool f2(List<int> list, int value) {
+  return 0 > list.indexOf(value);
+}
+''');
+    await assertHasFix('''
+bool f(List<int> list, int value) {
+  return list.contains(value);
+}
+
+bool f2(List<int> list, int value) {
+  return !list.contains(value);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart
new file mode 100644
index 0000000..d246cd8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart
@@ -0,0 +1,41 @@
+// 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/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveArgumentTest);
+  });
+}
+
+@reflectiveTest
+class RemoveArgumentTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.avoid_redundant_argument_values;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+void f({bool valWithDefault = true, bool val}) {}
+void f2({bool valWithDefault = true, bool val}) {}
+
+void main() {
+  f(valWithDefault: true);
+  f2(valWithDefault: true, val: false);
+}
+''');
+    await assertHasFix('''
+void f({bool valWithDefault = true, bool val}) {}
+void f2({bool valWithDefault = true, bool val}) {}
+
+void main() {
+  f();
+  f2(val: false);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart
new file mode 100644
index 0000000..faf94fc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart
@@ -0,0 +1,50 @@
+// 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/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveUnnecessaryElseTest);
+  });
+}
+
+@reflectiveTest
+class RemoveUnnecessaryElseTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.avoid_empty_else;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+void f(bool cond) {
+  if (cond) {
+    //
+  }
+  else ;
+}
+
+void f2(bool cond) {
+  if (cond) {
+    //
+  } else ;
+}
+''');
+    await assertHasFix('''
+void f(bool cond) {
+  if (cond) {
+    //
+  }
+}
+
+void f2(bool cond) {
+  if (cond) {
+    //
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart
new file mode 100644
index 0000000..446ec84
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart
@@ -0,0 +1,41 @@
+// 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/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveInitializerTest);
+  });
+}
+
+@reflectiveTest
+class RemoveInitializerTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.avoid_init_to_null;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+class T {
+  int x = null;
+}
+
+class T2 {
+  int x = null;
+}
+''');
+    await assertHasFix('''
+class T {
+  int x;
+}
+
+class T2 {
+  int x;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
new file mode 100644
index 0000000..55d013f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
@@ -0,0 +1,77 @@
+// 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/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveDynamicTypeAnnotationTest);
+    defineReflectiveTests(RemoveSetterReturnTypeAnnotationTest);
+    defineReflectiveTests(RemoveTypeAnnotationOnClosureParamsTest);
+  });
+}
+
+@reflectiveTest
+class RemoveDynamicTypeAnnotationTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.avoid_annotating_with_dynamic;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+f(void foo(dynamic x)) {
+  return null;
+}
+
+f2({dynamic defaultValue}) {
+  return null;
+}
+''');
+    await assertHasFix('''
+f(void foo(x)) {
+  return null;
+}
+
+f2({defaultValue}) {
+  return null;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class RemoveSetterReturnTypeAnnotationTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.avoid_return_types_on_setters;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+void set s(int s) {}
+void set s2(int s2) {}
+''');
+    await assertHasFix('''
+set s(int s) {}
+set s2(int s2) {}
+''');
+  }
+}
+
+@reflectiveTest
+class RemoveTypeAnnotationOnClosureParamsTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.avoid_types_on_closure_parameters;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+var x = ({Future<int> defaultValue}) => null;
+var y = (Future<int> defaultValue) => null;
+''');
+    await assertHasFix('''
+var x = ({defaultValue}) => null;
+var y = (defaultValue) => null;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 77d9e26..e2f2972 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -7,6 +7,11 @@
 import 'add_override_test.dart' as add_override;
 import 'convert_documentation_into_line_test.dart'
     as convert_documentation_into_line;
+import 'convert_to_contains_test.dart' as convert_to_contains;
+import 'remove_argument_test.dart' as remove_argument;
+import 'remove_empty_else_test.dart' as remove_empty_else;
+import 'remove_initializer_test.dart' as remove_initializer;
+import 'remove_type_annotation_test.dart' as remove_type_annotation;
 import 'remove_unnecessary_const_test.dart' as remove_unnecessary_const;
 import 'remove_unnecessary_new_test.dart' as remove_unnecessary_new;
 import 'replace_colon_with_equals_test.dart' as replace_colon_with_equals;
@@ -15,6 +20,11 @@
   defineReflectiveSuite(() {
     add_override.main();
     convert_documentation_into_line.main();
+    convert_to_contains.main();
+    remove_argument.main();
+    remove_initializer.main();
+    remove_empty_else.main();
+    remove_type_annotation.main();
     remove_unnecessary_const.main();
     remove_unnecessary_new.main();
     replace_colon_with_equals.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
index b9f2735..91c2321 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
@@ -78,7 +78,7 @@
 ''');
     await assertNoFix(
       errorFilter: (e) {
-        return e.errorCode == StaticTypeWarningCode.INVALID_ASSIGNMENT;
+        return e.errorCode == CompileTimeErrorCode.INVALID_ASSIGNMENT;
       },
     );
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
index eec3b63..df32308 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
@@ -379,7 +379,7 @@
 }
 ''');
     await assertNoFix(errorFilter: (e) {
-      return e.errorCode == StaticTypeWarningCode.UNDEFINED_GETTER;
+      return e.errorCode == CompileTimeErrorCode.UNDEFINED_GETTER;
     });
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
index b3e1fe2..c8797e3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
@@ -322,7 +322,7 @@
 }
 ''');
     await assertNoFix(errorFilter: (e) {
-      return e.errorCode == StaticTypeWarningCode.UNDEFINED_GETTER;
+      return e.errorCode == CompileTimeErrorCode.UNDEFINED_GETTER;
     });
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
index 5dc1260..1a984bf 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
@@ -316,7 +316,7 @@
 }
 ''');
     await assertNoFix(errorFilter: (e) {
-      return e.errorCode == StaticTypeWarningCode.UNDEFINED_SETTER;
+      return e.errorCode == CompileTimeErrorCode.UNDEFINED_SETTER;
     });
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
index 3a1a413..6f1bb5e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -35,4 +36,16 @@
 }
 ''');
   }
+
+  Future<void> test_incompleteComment() async {
+    await resolveTestUnit(r'''
+class A {
+  A() {/*
+''');
+    await assertNoFix(errorFilter: _isInterestingError);
+  }
+
+  static bool _isInterestingError(AnalysisError e) {
+    return e.errorCode.name == LintNames.empty_constructor_bodies;
+  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
index 30937b9..3d8e7ef 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
@@ -53,6 +53,19 @@
 ''');
   }
 
+  Future<void> test_first_required_second_optionalInvalid() async {
+    await resolveTestUnit('''
+class C {
+  C(int a, int b = 1,);
+}
+''');
+    await assertHasFix('''
+class C {
+  C(int b = 1,);
+}
+''', errorFilter: (e) => e.offset == 14);
+  }
+
   Future<void> test_first_requiredPositional_second_optionalNamed() async {
     await resolveTestUnit('''
 class C {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
index aa333d5..e40a0b2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
@@ -29,7 +29,7 @@
 import 'dart:async';
 var v;Future<int> main() async => 0;
 ''', errorFilter: (error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
   }
 
@@ -53,7 +53,7 @@
 Future<List<int>> main() async {
 }
 ''', errorFilter: (error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
   }
 
@@ -69,7 +69,7 @@
 Future<List<int>> main() async {
 }
 ''', errorFilter: (error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
   }
 
@@ -84,7 +84,7 @@
 al.Future<int> main() async {
 }
 ''', errorFilter: (error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
   }
 
@@ -97,7 +97,7 @@
 import 'dart:async';
 Future<int> main() async => 0;
 ''', errorFilter: (error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
   }
 
@@ -111,7 +111,7 @@
 
 Future<int> main() async => 0;
 ''', errorFilter: (error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
   }
 
@@ -128,7 +128,7 @@
 Future<int> main() async {
 }
 ''', errorFilter: (error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
   }
 
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 5956889..bf78d64 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -98,7 +98,7 @@
 
   /// Initialize a newly created visitor to use each of the given delegate
   /// visitors to visit the nodes of an AST structure.
-  DelegatingAstVisitor(this.delegates);
+  const DelegatingAstVisitor(this.delegates);
 
   @override
   T visitNode(AstNode node) {
@@ -128,6 +128,9 @@
 ///
 /// Clients may extend this class.
 class GeneralizingAstVisitor<R> implements AstVisitor<R> {
+  /// Initialize a newly created visitor.
+  const GeneralizingAstVisitor();
+
   @override
   R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
 
@@ -606,6 +609,9 @@
 ///
 /// Clients may extend this class.
 class RecursiveAstVisitor<R> implements AstVisitor<R> {
+  /// Initialize a newly created visitor.
+  const RecursiveAstVisitor();
+
   @override
   R visitAdjacentStrings(AdjacentStrings node) {
     node.visitChildren(this);
@@ -1341,6 +1347,9 @@
 ///
 /// Clients may extend this class.
 class SimpleAstVisitor<R> implements AstVisitor<R> {
+  /// Initialize a newly created visitor.
+  const SimpleAstVisitor();
+
   @override
   R visitAdjacentStrings(AdjacentStrings node) => null;
 
@@ -1719,6 +1728,9 @@
 ///
 /// Clients may extend this class.
 class ThrowingAstVisitor<R> implements AstVisitor<R> {
+  /// Initialize a newly created visitor.
+  const ThrowingAstVisitor();
+
   @override
   R visitAdjacentStrings(AdjacentStrings node) => _throw(node);
 
@@ -3097,6 +3109,9 @@
 ///
 /// Clients may extend this class.
 class UnifyingAstVisitor<R> implements AstVisitor<R> {
+  /// Initialize a newly created visitor.
+  const UnifyingAstVisitor();
+
   @override
   R visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
 
diff --git a/pkg/analyzer/lib/dart/element/visitor.dart b/pkg/analyzer/lib/dart/element/visitor.dart
index 3119637..70552ed 100644
--- a/pkg/analyzer/lib/dart/element/visitor.dart
+++ b/pkg/analyzer/lib/dart/element/visitor.dart
@@ -79,6 +79,9 @@
 ///
 /// Clients may extend this class.
 class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
+  /// Initialize a newly created visitor.
+  const GeneralizingElementVisitor();
+
   @override
   R visitClassElement(ClassElement element) => visitElement(element);
 
@@ -191,6 +194,9 @@
 ///
 /// Clients may extend this class.
 class RecursiveElementVisitor<R> implements ElementVisitor<R> {
+  /// Initialize a newly created visitor.
+  const RecursiveElementVisitor();
+
   @override
   R visitClassElement(ClassElement element) {
     element.visitChildren(this);
@@ -325,6 +331,9 @@
 ///
 /// Clients may extend this class.
 class SimpleElementVisitor<R> implements ElementVisitor<R> {
+  /// Initialize a newly created visitor.
+  const SimpleElementVisitor();
+
   @override
   R visitClassElement(ClassElement element) => null;
 
@@ -398,6 +407,9 @@
 ///
 /// Clients may extend this class.
 class ThrowingElementVisitor<R> implements ElementVisitor<R> {
+  /// Initialize a newly created visitor.
+  const ThrowingElementVisitor();
+
   @override
   R visitClassElement(ClassElement element) => _throw(element);
 
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index e281f0d..c0096fc 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -61,7 +61,6 @@
   AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES,
   AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
   CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
-  CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
   CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
   CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
   CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
@@ -107,6 +106,7 @@
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_EXTENSION,
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS,
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_EXTENSION,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
@@ -154,6 +154,9 @@
   CompileTimeErrorCode.ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING,
   CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET,
   CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP,
+  CompileTimeErrorCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
+  CompileTimeErrorCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS,
+  CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
   CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
   CompileTimeErrorCode.EXPORT_LEGACY_SYMBOL,
   CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
@@ -184,6 +187,8 @@
   CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
   CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2,
   CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS,
+  CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
+  CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
   CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE,
   CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
   CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
@@ -191,6 +196,7 @@
   CompileTimeErrorCode.GETTER_NOT_SUBTYPE_SETTER_TYPES,
   CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
+  CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE,
   CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
   CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
   CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
@@ -208,6 +214,7 @@
   CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
   CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
   CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+  CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
   CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
   CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC,
   CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS,
@@ -217,6 +224,7 @@
   CompileTimeErrorCode.INVALID_ANNOTATION,
   CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.INVALID_ANNOTATION_GETTER,
+  CompileTimeErrorCode.INVALID_ASSIGNMENT,
   CompileTimeErrorCode.INVALID_CAST_FUNCTION,
   CompileTimeErrorCode.INVALID_CAST_FUNCTION_EXPR,
   CompileTimeErrorCode.INVALID_CAST_LITERAL,
@@ -242,6 +250,8 @@
   CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
   CompileTimeErrorCode.INVALID_USE_OF_NULL_VALUE,
   CompileTimeErrorCode.INVOCATION_OF_EXTENSION_WITHOUT_CALL,
+  CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION,
+  CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
   CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
   CompileTimeErrorCode.LABEL_UNDEFINED,
   CompileTimeErrorCode.LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR,
@@ -283,11 +293,16 @@
   CompileTimeErrorCode.NO_COMBINED_SUPER_SIGNATURE,
   CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
   CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+  CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS,
   CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
   CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
   CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
   CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
   CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+  CompileTimeErrorCode.NON_BOOL_CONDITION,
+  CompileTimeErrorCode.NON_BOOL_EXPRESSION,
+  CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION,
+  CompileTimeErrorCode.NON_BOOL_OPERAND,
   CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
   CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR,
   CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION,
@@ -303,7 +318,9 @@
   CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT,
   CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
+  CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR,
   CompileTimeErrorCode.NON_SYNC_FACTORY,
+  CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT,
   CompileTimeErrorCode.NON_TYPE_IN_CATCH_CLAUSE,
   CompileTimeErrorCode.NON_VOID_RETURN_FOR_OPERATOR,
   CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER,
@@ -353,6 +370,10 @@
   CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH,
   CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR,
   CompileTimeErrorCode.RETURN_IN_GENERATOR,
+  CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+  CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
+  CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
+  CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
   CompileTimeErrorCode.RETURN_WITHOUT_VALUE,
   CompileTimeErrorCode.SET_ELEMENT_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
@@ -371,6 +392,7 @@
   CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS,
   CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
   CompileTimeErrorCode.TYPE_PARAMETER_REFERENCED_BY_STATIC,
+  CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
   CompileTimeErrorCode.TYPE_TEST_WITH_NON_TYPE,
   CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME,
   CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE,
@@ -379,13 +401,25 @@
   CompileTimeErrorCode.UNDEFINED_CLASS_BOOLEAN,
   CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
   CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+  CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT,
   CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER,
   CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD,
   CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
   CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER,
+  CompileTimeErrorCode.UNDEFINED_FUNCTION,
+  CompileTimeErrorCode.UNDEFINED_GETTER,
   CompileTimeErrorCode.UNDEFINED_IDENTIFIER,
   CompileTimeErrorCode.UNDEFINED_IDENTIFIER_AWAIT,
+  CompileTimeErrorCode.UNDEFINED_METHOD,
   CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER,
+  CompileTimeErrorCode.UNDEFINED_OPERATOR,
+  CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME,
+  CompileTimeErrorCode.UNDEFINED_SETTER,
+  CompileTimeErrorCode.UNDEFINED_SUPER_GETTER,
+  CompileTimeErrorCode.UNDEFINED_SUPER_METHOD,
+  CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
+  CompileTimeErrorCode.UNDEFINED_SUPER_SETTER,
+  CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
   CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
   CompileTimeErrorCode.URI_DOES_NOT_EXIST,
   CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED,
@@ -395,10 +429,14 @@
   CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
   CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
   CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
+  CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
+  CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+  CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
   CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
   CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION,
   CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR,
   CompileTimeErrorCode.YIELD_IN_NON_GENERATOR,
+  CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
   FfiCode.ANNOTATION_ON_POINTER_FIELD,
   FfiCode.EXTRA_ANNOTATION_ON_STRUCT_FIELD,
   FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER,
@@ -748,42 +786,6 @@
   ScannerErrorCode.UNSUPPORTED_OPERATOR,
   ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT,
   ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-  StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
-  StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS,
-  StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
-  StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
-  StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
-  StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
-  StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
-  StaticTypeWarningCode.INVALID_ASSIGNMENT,
-  StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
-  StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
-  StaticTypeWarningCode.NON_BOOL_CONDITION,
-  StaticTypeWarningCode.NON_BOOL_EXPRESSION,
-  StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION,
-  StaticTypeWarningCode.NON_BOOL_OPERAND,
-  StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
-  StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
-  StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
-  StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
-  StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
-  StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
-  StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT,
-  StaticTypeWarningCode.UNDEFINED_FUNCTION,
-  StaticTypeWarningCode.UNDEFINED_GETTER,
-  StaticTypeWarningCode.UNDEFINED_METHOD,
-  StaticTypeWarningCode.UNDEFINED_OPERATOR,
-  StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME,
-  StaticTypeWarningCode.UNDEFINED_SETTER,
-  StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
-  StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
-  StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
-  StaticTypeWarningCode.UNDEFINED_SUPER_SETTER,
-  StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
-  StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
-  StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
-  StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
-  StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
   StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION,
   StaticWarningCode.INVALID_NULL_AWARE_OPERATOR,
   StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 085bacb..d09c2fe 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -22,6 +22,7 @@
   EnableString.set_literals: ExperimentalFeatures.set_literals,
   EnableString.spread_collections: ExperimentalFeatures.spread_collections,
   EnableString.triple_shift: ExperimentalFeatures.triple_shift,
+  EnableString.value_class: ExperimentalFeatures.value_class,
   EnableString.variance: ExperimentalFeatures.variance,
 };
 
@@ -34,6 +35,7 @@
       true, // set-literals
       true, // spread-collections
       IsEnabledByDefault.triple_shift,
+      IsEnabledByDefault.value_class,
       IsEnabledByDefault.variance,
     ];
 
@@ -64,6 +66,9 @@
   /// String to enable the experiment "triple-shift"
   static const String triple_shift = 'triple-shift';
 
+  /// String to enable the experiment "value-class"
+  static const String value_class = 'value-class';
+
   /// String to enable the experiment "variance"
   static const String variance = 'variance';
 }
@@ -141,8 +146,17 @@
     firstSupportedVersion: null,
   );
 
-  static const variance = ExperimentalFeature(
+  static const value_class = ExperimentalFeature(
     index: 8,
+    enableString: EnableString.value_class,
+    isEnabledByDefault: IsEnabledByDefault.value_class,
+    isExpired: IsExpired.value_class,
+    documentation: 'Value class',
+    firstSupportedVersion: null,
+  );
+
+  static const variance = ExperimentalFeature(
+    index: 9,
     enableString: EnableString.variance,
     isEnabledByDefault: IsEnabledByDefault.variance,
     isExpired: IsExpired.variance,
@@ -178,6 +192,9 @@
   /// Default state of the experiment "triple-shift"
   static const bool triple_shift = false;
 
+  /// Default state of the experiment "value-class"
+  static const bool value_class = false;
+
   /// Default state of the experiment "variance"
   static const bool variance = false;
 }
@@ -210,6 +227,9 @@
   /// Expiration status of the experiment "triple-shift"
   static const bool triple_shift = false;
 
+  /// Expiration status of the experiment "value-class"
+  static const bool value_class = false;
+
   /// Expiration status of the experiment "variance"
   static const bool variance = false;
 }
@@ -244,6 +264,9 @@
   /// Current state for the flag "triple-shift"
   bool get triple_shift => isEnabled(ExperimentalFeatures.triple_shift);
 
+  /// Current state for the flag "value-class"
+  bool get value_class => isEnabled(ExperimentalFeatures.value_class);
+
   /// Current state for the flag "variance"
   bool get variance => isEnabled(ExperimentalFeatures.variance);
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index b60196a..a60d615 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -200,37 +200,41 @@
   void _checkForInconsistentLanguageVersionOverride(
     Map<FileState, CompilationUnit> units,
   ) {
-    var libraryUnit = units.values.first;
+    var libraryEntry = units.entries.first;
+    var libraryUnit = libraryEntry.value;
     var libraryOverrideToken = libraryUnit.languageVersionToken;
 
-    for (var partEntry in units.entries.skip(1)) {
-      var partUnit = partEntry.value;
-      var partOverrideToken = partUnit.languageVersionToken;
-      if (libraryOverrideToken != null) {
-        if (partOverrideToken != null) {
-          if (partOverrideToken.major != libraryOverrideToken.major ||
-              partOverrideToken.minor != libraryOverrideToken.minor) {
-            _getErrorReporter(partEntry.key).reportErrorForToken(
-              CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
-              partOverrideToken,
-            );
+    var elementToUnit = <CompilationUnitElement, CompilationUnit>{};
+    for (var entry in units.entries) {
+      var unit = entry.value;
+      elementToUnit[unit.declaredElement] = unit;
+    }
+
+    for (var directive in libraryUnit.directives) {
+      if (directive is PartDirective) {
+        var partUnit = elementToUnit[directive.uriElement];
+        if (partUnit != null) {
+          var shouldReport = false;
+          var partOverrideToken = partUnit.languageVersionToken;
+          if (libraryOverrideToken != null) {
+            if (partOverrideToken != null) {
+              if (partOverrideToken.major != libraryOverrideToken.major ||
+                  partOverrideToken.minor != libraryOverrideToken.minor) {
+                shouldReport = true;
+              }
+            } else {
+              shouldReport = true;
+            }
+          } else if (partOverrideToken != null) {
+            shouldReport = true;
           }
-        } else {
-          var partDirectives = partUnit.directives;
-          for (var partOf in partDirectives.whereType<PartOfDirective>()) {
-            var partOffset = partOf.partKeyword.offset;
-            _getErrorReporter(partEntry.key).reportErrorForOffset(
+          if (shouldReport) {
+            _getErrorReporter(_library).reportErrorForNode(
               CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
-              partOffset,
-              partOf.ofKeyword.end - partOffset,
+              directive.uri,
             );
           }
         }
-      } else if (partOverrideToken != null) {
-        _getErrorReporter(partEntry.key).reportErrorForToken(
-          CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
-          partOverrideToken,
-        );
       }
     }
   }
@@ -442,8 +446,8 @@
         // non-internal code from importing internal code.
         bool privileged = false;
 
-        if (code == StaticTypeWarningCode.UNDEFINED_FUNCTION ||
-            code == StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME) {
+        if (code == CompileTimeErrorCode.UNDEFINED_FUNCTION ||
+            code == CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME) {
           // Special case a small number of errors in Flutter code which are
           // ignored. The erroneous code is found in a conditionally imported
           // library, which uses a special version of the "dart:ui" library
@@ -555,7 +559,7 @@
 
     LineInfo lineInfo = unit.lineInfo;
     _fileToLineInfo[file] = lineInfo;
-    _fileToIgnoreInfo[file] = IgnoreInfo.calculateIgnores(content, lineInfo);
+    _fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
 
     return unit;
   }
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index db95be9..7db09b6 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -370,10 +370,8 @@
               dataErrorCode,
               CheckedModeCompileTimeErrorCode
                   .CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH) ||
-          identical(
-              dataErrorCode,
-              CheckedModeCompileTimeErrorCode
-                  .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH) ||
+          identical(dataErrorCode,
+              CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH) ||
           identical(dataErrorCode,
               CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH)) {
         _errorReporter.reportError(data);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 2509b5f..d844664 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -229,7 +229,7 @@
         if (dartObject != null && constant.isConst) {
           if (!runtimeTypeMatch(dartObject, constant.type)) {
             // TODO(brianwilkerson) This should not be reported if
-            //  StaticTypeWarningCode.INVALID_ASSIGNMENT has already been
+            //  CompileTimeErrorCode.INVALID_ASSIGNMENT has already been
             //  reported (that is, if the static types are also wrong).
             errorReporter.reportErrorForNode(
                 CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
@@ -621,8 +621,7 @@
       if (argumentValue != null) {
         if (!runtimeTypeMatch(argumentValue, parameter.type)) {
           errorReporter.reportErrorForNode(
-              CheckedModeCompileTimeErrorCode
-                  .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+              CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
               errorTarget,
               [argumentValue.type, parameter.type]);
         }
@@ -636,8 +635,7 @@
               // the field.
               if (!runtimeTypeMatch(argumentValue, fieldType)) {
                 errorReporter.reportErrorForNode(
-                    CheckedModeCompileTimeErrorCode
-                        .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+                    CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
                     errorTarget,
                     [argumentValue.type, fieldType]);
               }
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index c3720e9..c713b70 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -115,6 +115,11 @@
     return false;
   }
 
+  InstantiatedClass mapArguments(DartType Function(DartType) f) {
+    var mappedArguments = arguments.map(f).toList();
+    return InstantiatedClass(element, mappedArguments);
+  }
+
   @override
   String toString() {
     var buffer = StringBuffer();
@@ -232,6 +237,20 @@
     return result.withNullability(nullability);
   }
 
+  /// Return all of the superinterfaces of the given [type].
+  @visibleForTesting
+  Set<InstantiatedClass> computeSuperinterfaceSet(InstantiatedClass type) {
+    var result = <InstantiatedClass>{};
+    _addSuperinterfaces(result, type);
+    if (typeSystem.isNonNullableByDefault) {
+      return result;
+    } else {
+      return result.map((e) {
+        return e.mapArguments(typeSystem.toLegacyType);
+      }).toSet();
+    }
+  }
+
   /// Compute the least upper bound of types [i] and [j], both of which are
   /// known to be interface types.
   ///
@@ -265,15 +284,6 @@
     );
   }
 
-  /// Return all of the superinterfaces of the given [type].
-  @visibleForTesting
-  static Set<InstantiatedClass> computeSuperinterfaceSet(
-      InstantiatedClass type) {
-    var result = <InstantiatedClass>{};
-    _addSuperinterfaces(result, type);
-    return result;
-  }
-
   /// Add all of the superinterfaces of the given [type] to the given [set].
   static void _addSuperinterfaces(
       Set<InstantiatedClass> set, InstantiatedClass type) {
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 790541d..ac55764 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -531,7 +531,7 @@
 
     LineInfo lineInfo = unit.lineInfo;
     _fileToLineInfo[file] = lineInfo;
-    _fileToIgnoreInfo[file] = IgnoreInfo.calculateIgnores(content, lineInfo);
+    _fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
 
     return unit;
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 165da43..e558b4d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -223,7 +223,7 @@
         node.staticElement = result.getter;
         if (_shouldReportInvalidMember(staticType, result)) {
           _errorReporter.reportErrorForToken(
-            StaticTypeWarningCode.UNDEFINED_OPERATOR,
+            CompileTimeErrorCode.UNDEFINED_OPERATOR,
             operator,
             [methodName, staticType],
           );
@@ -281,7 +281,7 @@
       var leftWriteType = _getStaticType2(node.leftHandSide);
       if (!_typeSystem.isAssignableTo2(type, leftWriteType)) {
         _resolver.errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.INVALID_ASSIGNMENT,
+          CompileTimeErrorCode.INVALID_ASSIGNMENT,
           node.rightHandSide,
           [type, leftWriteType],
         );
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index aeff38b..b4bb472 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -65,7 +65,7 @@
           var typeArguments = node.typeArguments;
           if (typeArguments != null) {
             _errorReporter.reportErrorForNode(
-                StaticTypeWarningCode
+                CompileTimeErrorCode
                     .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
                 typeArguments,
                 [element.name, constructorElement.name]);
@@ -122,7 +122,7 @@
             var typeArguments = node.typeArguments;
             if (typeArguments != null) {
               _errorReporter.reportErrorForNode(
-                  StaticTypeWarningCode
+                  CompileTimeErrorCode
                       .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
                   typeArguments,
                   [element.name, constructorElement.name]);
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 818e4c5..8486729 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -102,7 +102,7 @@
   void _checkNonBoolOperand(Expression operand, String operator) {
     _resolver.boolExpressionVerifier.checkForNonBoolExpression(
       operand,
-      errorCode: StaticTypeWarningCode.NON_BOOL_OPERAND,
+      errorCode: CompileTimeErrorCode.NON_BOOL_OPERAND,
       arguments: [operator],
     );
   }
@@ -335,13 +335,13 @@
     if (_shouldReportInvalidMember(leftType, result)) {
       if (leftOperand is SuperExpression) {
         _errorReporter.reportErrorForToken(
-          StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+          CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
           node.operator,
           [methodName, leftType],
         );
       } else {
         _errorReporter.reportErrorForToken(
-          StaticTypeWarningCode.UNDEFINED_OPERATOR,
+          CompileTimeErrorCode.UNDEFINED_OPERATOR,
           node.operator,
           [methodName, leftType],
         );
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index cc18f5e..d6f416c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -406,7 +406,7 @@
     List<DartType> typeArguments;
     if (typeArgumentList.arguments.length != typeParameters.length) {
       _errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+        CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
         typeArgumentList,
         [
           rawType,
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index ceb24d4..65fc8ab 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -97,7 +97,7 @@
     if (receiver is SimpleIdentifier) {
       var receiverElement = receiver.staticElement;
       if (receiverElement is PrefixElement) {
-        _resolveReceiverPrefix(node, receiver, receiverElement, nameNode, name);
+        _resolveReceiverPrefix(node, receiverElement, nameNode, name);
         return;
       }
     }
@@ -190,13 +190,13 @@
       );
     } else if (nullReceiver) {
       _resolver.errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+        CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
         nameNode,
         [element.enclosingElement.displayName],
       );
     } else {
       _resolver.errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+        CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
         nameNode,
         [
           nameNode.name,
@@ -210,7 +210,7 @@
   void _reportInvocationOfNonFunction(MethodInvocation node) {
     _setDynamicResolution(node, setNameTypeToDynamic: false);
     _resolver.errorReporter.reportErrorForNode(
-      StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+      CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION,
       node.methodName,
       [node.methodName.name],
     );
@@ -236,16 +236,18 @@
   }
 
   void _reportUndefinedFunction(
-      MethodInvocation node, Identifier ignorableIdentifier) {
+    MethodInvocation node, {
+    @required String prefix,
+    @required String name,
+  }) {
     _setDynamicResolution(node);
 
-    // TODO(scheglov) This is duplication.
-    if (nameScope.shouldIgnoreUndefined(ignorableIdentifier)) {
+    if (nameScope.shouldIgnoreUndefined2(prefix: prefix, name: name)) {
       return;
     }
 
     _resolver.errorReporter.reportErrorForNode(
-      StaticTypeWarningCode.UNDEFINED_FUNCTION,
+      CompileTimeErrorCode.UNDEFINED_FUNCTION,
       node.methodName,
       [node.methodName.name],
     );
@@ -255,7 +257,7 @@
       MethodInvocation node, String name, ClassElement typeReference) {
     _setDynamicResolution(node);
     _resolver.errorReporter.reportErrorForNode(
-      StaticTypeWarningCode.UNDEFINED_METHOD,
+      CompileTimeErrorCode.UNDEFINED_METHOD,
       node.methodName,
       [name, typeReference.displayName],
     );
@@ -513,7 +515,11 @@
     } else if (_resolver.enclosingExtension != null) {
       receiverType = _resolver.enclosingExtension.extendedType;
     } else {
-      return _reportUndefinedFunction(node, node.methodName);
+      return _reportUndefinedFunction(
+        node,
+        prefix: null,
+        name: node.methodName.name,
+      );
     }
 
     _resolveReceiverType(
@@ -526,8 +532,8 @@
     );
   }
 
-  void _resolveReceiverPrefix(MethodInvocation node, SimpleIdentifier receiver,
-      PrefixElement prefix, SimpleIdentifier nameNode, String name) {
+  void _resolveReceiverPrefix(MethodInvocation node, PrefixElement prefix,
+      SimpleIdentifier nameNode, String name) {
     // Note: prefix?.bar is reported as an error in ElementResolver.
 
     if (name == FunctionElement.LOAD_LIBRARY_NAME) {
@@ -543,9 +549,6 @@
       }
     }
 
-    // TODO(scheglov) I don't like how we resolve prefixed names.
-    // But maybe this is the only one solution.
-    var prefixedName = PrefixedIdentifierImpl.temp(receiver, nameNode);
     var element = prefix.scope.lookup2(name).getter;
     element = _resolver.toLegacyElement(element);
     nameNode.staticElement = element;
@@ -563,7 +566,11 @@
       return _setResolution(node, element.type);
     }
 
-    _reportUndefinedFunction(node, prefixedName);
+    _reportUndefinedFunction(
+      node,
+      prefix: prefix.name,
+      name: name,
+    );
   }
 
   void _resolveReceiverSuper(MethodInvocation node, SuperExpression receiver,
@@ -609,7 +616,7 @@
     // Nothing help, there is no target at all.
     _setDynamicResolution(node);
     _resolver.errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
+        CompileTimeErrorCode.UNDEFINED_SUPER_METHOD,
         nameNode,
         [name, enclosingClass.displayName]);
   }
@@ -664,7 +671,7 @@
 
     if (!nameNode.isSynthetic) {
       _resolver.errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.UNDEFINED_METHOD,
+        CompileTimeErrorCode.UNDEFINED_METHOD,
         nameNode,
         [name, receiverClassName],
       );
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index 43b20e7..e3f3cc0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -73,7 +73,7 @@
     var operandWriteType = _getWriteType(operand);
     if (!_typeSystem.isAssignableTo2(type, operandWriteType)) {
       _resolver.errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.INVALID_ASSIGNMENT,
+        CompileTimeErrorCode.INVALID_ASSIGNMENT,
         node,
         [type, operandWriteType],
       );
@@ -149,13 +149,13 @@
     if (_shouldReportInvalidMember(receiverType, result)) {
       if (operand is SuperExpression) {
         _errorReporter.reportErrorForToken(
-          StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+          CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
           node.operator,
           [methodName, receiverType],
         );
       } else {
         _errorReporter.reportErrorForToken(
-          StaticTypeWarningCode.UNDEFINED_OPERATOR,
+          CompileTimeErrorCode.UNDEFINED_OPERATOR,
           node.operator,
           [methodName, receiverType],
         );
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index beeb19a..8a27334 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -73,7 +73,7 @@
     var operandWriteType = _getStaticType(operand);
     if (!_typeSystem.isAssignableTo2(type, operandWriteType)) {
       _resolver.errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.INVALID_ASSIGNMENT,
+        CompileTimeErrorCode.INVALID_ASSIGNMENT,
         node,
         [type, operandWriteType],
       );
@@ -205,13 +205,13 @@
       if (_shouldReportInvalidMember(staticType, result)) {
         if (operand is SuperExpression) {
           _errorReporter.reportErrorForToken(
-            StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+            CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
             operator,
             [methodName, staticType],
           );
         } else {
           _errorReporter.reportErrorForToken(
-            StaticTypeWarningCode.UNDEFINED_OPERATOR,
+            CompileTimeErrorCode.UNDEFINED_OPERATOR,
             operator,
             [methodName, staticType],
           );
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index af28859..3b74a26 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/dart/element/scope.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:meta/meta.dart';
 
 /// The scope defined by a block.
 class BlockScope {
@@ -406,24 +407,34 @@
 
 extension ScopeExtension on Scope {
   /// Return `true` if the fact that the given [node] is not defined should be
-  /// ignored (from the perspective of error reporting). This will be the case
-  /// if there is at least one import that defines the node's prefix, and if
-  /// that import either has no show combinators or has a show combinator that
-  /// explicitly lists the node's name.
+  /// ignored (from the perspective of error reporting).
   bool shouldIgnoreUndefined(Identifier node) {
     if (node is PrefixedIdentifier) {
-      return _enclosingLibraryScope.shouldIgnoreUndefined(
+      return shouldIgnoreUndefined2(
         prefix: node.prefix.name,
         name: node.identifier.name,
       );
     }
 
-    return _enclosingLibraryScope.shouldIgnoreUndefined(
+    return shouldIgnoreUndefined2(
       prefix: null,
       name: (node as SimpleIdentifier).name,
     );
   }
 
+  /// Return `true` if the fact that the identifier with the given [prefix]
+  /// (might be `null`) and [name] is not defined should be ignored (from the
+  /// perspective of error reporting).
+  bool shouldIgnoreUndefined2({
+    @required String prefix,
+    @required String name,
+  }) {
+    return _enclosingLibraryScope.shouldIgnoreUndefined(
+      prefix: prefix,
+      name: name,
+    );
+  }
+
   List<ExtensionElement> get extensions {
     return _enclosingLibraryScope.extensions;
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
index b6a88ef..29f8498 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
@@ -122,7 +122,7 @@
 
     if (argumentCount != parameterCount) {
       errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
+        CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
         node,
         [node.name.name, parameterCount, argumentCount],
       );
@@ -333,7 +333,7 @@
       var typeArguments = node.typeArguments;
       if (typeArguments != null) {
         errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+          CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           typeArguments,
           [classIdentifier.name, constructorIdentifier.name],
         );
@@ -354,8 +354,10 @@
     }
 
     if (_isInstanceCreation(node)) {
+      node.type = dynamicType;
       _ErrorHelper(errorReporter).reportNewWithNonType(node);
     } else {
+      node.type = dynamicType;
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.NOT_A_TYPE,
         typeIdentifier,
@@ -454,7 +456,7 @@
 
     if (_isTypeInTypeArgumentList(node)) {
       errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
+        CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT,
         identifier,
         [identifier.name],
       );
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index f12a3d2..e79edc9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -87,7 +87,7 @@
     if (declaredReturnType != null) {
       if (!_typeSystem.isAssignableTo2(impliedReturnType, declaredReturnType)) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+          CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
           expression,
           [impliedReturnType, declaredReturnType],
         );
@@ -108,7 +108,7 @@
 
       if (!_typeSystem.isAssignableTo2(impliedReturnType, requiredReturnType)) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+          CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
           expression,
           [impliedReturnType, requiredReturnType],
         );
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 3839122..6eff16b 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/body_inference_context.dart';
@@ -279,7 +280,8 @@
         }
       }
     }
-    _checkStrictInferenceInParameters(node.parameters);
+    _checkStrictInferenceInParameters(node.parameters,
+        body: node.body, initializers: node.initializers);
     super.visitConstructorDeclaration(node);
   }
 
@@ -360,7 +362,8 @@
       if (node.parent is CompilationUnit && !node.isSetter) {
         _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
       }
-      _checkStrictInferenceInParameters(node.functionExpression.parameters);
+      _checkStrictInferenceInParameters(node.functionExpression.parameters,
+          body: node.functionExpression.body);
       super.visitFunctionDeclaration(node);
     } finally {
       _inDeprecatedMember = wasInDeprecatedMember;
@@ -381,7 +384,7 @@
     }
     DartType functionType = InferenceContext.getContext(node);
     if (functionType is! FunctionType) {
-      _checkStrictInferenceInParameters(node.parameters);
+      _checkStrictInferenceInParameters(node.parameters, body: node.body);
     }
     super.visitFunctionExpression(node);
   }
@@ -400,6 +403,7 @@
   @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
+    _checkStrictInferenceInParameters(node.parameters);
     super.visitFunctionTypeAlias(node);
   }
 
@@ -493,7 +497,7 @@
       if (!node.isSetter && !elementIsOverride()) {
         _checkStrictInferenceReturnType(node.returnType, node, node.name.name);
       }
-      _checkStrictInferenceInParameters(node.parameters);
+      _checkStrictInferenceInParameters(node.parameters, body: node.body);
 
       ExecutableElement overriddenElement = getConcreteOverriddenElement();
       if (overriddenElement == null && (node.isSetter || node.isGetter)) {
@@ -1313,9 +1317,37 @@
 
   /// In "strict-inference" mode, check that each of the [parameters]' type is
   /// specified.
-  void _checkStrictInferenceInParameters(FormalParameterList parameters) {
+  ///
+  /// Only parameters which are referenced in [initializers] or [body] are
+  /// reported. If [initializers] and [body] are both null, the parameters are
+  /// assumed to originate from a typedef, function-typed parameter, or function
+  /// which is abstract or external.
+  void _checkStrictInferenceInParameters(FormalParameterList parameters,
+      {List<ConstructorInitializer> initializers, FunctionBody body}) {
+    _UsedParameterVisitor usedParameterVisitor;
+
+    bool isParameterReferenced(SimpleFormalParameter parameter) {
+      if ((body == null || body is EmptyFunctionBody) && initializers == null) {
+        // The parameter is in a typedef, or function that is abstract,
+        // external, etc.
+        return true;
+      }
+      if (usedParameterVisitor == null) {
+        // Visit the function body and initializers once to determine whether
+        // each of the parameters is referenced.
+        usedParameterVisitor = _UsedParameterVisitor(
+            parameters.parameters.map((p) => p.declaredElement).toSet());
+        body?.accept(usedParameterVisitor);
+        for (var initializer in initializers ?? []) {
+          initializer.accept(usedParameterVisitor);
+        }
+      }
+
+      return usedParameterVisitor.isUsed(parameter.declaredElement);
+    }
+
     void checkParameterTypeIsKnown(SimpleFormalParameter parameter) {
-      if (parameter.type == null) {
+      if (parameter.type == null && isParameterReferenced(parameter)) {
         ParameterElement element = parameter.declaredElement;
         _errorReporter.reportErrorForNode(
           HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER,
@@ -1653,3 +1685,27 @@
       identifier.parent is Combinator &&
       identifier.parent.parent is ExportDirective;
 }
+
+/// A visitor that determines, upon visiting a function body and/or a
+/// constructor's initializers, whether a parameter is referenced.
+class _UsedParameterVisitor extends RecursiveAstVisitor<void> {
+  final Set<ParameterElement> _parameters;
+
+  final Set<ParameterElement> _usedParameters = {};
+
+  _UsedParameterVisitor(this._parameters);
+
+  bool isUsed(ParameterElement parameter) =>
+      _usedParameters.contains(parameter);
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is ExecutableMember) {
+      element = element.declaration;
+    }
+    if (_parameters.contains(element)) {
+      _usedParameters.add(element);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index cf46b92..05eb039 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -35,11 +35,11 @@
   /// Check to ensure that the [condition] is of type bool, are. Otherwise an
   /// error is reported on the expression.
   ///
-  /// See [StaticTypeWarningCode.NON_BOOL_CONDITION].
+  /// See [CompileTimeErrorCode.NON_BOOL_CONDITION].
   void checkForNonBoolCondition(Expression condition) {
     checkForNonBoolExpression(
       condition,
-      errorCode: StaticTypeWarningCode.NON_BOOL_CONDITION,
+      errorCode: CompileTimeErrorCode.NON_BOOL_CONDITION,
     );
   }
 
@@ -62,7 +62,7 @@
   void checkForNonBoolNegationExpression(Expression expression) {
     checkForNonBoolExpression(
       expression,
-      errorCode: StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION,
+      errorCode: CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION,
     );
   }
 
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index bc93306..f53e655 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -42,60 +42,6 @@
               "has type '{2}'.");
 
   /**
-   * Parameters:
-   * 0: The type of the runtime value of the argument
-   * 1: The static type of the parameter
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the runtime type of a constant
-  // value can't be assigned to the static type of a constant constructor's
-  // parameter.
-  //
-  // #### Example
-  //
-  // The following code produces this diagnostic because the runtime type of `i`
-  // is `int`, which can't be assigned to the static type of `s`:
-  //
-  // ```dart
-  // class C {
-  //   final String s;
-  //
-  //   const C(this.s);
-  // }
-  //
-  // const dynamic i = 0;
-  //
-  // void f() {
-  //   const C([!i!]);
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Pass a value of the correct type to the constructor:
-  //
-  // ```dart
-  // class C {
-  //   final String s;
-  //
-  //   const C(this.s);
-  // }
-  //
-  // const dynamic i = 0;
-  //
-  // void f() {
-  //   const C('$i');
-  // }
-  // ```
-  static const CheckedModeCompileTimeErrorCode
-      CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH = CheckedModeCompileTimeErrorCode(
-          'CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH',
-          "A value of type '{0}' can't be assigned to a parameter of type "
-              "'{1}'.",
-          hasPublishedDocs: true);
-
-  /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error
    * if o is not <b>null</b> and the interface of the class of <i>o</i> is not a
    * subtype of the static type of the field <i>v</i>.
@@ -1444,6 +1390,60 @@
           correction: "Try renaming either the type variable or the member.");
 
   /**
+   * Parameters:
+   * 0: The type of the runtime value of the argument
+   * 1: The static type of the parameter
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the runtime type of a constant
+  // value can't be assigned to the static type of a constant constructor's
+  // parameter.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the runtime type of `i`
+  // is `int`, which can't be assigned to the static type of `s`:
+  //
+  // ```dart
+  // class C {
+  //   final String s;
+  //
+  //   const C(this.s);
+  // }
+  //
+  // const dynamic i = 0;
+  //
+  // void f() {
+  //   const C([!i!]);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Pass a value of the correct type to the constructor:
+  //
+  // ```dart
+  // class C {
+  //   final String s;
+  //
+  //   const C(this.s);
+  // }
+  //
+  // const dynamic i = 0;
+  //
+  // void f() {
+  //   const C('$i');
+  // }
+  // ```
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH =
+      CompileTimeErrorCode(
+          'CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH',
+          "A value of type '{0}' can't be assigned to a parameter of type "
+              "'{1}'.",
+          hasPublishedDocs: true);
+
+  /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
    * object results in an uncaught exception being thrown.
    */
@@ -2501,6 +2501,45 @@
           hasPublishedDocs: true);
 
   /**
+   * 12.7 Lists: A fresh instance (7.6.1) <i>a</i>, of size <i>n</i>, whose
+   * class implements the built-in class <i>List&lt;E></i> is allocated.
+   *
+   * Parameters:
+   * 0: the number of provided type arguments
+   */
+  static const CompileTimeErrorCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS =
+      CompileTimeErrorCode(
+          'EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
+          "List literals require exactly one type argument or none, "
+              "but {0} found.",
+          correction: "Try adjusting the number of type arguments.");
+
+  /**
+   * Parameters:
+   * 0: the number of provided type arguments
+   */
+  static const CompileTimeErrorCode EXPECTED_ONE_SET_TYPE_ARGUMENTS =
+      CompileTimeErrorCode(
+          'EXPECTED_ONE_SET_TYPE_ARGUMENTS',
+          "Set literals require exactly one type argument or none, "
+              "but {0} found.",
+          correction: "Try adjusting the number of type arguments.");
+
+  /**
+   * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class
+   * implements the built-in class <i>Map&lt;K, V></i> is allocated.
+   *
+   * Parameters:
+   * 0: the number of provided type arguments
+   */
+  static const CompileTimeErrorCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS =
+      CompileTimeErrorCode(
+          'EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
+          "Map literals require exactly two type arguments or none, "
+              "but {0} found.",
+          correction: "Try adjusting the number of type arguments.");
+
+  /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * Parameters:
@@ -3487,6 +3526,61 @@
           correction: "Try adding initializers for the fields.",
           hasPublishedDocs: true);
 
+  /**
+   * 17.6.2 For-in. It the iterable expression does not implement Iterable with
+   * a type argument that can be assigned to the for-in variable's type, this
+   * warning is reported.
+   *
+   * Parameters:
+   * 0: The type of the iterable expression.
+   * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
+   * 2: The loop variable type.
+   */
+  static const CompileTimeErrorCode FOR_IN_OF_INVALID_ELEMENT_TYPE =
+      CompileTimeErrorCode(
+          'FOR_IN_OF_INVALID_ELEMENT_TYPE',
+          "The type '{0}' used in the 'for' loop must implement {1} with a "
+              "type argument that can be assigned to '{2}'.");
+
+  /**
+   * Parameters:
+   * 0: The type of the iterable expression.
+   * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the expression following `in` in
+  // a for-in loop has a type that isn't a subclass of `Iterable`.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `m` is a `Map`, and
+  // `Map` isn't a subclass of `Iterable`:
+  //
+  // ```dart
+  // void f(Map<String, String> m) {
+  //   for (String s in [!m!]) {
+  //     print(s);
+  //   }
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Replace the expression with one that produces an iterable value:
+  //
+  // ```dart
+  // void f(Map<String, String> m) {
+  //   for (String s in m.values) {
+  //     print(s);
+  //   }
+  // }
+  // ```
+  static const CompileTimeErrorCode FOR_IN_OF_INVALID_TYPE =
+      CompileTimeErrorCode('FOR_IN_OF_INVALID_TYPE',
+          "The type '{0}' used in the 'for' loop must implement {1}.",
+          hasPublishedDocs: true);
+
   static const CompileTimeErrorCode FOR_IN_WITH_CONST_VARIABLE =
       CompileTimeErrorCode('FOR_IN_WITH_CONST_VARIABLE',
           "A for-in loop-variable can't be 'const'.",
@@ -3573,6 +3667,54 @@
               "removing the modifier 'async*' from the function body.");
 
   /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the body of a function has the
+  // `async` modifier even though the return type of the function isn't
+  // assignable to `Future`.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the body of the
+  // function `f` has the `async` modifier even though the return type isn't
+  // assignable to `Future`:
+  //
+  // ```dart
+  // [!int!] f() async {
+  //   return 0;
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the function should be asynchronous, then change the return type to be
+  // assignable to `Future`:
+  //
+  // ```dart
+  // Future<int> f() async {
+  //   return 0;
+  // }
+  // ```
+  //
+  // If the function should be synchronous, then remove the `async` modifier:
+  //
+  // ```dart
+  // int f() {
+  //   return 0;
+  // }
+  // ```
+  static const CompileTimeErrorCode ILLEGAL_ASYNC_RETURN_TYPE =
+      CompileTimeErrorCode(
+          'ILLEGAL_ASYNC_RETURN_TYPE',
+          "Functions marked 'async' must have a return type assignable to "
+              "'Future'.",
+          correction: "Try fixing the return type of the function, or "
+              "removing the modifier 'async' from the function body.",
+          hasPublishedDocs: true);
+
+  /**
    * It is a compile-time error if the declared return type of a function marked
    * 'sync*' is not a supertype of 'Iterable<T>' for some type 'T'.
    */
@@ -4066,6 +4208,51 @@
           correction: "Try removing the initialization.");
 
   /**
+   * Parameters:
+   * 0: the name of the static member
+   * 1: the kind of the static member (field, getter, setter, or method)
+   * 2: the name of the defining class
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an access operator is used to
+  // access a static member through an instance of the class.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `zero` is a static
+  // field, but it’s being accessed as if it were an instance field:
+  //
+  // ```dart
+  // void f(C c) {
+  //   c.[!zero!];
+  // }
+  //
+  // class C {
+  //   static int zero = 0;
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Use the class to access the static member:
+  //
+  // ```dart
+  // void f(C c) {
+  //   C.zero;
+  // }
+  //
+  // class C {
+  //   static int zero = 0;
+  // }
+  // ```
+  static const CompileTimeErrorCode INSTANCE_ACCESS_TO_STATIC_MEMBER =
+      CompileTimeErrorCode('INSTANCE_ACCESS_TO_STATIC_MEMBER',
+          "Static {1} '{0}' can't be accessed through an instance.",
+          correction: "Try using the class '{2}' to access the {1}.",
+          hasPublishedDocs: true);
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -4273,6 +4460,56 @@
 
   /**
    * Parameters:
+   * 0: the name of the right hand side type
+   * 1: the name of the left hand side type
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the static type of an expression
+  // that is assigned to a variable isn't assignable to the type of the
+  // variable.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because the type of the
+  // initializer (`int`) isn't assignable to the type of the variable
+  // (`String`):
+  //
+  // ```dart
+  // int i = 0;
+  // String s = [!i!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the value being assigned is always assignable at runtime, even though
+  // the static types don't reflect that, then add an explicit cast.
+  //
+  // Otherwise, change the value being assigned so that it has the expected
+  // type. In the previous example, this might look like:
+  //
+  // ```dart
+  // int i = 0;
+  // String s = i.toString();
+  // ```
+  //
+  // If you can’t change the value, then change the type of the variable to be
+  // compatible with the type of the value being assigned:
+  //
+  // ```dart
+  // int i = 0;
+  // int s = i;
+  // ```
+  static const CompileTimeErrorCode INVALID_ASSIGNMENT = CompileTimeErrorCode(
+      'INVALID_ASSIGNMENT',
+      "A value of type '{0}' can't be assigned to a variable of type "
+          "'{1}'.",
+      correction: "Try changing the type of the variable, or "
+          "casting the right-hand type to '{1}'.",
+      hasPublishedDocs: true);
+
+  /**
+   * Parameters:
    * 0: the type of the function
    * 1: the expected function type
    */
@@ -4793,6 +5030,94 @@
           hasPublishedDocs: true);
 
   /**
+   * Parameters:
+   * 0: the name of the identifier that is not a function type
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it finds a function invocation,
+  // but the name of the function being invoked is defined to be something other
+  // than a function.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `Binary` is the name of
+  // a function type, not a function:
+  //
+  // ```dart
+  // typedef Binary = int Function(int, int);
+  //
+  // int f() {
+  //   return [!Binary!](1, 2);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Replace the name with the name of a function.
+  static const CompileTimeErrorCode INVOCATION_OF_NON_FUNCTION =
+      CompileTimeErrorCode(
+          'INVOCATION_OF_NON_FUNCTION', "'{0}' isn't a function.",
+          // TODO(brianwilkerson) Split this error code so that we can provide
+          // better error and correction messages.
+          correction:
+              "Try correcting the name to match an existing function, or "
+              "define a method or function named '{0}'.",
+          hasPublishedDocs: true);
+
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a function invocation is found,
+  // but the name being referenced isn't the name of a function, or when the
+  // expression computing the function doesn't compute a function.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `x` isn't a function:
+  //
+  // ```dart
+  // int x = 0;
+  //
+  // int f() => x;
+  //
+  // var y = [!x!]();
+  // ```
+  //
+  // The following code produces this diagnostic because `f()` doesn't return a
+  // function:
+  //
+  // ```dart
+  // int x = 0;
+  //
+  // int f() => x;
+  //
+  // var y = [!f()!]();
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If you need to invoke a function, then replace the code before the argument
+  // list with the name of a function or with an expression that computes a
+  // function:
+  //
+  // ```dart
+  // int x = 0;
+  //
+  // int f() => x;
+  //
+  // var y = f();
+  // ```
+  static const CompileTimeErrorCode INVOCATION_OF_NON_FUNCTION_EXPRESSION =
+      CompileTimeErrorCode(
+          'INVOCATION_OF_NON_FUNCTION_EXPRESSION',
+          "The expression doesn't evaluate to a function, so it can't be "
+              "invoked.",
+          hasPublishedDocs: true);
+
+  /**
    * 13.13 Break: It is a compile-time error if no such statement
    * <i>s<sub>E</sub></i> exists within the innermost function in which
    * <i>s<sub>b</sub></i> occurs.
@@ -5580,6 +5905,21 @@
               "explicitly invoking a different constructor in '{0}'.");
 
   /**
+   * User friendly specialized error for [NON_GENERATIVE_CONSTRUCTOR]. This
+   * handles the case of `class E extends Exception` which will never work
+   * because [Exception] has no generative constructors.
+   */
+  static const CompileTimeErrorCode NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS =
+      CompileTimeErrorCode(
+          'NO_GENERATIVE_CONSTRUCTOR_IN_SUPERCLASS',
+          "The class '{0}' cannot extend '{1}' because '{1}' only has factory"
+              " constructors (no generative constructors), and '{0}' has at"
+              ' least one generative constructor.',
+          correction: 'Try implementing the class instead, adding a generative'
+              " (not factory) constructor to the superclass {0}, or a factory"
+              ' constructor to the subclass.');
+
+  /**
    * Parameters:
    * 0: the name of the superclass that does not define an implicitly invoked
    *    constructor
@@ -5735,6 +6075,140 @@
           hasPublishedDocs: true);
 
   /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a condition, such as an `if` or
+  // `while` loop, doesn't have the static type `bool`.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `x` has the static type
+  // `int`:
+  //
+  // ```dart
+  // void f(int x) {
+  //   if ([!x!]) {
+  //     // ...
+  //   }
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Change the condition so that it produces a Boolean value:
+  //
+  // ```dart
+  // void f(int x) {
+  //   if (x == 0) {
+  //     // ...
+  //   }
+  // }
+  // ```
+  static const CompileTimeErrorCode NON_BOOL_CONDITION = CompileTimeErrorCode(
+      'NON_BOOL_CONDITION', "Conditions must have a static type of 'bool'.",
+      correction: "Try changing the condition.", hasPublishedDocs: true);
+
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the first expression in an
+  // assert has a type other than `bool`.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because the type of `p` is
+  // `int`, but a `bool` is required:
+  //
+  // ```dart
+  // void f(int p) {
+  //   assert([!p!]);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Change the expression so that it has the type `bool`:
+  //
+  // ```dart
+  // void f(int p) {
+  //   assert(p > 0);
+  // }
+  // ```
+  static const CompileTimeErrorCode NON_BOOL_EXPRESSION = CompileTimeErrorCode(
+      'NON_BOOL_EXPRESSION',
+      "The expression in an assert must be of type 'bool'.",
+      correction: "Try changing the expression.",
+      hasPublishedDocs: true);
+
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the operand of the unary
+  // negation operator (`!`) doesn't have the type `bool`.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `x` is an `int` when it
+  // must be a `bool`:
+  //
+  // ```dart
+  // int x = 0;
+  // bool y = ![!x!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Replace the operand with an expression that has the type `bool`:
+  //
+  // ```dart
+  // int x = 0;
+  // bool y = !(x > 0);
+  // ```
+  static const CompileTimeErrorCode NON_BOOL_NEGATION_EXPRESSION =
+      CompileTimeErrorCode('NON_BOOL_NEGATION_EXPRESSION',
+          "A negation operand must have a static type of 'bool'.",
+          correction: "Try changing the operand to the '!' operator.",
+          hasPublishedDocs: true);
+
+  /**
+   * Parameters:
+   * 0: the lexeme of the logical operator
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when one of the operands of either
+  // the `&&` or `||` operator doesn't have the type `bool`.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `a` isn't a Boolean
+  // value:
+  //
+  // ```dart
+  // int a = 3;
+  // bool b = [!a!] || a > 1;
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Change the operand to a Boolean value:
+  //
+  // ```dart
+  // int a = 3;
+  // bool b = a == 0 || a > 1;
+  // ```
+  static const CompileTimeErrorCode NON_BOOL_OPERAND = CompileTimeErrorCode(
+      'NON_BOOL_OPERAND',
+      "The operands of the operator '{0}' must be assignable to 'bool'.",
+      hasPublishedDocs: true);
+
+  /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant
    * map literal that has no explicit type arguments appears in a place where a
    * statement is expected.
@@ -6177,20 +6651,80 @@
    * Let <i>k</i> be a generative constructor. It is a compile-time error if
    * class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
+   *
+   * Parameters:
+   * 0: the non-generative constructor
    */
   static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR =
-      CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR',
-          "The generative constructor '{0}' expected, but factory found.",
+      CompileTimeErrorCode(
+          'NON_GENERATIVE_CONSTRUCTOR',
+          "The constructor '{0}' is a factory constructor, but must be a"
+              " generative constructor to be a valid superinitializer.",
           correction:
-              "Try calling a different constructor in the superclass, or "
+              "Try calling a different constructor of the superclass, or "
               "making the called constructor not be a factory constructor.");
 
+  /**
+   * An error code for when a class has no explicit constructor, and therefore
+   * a constructor is implicitly defined which uses a factory as a
+   * superinitializer. See [NON_GENERATIVE_CONSTRUCTOR].
+   *
+   * Parameters:
+   * 0: the name of the superclass
+   * 1: the name of the current class
+   * 2: the implicitly called factory constructor of the superclass
+   */
+  static const CompileTimeErrorCode NON_GENERATIVE_IMPLICIT_CONSTRUCTOR =
+      CompileTimeErrorCode(
+          'NON_GENERATIVE_IMPLICIT_CONSTRUCTOR',
+          "The default constructor of superclass '{0}' (called by the implicit"
+              " default constructor of '{1}') must be a generative constructor,"
+              " but factory found.",
+          correction: 'Try adding an explicit constructor that has a different'
+              " superinitializer or changing the superclass constructor '{2}'"
+              " to not be a factory constructor.");
+
   static const CompileTimeErrorCode NON_SYNC_FACTORY = CompileTimeErrorCode(
       'NON_SYNC_FACTORY',
       "Factory bodies can't use 'async', 'async*', or 'sync*'.");
 
   /**
    * Parameters:
+   * 0: the name appearing where a type is expected
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an identifier that isn't a type
+  // is used as a type argument.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `x` is a variable, not
+  // a type:
+  //
+  // ```dart
+  // var x = 0;
+  // List<[!x!]> xList = [];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Change the type argument to be a type:
+  //
+  // ```dart
+  // var x = 0;
+  // List<int> xList = [];
+  // ```
+  static const CompileTimeErrorCode NON_TYPE_AS_TYPE_ARGUMENT =
+      CompileTimeErrorCode('NON_TYPE_AS_TYPE_ARGUMENT',
+          "The name '{0}' isn't a type so it can't be used as a type argument.",
+          correction: "Try correcting the name to an existing type, or "
+              "defining a type named '{0}'.",
+          hasPublishedDocs: true,
+          isUnresolvedIdentifier: true);
+
+  /**
+   * Parameters:
    * 0: the name of the non-type element
    */
   // #### Description
@@ -7594,6 +8128,112 @@
           "changing the method body modifier.");
 
   /**
+   * Parameters:
+   * 0: the return type as declared in the return statement
+   * 1: the expected return type as defined by the method
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the static type of a returned
+  // expression isn't assignable to the return type that the closure is required
+  // to have.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `f` is defined to be a
+  // function that returns a `String`, but the closure assigned to it returns an
+  // `int`:
+  //
+  // ```dart
+  // String Function(String) f = (s) => [!3!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the return type is correct, then replace the returned value with a value
+  // of the correct type, possibly by converting the existing value:
+  //
+  // ```dart
+  // String Function(String) f = (s) => 3.toString();
+  // ```
+  static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CLOSURE =
+      CompileTimeErrorCode(
+          'RETURN_OF_INVALID_TYPE_FROM_CLOSURE',
+          "The return type '{0}' isn't a '{1}', as required by the closure's "
+              "context.",
+          hasPublishedDocs: true);
+
+  /**
+   * Parameters:
+   * 0: the return type as declared in the return statement
+   * 1: the expected return type as defined by the enclosing class
+   * 2: the name of the constructor
+   */
+  static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR =
+      CompileTimeErrorCodeWithUniqueName(
+          'RETURN_OF_INVALID_TYPE',
+          'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
+          "A value of type '{0}' can't be returned from constructor '{2}' "
+              "because it has a return type of '{1}'.",
+          hasPublishedDocs: true);
+
+  /**
+   * Parameters:
+   * 0: the return type as declared in the return statement
+   * 1: the expected return type as defined by the method
+   * 2: the name of the method
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a method or function returns a
+  // value whose type isn't assignable to the declared return type.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `f` has a return type
+  // of `String` but is returning an `int`:
+  //
+  // ```dart
+  // String f() => [!3!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the return type is correct, then replace the value being returned with a
+  // value of the correct type, possibly by converting the existing value:
+  //
+  // ```dart
+  // String f() => 3.toString();
+  // ```
+  //
+  // If the value is correct, then change the return type to match:
+  //
+  // ```dart
+  // int f() => 3;
+  // ```
+  static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_FUNCTION =
+      CompileTimeErrorCodeWithUniqueName(
+          'RETURN_OF_INVALID_TYPE',
+          'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
+          "A value of type '{0}' can't be returned from function '{2}' because "
+              "it has a return type of '{1}'.",
+          hasPublishedDocs: true);
+
+  /**
+   * Parameters:
+   * 0: the return type as declared in the return statement
+   * 1: the expected return type as defined by the method
+   * 2: the name of the method
+   */
+  static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_METHOD =
+      CompileTimeErrorCodeWithUniqueName(
+          'RETURN_OF_INVALID_TYPE',
+          'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD',
+          "A value of type '{0}' can't be returned from method '{2}' because "
+              "it has a return type of '{1}'.",
+          hasPublishedDocs: true);
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -7992,6 +8632,21 @@
               "making the member an instance member.");
 
   /**
+   * 10 Generics: It is a static type warning if a type parameter is a supertype
+   * of its upper bound.
+   *
+   * Parameters:
+   * 0: the name of the type parameter
+   * 1: the name of the bounding type
+   *
+   * See [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
+   */
+  static const CompileTimeErrorCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND =
+      CompileTimeErrorCode('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND',
+          "'{0}' can't be a supertype of its upper bound.",
+          correction: "Try using a type that is or is a subclass of '{1}'.");
+
+  /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type
    * available in the current lexical scope.
    */
@@ -8295,6 +8950,55 @@
 
   /**
    * Parameters:
+   * 0: the name of the enumeration constant that is not defined
+   * 1: the name of the enumeration used to access the constant
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of an enum constant, and the name either isn't
+  // defined or isn't visible in the scope in which it's being referenced.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `E` doesn't define a
+  // constant named `c`:
+  //
+  // ```dart
+  // enum E {a, b}
+  //
+  // var e = E.[!c!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the constant should be defined, then add it to the declaration of the
+  // enum:
+  //
+  // ```dart
+  // enum E {a, b, c}
+  //
+  // var e = E.c;
+  // ```
+  //
+  // If the constant shouldn't be defined, then change the name to the name of
+  // an existing constant:
+  //
+  // ```dart
+  // enum E {a, b}
+  //
+  // var e = E.b;
+  // ```
+  static const CompileTimeErrorCode UNDEFINED_ENUM_CONSTANT =
+      CompileTimeErrorCode('UNDEFINED_ENUM_CONSTANT',
+          "There's no constant named '{0}' in '{1}'.",
+          correction:
+              "Try correcting the name to the name of an existing constant, or "
+              "defining a constant named '{0}'.",
+          hasPublishedDocs: true);
+
+  /**
+   * Parameters:
    * 0: the name of the getter that is undefined
    * 1: the name of the extension that was explicitly specified
    */
@@ -8610,6 +9314,89 @@
 
   /**
    * Parameters:
+   * 0: the name of the method that is undefined
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a function but either isn't defined or isn't
+  // visible in the scope in which it's being referenced.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because the name `emty` isn't
+  // defined:
+  //
+  // ```dart
+  // List<int> empty() => [];
+  //
+  // void main() {
+  //   print([!emty!]());
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a function that is defined. The example above can be corrected
+  // by fixing the spelling of the function:
+  //
+  // ```dart
+  // List<int> empty() => [];
+  //
+  // void main() {
+  //   print(empty());
+  // }
+  // ```
+  //
+  // If the function is defined but isn't visible, then you probably need to add
+  // an import or re-arrange your code to make the function visible.
+  static const CompileTimeErrorCode UNDEFINED_FUNCTION = CompileTimeErrorCode(
+      'UNDEFINED_FUNCTION', "The function '{0}' isn't defined.",
+      correction: "Try importing the library that defines '{0}', "
+          "correcting the name to the name of an existing function, or "
+          "defining a function named '{0}'.",
+      hasPublishedDocs: true,
+      isUnresolvedIdentifier: true);
+
+  /**
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the getter is being looked for
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a getter but either isn't defined or isn't
+  // visible in the scope in which it's being referenced.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `String` has no member
+  // named `len`:
+  //
+  // ```dart
+  // int f(String s) => s.[!len!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a getter that is defined. The example above can be corrected by
+  // fixing the spelling of the getter:
+  //
+  // ```dart
+  // int f(String s) => s.length;
+  // ```
+  static const CompileTimeErrorCode UNDEFINED_GETTER = CompileTimeErrorCode(
+      'UNDEFINED_GETTER', "The getter '{0}' isn't defined for the type '{1}'.",
+      correction: "Try importing the library that defines '{0}', "
+          "correcting the name to the name of an existing getter, or "
+          "defining a getter or field named '{0}'.",
+      hasPublishedDocs: true);
+
+  /**
+   * Parameters:
    * 0: the name of the identifier
    */
   // #### Description
@@ -8683,6 +9470,42 @@
 
   /**
    * Parameters:
+   * 0: the name of the method that is undefined
+   * 1: the resolved type name that the method lookup is happening on
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a method but either isn't defined or isn't
+  // visible in the scope in which it's being referenced.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because the identifier
+  // `removeMiddle` isn't defined:
+  //
+  // ```dart
+  // int f(List<int> l) => l.[!removeMiddle!]();
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a method that is defined. The example above can be corrected by
+  // fixing the spelling of the method:
+  //
+  // ```dart
+  // int f(List<int> l) => l.removeLast();
+  // ```
+  static const CompileTimeErrorCode UNDEFINED_METHOD = CompileTimeErrorCode(
+      'UNDEFINED_METHOD', "The method '{0}' isn't defined for the type '{1}'.",
+      correction:
+          "Try correcting the name to the name of an existing method, or "
+          "defining a method named '{0}'.",
+      hasPublishedDocs: true);
+
+  /**
+   * Parameters:
    * 0: the name of the requested named parameter
    */
   // #### Description
@@ -8759,6 +9582,245 @@
 
   /**
    * Parameters:
+   * 0: the name of the operator
+   * 1: the name of the enclosing type where the operator is being looked for
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a user-definable operator is
+  // invoked on an object for which the operator isn't defined.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because the class `C` doesn't
+  // define the operator `+`:
+  //
+  // ```dart
+  // class C {}
+  //
+  // C f(C c) => c [!+!] 2;
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the operator should be defined for the class, then define it:
+  //
+  // ```dart
+  // class C {
+  //   C operator +(int i) => this;
+  // }
+  //
+  // C f(C c) => c + 2;
+  // ```
+  static const CompileTimeErrorCode UNDEFINED_OPERATOR = CompileTimeErrorCode(
+      'UNDEFINED_OPERATOR',
+      "The operator '{0}' isn't defined for the type '{1}'.",
+      correction: "Try defining the operator '{0}'.",
+      hasPublishedDocs: true);
+
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a prefixed identifier is found
+  // where the prefix is valid, but the identifier isn't declared in any of the
+  // libraries imported using that prefix.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `dart:core` doesn't
+  // define anything named `a`:
+  //
+  // ```dart
+  // import 'dart:core' as p;
+  //
+  // void f() {
+  //   p.[!a!];
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the library in which the name is declared isn't imported yet, add an
+  // import for the library.
+  //
+  // If the name is wrong, then change it to one of the names that's declared in
+  // the imported libraries.
+  static const CompileTimeErrorCode UNDEFINED_PREFIXED_NAME =
+      CompileTimeErrorCode(
+          'UNDEFINED_PREFIXED_NAME',
+          "The name '{0}' is being referenced through the prefix '{1}', but it "
+              "isn't defined in any of the libraries imported using that "
+              "prefix.",
+          correction: "Try correcting the prefix or "
+              "importing the library that defines '{0}'.",
+          hasPublishedDocs: true);
+
+  /**
+   * Parameters:
+   * 0: the name of the setter
+   * 1: the name of the enclosing type where the setter is being looked for
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a setter but either isn't defined or isn't
+  // visible in the scope in which the identifier is being referenced.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because there isn't a setter
+  // named `z`:
+  //
+  // ```dart
+  // class C {
+  //   int x = 0;
+  //   void m(int y) {
+  //     this.[!z!] = y;
+  //   }
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a setter that is defined. The example above can be corrected by
+  // fixing the spelling of the setter:
+  //
+  // ```dart
+  // class C {
+  //   int x = 0;
+  //   void m(int y) {
+  //     this.x = y;
+  //   }
+  // }
+  // ```
+  static const CompileTimeErrorCode UNDEFINED_SETTER = CompileTimeErrorCode(
+      'UNDEFINED_SETTER', "The setter '{0}' isn't defined for the type '{1}'.",
+      correction: "Try importing the library that defines '{0}', "
+          "correcting the name to the name of an existing setter, or "
+          "defining a setter or field named '{0}'.",
+      hasPublishedDocs: true);
+
+  /**
+   * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
+   * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the getter is being looked for
+   */
+  static const CompileTimeErrorCode UNDEFINED_SUPER_GETTER =
+      CompileTimeErrorCode('UNDEFINED_SUPER_GETTER',
+          "The getter '{0}' isn't defined in a superclass of '{1}'.",
+          correction:
+              "Try correcting the name to the name of an existing getter, or "
+              "defining a getter or field named '{0}' in a superclass.");
+
+  /**
+   * Parameters:
+   * 0: the name of the method that is undefined
+   * 1: the resolved type name that the method lookup is happening on
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an inherited method is
+  // referenced using `super`, but there’s no method with that name in the
+  // superclass chain.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `Object` doesn't define
+  // a member named `n`:
+  //
+  // ```dart
+  // class C {
+  //   void m() {
+  //     super.[!n!]();
+  //   }
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the inherited method you intend to invoke has a different name, then
+  // make the name of the invoked method  match the inherited method.
+  //
+  // If the method you intend to invoke is defined in the same class, then
+  // remove the `super.`.
+  //
+  // If not, then either add the method to one of the superclasses or remove the
+  // invocation.
+  static const CompileTimeErrorCode UNDEFINED_SUPER_METHOD =
+      CompileTimeErrorCode('UNDEFINED_SUPER_METHOD',
+          "The method '{0}' isn't defined in a superclass of '{1}'.",
+          correction:
+              "Try correcting the name to the name of an existing method, or "
+              "defining a method named '{0}' in a superclass.",
+          hasPublishedDocs: true);
+
+  /**
+   * 12.18 Assignment: Evaluation of an assignment of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
+   * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
+   * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
+   * <i>e<sub>2</sub></i>).
+   *
+   * 12.29 Assignable Expressions: An assignable expression of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
+   * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
+   * <i>e<sub>2</sub></i>.
+   *
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the operator
+   * 1: the name of the enclosing type where the operator is being looked for
+   */
+  static const CompileTimeErrorCode UNDEFINED_SUPER_OPERATOR =
+      CompileTimeErrorCode('UNDEFINED_SUPER_OPERATOR',
+          "The operator '{0}' isn't defined in a superclass of '{1}'.",
+          correction: "Try defining the operator '{0}' in a superclass.");
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance setter named <i>v=</i>.
+   *
+   * Parameters:
+   * 0: the name of the setter
+   * 1: the name of the enclosing type where the setter is being looked for
+   */
+  static const CompileTimeErrorCode UNDEFINED_SUPER_SETTER =
+      CompileTimeErrorCode('UNDEFINED_SUPER_SETTER',
+          "The setter '{0}' isn't defined in a superclass of '{1}'.",
+          correction:
+              "Try correcting the name to the name of an existing setter, or "
+              "defining a setter or field named '{0}' in a superclass.");
+
+  /**
+   * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
+   * not have an accessible (3.2) instance member named <i>m</i>.
+   *
+   * This is a specialization of [INSTANCE_ACCESS_TO_STATIC_MEMBER] that is used
+   * when we are able to find the name defined in a supertype. It exists to
+   * provide a more informative error message.
+   *
+   * Parameters:
+   * 0: the name of the defining type
+   */
+  static const CompileTimeErrorCode
+      UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = CompileTimeErrorCode(
+          'UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER',
+          "Static members from supertypes must be qualified by the name of the "
+              "defining type.",
+          correction: "Try adding '{0}.' before the name.");
+
+  /**
+   * Parameters:
    * 0: the name of the defining type
    */
   // #### Description
@@ -9069,6 +10131,92 @@
           hasPublishedDocs: true);
 
   /**
+   * Parameters:
+   * 0: the name of the type being referenced (<i>G</i>)
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a type that has type parameters
+  // is used and type arguments are provided, but the number of type arguments
+  // isn't the same as the number of type parameters.
+  //
+  // The analyzer also produces this diagnostic when a constructor is invoked
+  // and the number of type arguments doesn't match the number of type
+  // parameters declared for the class.
+  //
+  // #### Examples
+  //
+  // The following code produces this diagnostic because `C` has one type
+  // parameter but two type arguments are provided when it is used as a type
+  // annotation:
+  //
+  // ```dart
+  // class C<E> {}
+  //
+  // void f([!C<int, int>!] x) {}
+  // ```
+  //
+  // The following code produces this diagnostic because `C` declares one type
+  // parameter, but two type arguments are provided when creating an instance:
+  //
+  // ```dart
+  // class C<E> {}
+  //
+  // var c = [!C<int, int>!]();
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Add or remove type arguments, as necessary, to match the number of type
+  // parameters defined for the type:
+  //
+  // ```dart
+  // class C<E> {}
+  //
+  // void f(C<int> x) {}
+  // ```
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS =
+      CompileTimeErrorCode(
+          'WRONG_NUMBER_OF_TYPE_ARGUMENTS',
+          "The type '{0}' is declared with {1} type parameters, "
+              "but {2} type arguments were given.",
+          correction:
+              "Try adjusting the number of type arguments to match the number "
+              "of type parameters.",
+          hasPublishedDocs: true);
+
+  /**
+   * It will be a static type warning if <i>m</i> is not a generic method with
+   * exactly <i>n</i> type parameters.
+   *
+   * Parameters:
+   * 0: the name of the class being instantiated
+   * 1: the name of the constructor being invoked
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR =
+      CompileTimeErrorCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR',
+          "The constructor '{0}.{1}' doesn't have type parameters.",
+          correction: "Try moving type arguments to after the type name.");
+
+  /**
+   * It will be a static type warning if <i>m</i> is not a generic method with
+   * exactly <i>n</i> type parameters.
+   *
+   * Parameters:
+   * 0: the name of the method being referenced (<i>G</i>)
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD =
+      CompileTimeErrorCode(
+          'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
+          "The method '{0}' is declared with {1} type parameters, "
+              "but {2} type arguments were given.",
+          correction: "Try adjusting the number of type arguments.");
+
+  /**
    * Let `C` be a generic class that declares a formal type parameter `X`, and
    * assume that `T` is a direct superinterface of `C`. It is a compile-time
    * error if `X` occurs contravariantly or invariantly in `T`.
@@ -9134,6 +10282,30 @@
               "Try adding 'async*' or 'sync*' to the enclosing function.");
 
   /**
+   * 17.16.1 Yield: Let T be the static type of e [the expression to the right
+   * of "yield"] and let f be the immediately enclosing function.  It is a
+   * static type warning if either:
+   *
+   * - the body of f is marked async* and the type Stream<T> may not be
+   *   assigned to the declared return type of f.
+   *
+   * - the body of f is marked sync* and the type Iterable<T> may not be
+   *   assigned to the declared return type of f.
+   *
+   * 17.16.2 Yield-Each: Let T be the static type of e [the expression to the
+   * right of "yield*"] and let f be the immediately enclosing function.  It is
+   * a static type warning if T may not be assigned to the declared return type
+   * of f.  If f is synchronous it is a static type warning if T may not be
+   * assigned to Iterable.  If f is asynchronous it is a static type warning if
+   * T may not be assigned to Stream.
+   */
+  static const CompileTimeErrorCode YIELD_OF_INVALID_TYPE =
+      CompileTimeErrorCode(
+          'YIELD_OF_INVALID_TYPE',
+          "The type '{0}' implied by the 'yield' expression must be assignable "
+              "to '{1}'.");
+
+  /**
    * Initialize a newly created error code to have the given [name]. The message
    * associated with the error will be created from the given [message]
    * template. The correction associated with the error will be created from the
@@ -9171,1178 +10343,6 @@
 }
 
 /**
- * The error codes used for static type warnings. The convention for this class
- * is for the name of the error code to indicate the problem that caused the
- * error to be generated and for the error message to explain what is wrong and,
- * when appropriate, how the problem can be corrected.
- */
-class StaticTypeWarningCode extends AnalyzerErrorCode {
-  /**
-   * 12.7 Lists: A fresh instance (7.6.1) <i>a</i>, of size <i>n</i>, whose
-   * class implements the built-in class <i>List&lt;E></i> is allocated.
-   *
-   * Parameters:
-   * 0: the number of provided type arguments
-   */
-  static const StaticTypeWarningCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS =
-      StaticTypeWarningCode(
-          'EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
-          "List literals require exactly one type argument or none, "
-              "but {0} found.",
-          correction: "Try adjusting the number of type arguments.");
-
-  /**
-   * Parameters:
-   * 0: the number of provided type arguments
-   */
-  static const StaticTypeWarningCode EXPECTED_ONE_SET_TYPE_ARGUMENTS =
-      StaticTypeWarningCode(
-          'EXPECTED_ONE_SET_TYPE_ARGUMENTS',
-          "Set literals require exactly one type argument or none, "
-              "but {0} found.",
-          correction: "Try adjusting the number of type arguments.");
-
-  /**
-   * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class
-   * implements the built-in class <i>Map&lt;K, V></i> is allocated.
-   *
-   * Parameters:
-   * 0: the number of provided type arguments
-   */
-  static const StaticTypeWarningCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS =
-      StaticTypeWarningCode(
-          'EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
-          "Map literals require exactly two type arguments or none, "
-              "but {0} found.",
-          correction: "Try adjusting the number of type arguments.");
-
-  /**
-   * 17.6.2 For-in. It the iterable expression does not implement Iterable with
-   * a type argument that can be assigned to the for-in variable's type, this
-   * warning is reported.
-   *
-   * Parameters:
-   * 0: The type of the iterable expression.
-   * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
-   * 2: The loop variable type.
-   */
-  static const StaticTypeWarningCode FOR_IN_OF_INVALID_ELEMENT_TYPE =
-      StaticTypeWarningCode(
-          'FOR_IN_OF_INVALID_ELEMENT_TYPE',
-          "The type '{0}' used in the 'for' loop must implement {1} with a "
-              "type argument that can be assigned to '{2}'.");
-
-  /**
-   * Parameters:
-   * 0: The type of the iterable expression.
-   * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the expression following `in` in
-  // a for-in loop has a type that isn't a subclass of `Iterable`.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `m` is a `Map`, and
-  // `Map` isn't a subclass of `Iterable`:
-  //
-  // ```dart
-  // void f(Map<String, String> m) {
-  //   for (String s in [!m!]) {
-  //     print(s);
-  //   }
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Replace the expression with one that produces an iterable value:
-  //
-  // ```dart
-  // void f(Map<String, String> m) {
-  //   for (String s in m.values) {
-  //     print(s);
-  //   }
-  // }
-  // ```
-  static const StaticTypeWarningCode FOR_IN_OF_INVALID_TYPE =
-      StaticTypeWarningCode('FOR_IN_OF_INVALID_TYPE',
-          "The type '{0}' used in the 'for' loop must implement {1}.",
-          hasPublishedDocs: true);
-
-  /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the body of a function has the
-  // `async` modifier even though the return type of the function isn't
-  // assignable to `Future`.
-  //
-  // #### Example
-  //
-  // The following code produces this diagnostic because the body of the
-  // function `f` has the `async` modifier even though the return type isn't
-  // assignable to `Future`:
-  //
-  // ```dart
-  // [!int!] f() async {
-  //   return 0;
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the function should be asynchronous, then change the return type to be
-  // assignable to `Future`:
-  //
-  // ```dart
-  // Future<int> f() async {
-  //   return 0;
-  // }
-  // ```
-  //
-  // If the function should be synchronous, then remove the `async` modifier:
-  //
-  // ```dart
-  // int f() {
-  //   return 0;
-  // }
-  // ```
-  static const StaticTypeWarningCode ILLEGAL_ASYNC_RETURN_TYPE =
-      StaticTypeWarningCode(
-          'ILLEGAL_ASYNC_RETURN_TYPE',
-          "Functions marked 'async' must have a return type assignable to "
-              "'Future'.",
-          correction: "Try fixing the return type of the function, or "
-              "removing the modifier 'async' from the function body.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the static member
-   * 1: the kind of the static member (field, getter, setter, or method)
-   * 2: the name of the defining class
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when an access operator is used to
-  // access a static member through an instance of the class.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `zero` is a static
-  // field, but it’s being accessed as if it were an instance field:
-  //
-  // ```dart
-  // void f(C c) {
-  //   c.[!zero!];
-  // }
-  //
-  // class C {
-  //   static int zero = 0;
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Use the class to access the static member:
-  //
-  // ```dart
-  // void f(C c) {
-  //   C.zero;
-  // }
-  //
-  // class C {
-  //   static int zero = 0;
-  // }
-  // ```
-  static const StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER =
-      StaticTypeWarningCode('INSTANCE_ACCESS_TO_STATIC_MEMBER',
-          "Static {1} '{0}' can't be accessed through an instance.",
-          correction: "Try using the class '{2}' to access the {1}.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the right hand side type
-   * 1: the name of the left hand side type
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the static type of an expression
-  // that is assigned to a variable isn't assignable to the type of the
-  // variable.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because the type of the
-  // initializer (`int`) isn't assignable to the type of the variable
-  // (`String`):
-  //
-  // ```dart
-  // int i = 0;
-  // String s = [!i!];
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the value being assigned is always assignable at runtime, even though
-  // the static types don't reflect that, then add an explicit cast.
-  //
-  // Otherwise, change the value being assigned so that it has the expected
-  // type. In the previous example, this might look like:
-  //
-  // ```dart
-  // int i = 0;
-  // String s = i.toString();
-  // ```
-  //
-  // If you can’t change the value, then change the type of the variable to be
-  // compatible with the type of the value being assigned:
-  //
-  // ```dart
-  // int i = 0;
-  // int s = i;
-  // ```
-  static const StaticTypeWarningCode INVALID_ASSIGNMENT = StaticTypeWarningCode(
-      'INVALID_ASSIGNMENT',
-      "A value of type '{0}' can't be assigned to a variable of type "
-          "'{1}'.",
-      correction: "Try changing the type of the variable, or "
-          "casting the right-hand type to '{1}'.",
-      hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the identifier that is not a function type
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when it finds a function invocation,
-  // but the name of the function being invoked is defined to be something other
-  // than a function.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `Binary` is the name of
-  // a function type, not a function:
-  //
-  // ```dart
-  // typedef Binary = int Function(int, int);
-  //
-  // int f() {
-  //   return [!Binary!](1, 2);
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Replace the name with the name of a function.
-  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION =
-      StaticTypeWarningCode(
-          'INVOCATION_OF_NON_FUNCTION', "'{0}' isn't a function.",
-          // TODO(brianwilkerson) Split this error code so that we can provide
-          // better error and correction messages.
-          correction:
-              "Try correcting the name to match an existing function, or "
-              "define a method or function named '{0}'.",
-          hasPublishedDocs: true);
-
-  /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when a function invocation is found,
-  // but the name being referenced isn't the name of a function, or when the
-  // expression computing the function doesn't compute a function.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `x` isn't a function:
-  //
-  // ```dart
-  // int x = 0;
-  //
-  // int f() => x;
-  //
-  // var y = [!x!]();
-  // ```
-  //
-  // The following code produces this diagnostic because `f()` doesn't return a
-  // function:
-  //
-  // ```dart
-  // int x = 0;
-  //
-  // int f() => x;
-  //
-  // var y = [!f()!]();
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If you need to invoke a function, then replace the code before the argument
-  // list with the name of a function or with an expression that computes a
-  // function:
-  //
-  // ```dart
-  // int x = 0;
-  //
-  // int f() => x;
-  //
-  // var y = f();
-  // ```
-  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION =
-      StaticTypeWarningCode(
-          'INVOCATION_OF_NON_FUNCTION_EXPRESSION',
-          "The expression doesn't evaluate to a function, so it can't be "
-              "invoked.",
-          hasPublishedDocs: true);
-
-  /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when a condition, such as an `if` or
-  // `while` loop, doesn't have the static type `bool`.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `x` has the static type
-  // `int`:
-  //
-  // ```dart
-  // void f(int x) {
-  //   if ([!x!]) {
-  //     // ...
-  //   }
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Change the condition so that it produces a Boolean value:
-  //
-  // ```dart
-  // void f(int x) {
-  //   if (x == 0) {
-  //     // ...
-  //   }
-  // }
-  // ```
-  static const StaticTypeWarningCode NON_BOOL_CONDITION = StaticTypeWarningCode(
-      'NON_BOOL_CONDITION', "Conditions must have a static type of 'bool'.",
-      correction: "Try changing the condition.", hasPublishedDocs: true);
-
-  /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the first expression in an
-  // assert has a type other than `bool`.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because the type of `p` is
-  // `int`, but a `bool` is required:
-  //
-  // ```dart
-  // void f(int p) {
-  //   assert([!p!]);
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Change the expression so that it has the type `bool`:
-  //
-  // ```dart
-  // void f(int p) {
-  //   assert(p > 0);
-  // }
-  // ```
-  static const StaticTypeWarningCode NON_BOOL_EXPRESSION =
-      StaticTypeWarningCode('NON_BOOL_EXPRESSION',
-          "The expression in an assert must be of type 'bool'.",
-          correction: "Try changing the expression.", hasPublishedDocs: true);
-
-  /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the operand of the unary
-  // negation operator (`!`) doesn't have the type `bool`.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `x` is an `int` when it
-  // must be a `bool`:
-  //
-  // ```dart
-  // int x = 0;
-  // bool y = ![!x!];
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Replace the operand with an expression that has the type `bool`:
-  //
-  // ```dart
-  // int x = 0;
-  // bool y = !(x > 0);
-  // ```
-  static const StaticTypeWarningCode NON_BOOL_NEGATION_EXPRESSION =
-      StaticTypeWarningCode('NON_BOOL_NEGATION_EXPRESSION',
-          "A negation operand must have a static type of 'bool'.",
-          correction: "Try changing the operand to the '!' operator.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the lexeme of the logical operator
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when one of the operands of either
-  // the `&&` or `||` operator doesn't have the type `bool`.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `a` isn't a Boolean
-  // value:
-  //
-  // ```dart
-  // int a = 3;
-  // bool b = [!a!] || a > 1;
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Change the operand to a Boolean value:
-  //
-  // ```dart
-  // int a = 3;
-  // bool b = a == 0 || a > 1;
-  // ```
-  static const StaticTypeWarningCode NON_BOOL_OPERAND = StaticTypeWarningCode(
-      'NON_BOOL_OPERAND',
-      "The operands of the operator '{0}' must be assignable to 'bool'.",
-      hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name appearing where a type is expected
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when an identifier that isn't a type
-  // is used as a type argument.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `x` is a variable, not
-  // a type:
-  //
-  // ```dart
-  // var x = 0;
-  // List<[!x!]> xList = [];
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Change the type argument to be a type:
-  //
-  // ```dart
-  // var x = 0;
-  // List<int> xList = [];
-  // ```
-  static const StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT =
-      StaticTypeWarningCode('NON_TYPE_AS_TYPE_ARGUMENT',
-          "The name '{0}' isn't a type so it can't be used as a type argument.",
-          correction: "Try correcting the name to an existing type, or "
-              "defining a type named '{0}'.",
-          hasPublishedDocs: true,
-          isUnresolvedIdentifier: true);
-
-  /**
-   * Parameters:
-   * 0: the return type as declared in the return statement
-   * 1: the expected return type as defined by the method
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the static type of a returned
-  // expression isn't assignable to the return type that the closure is required
-  // to have.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `f` is defined to be a
-  // function that returns a `String`, but the closure assigned to it returns an
-  // `int`:
-  //
-  // ```dart
-  // String Function(String) f = (s) => [!3!];
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the return type is correct, then replace the returned value with a value
-  // of the correct type, possibly by converting the existing value:
-  //
-  // ```dart
-  // String Function(String) f = (s) => 3.toString();
-  // ```
-  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_CLOSURE =
-      StaticTypeWarningCode(
-          'RETURN_OF_INVALID_TYPE_FROM_CLOSURE',
-          "The return type '{0}' isn't a '{1}', as required by the closure's "
-              "context.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the return type as declared in the return statement
-   * 1: the expected return type as defined by the enclosing class
-   * 2: the name of the constructor
-   */
-  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR =
-      StaticTypeWarningCodeWithUniqueName(
-          'RETURN_OF_INVALID_TYPE',
-          'StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
-          "A value of type '{0}' can't be returned from constructor '{2}' "
-              "because it has a return type of '{1}'.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the return type as declared in the return statement
-   * 1: the expected return type as defined by the method
-   * 2: the name of the method
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when a method or function returns a
-  // value whose type isn't assignable to the declared return type.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `f` has a return type
-  // of `String` but is returning an `int`:
-  //
-  // ```dart
-  // String f() => [!3!];
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the return type is correct, then replace the value being returned with a
-  // value of the correct type, possibly by converting the existing value:
-  //
-  // ```dart
-  // String f() => 3.toString();
-  // ```
-  //
-  // If the value is correct, then change the return type to match:
-  //
-  // ```dart
-  // int f() => 3;
-  // ```
-  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_FUNCTION =
-      StaticTypeWarningCodeWithUniqueName(
-          'RETURN_OF_INVALID_TYPE',
-          'StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
-          "A value of type '{0}' can't be returned from function '{2}' because "
-              "it has a return type of '{1}'.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the return type as declared in the return statement
-   * 1: the expected return type as defined by the method
-   * 2: the name of the method
-   */
-  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_METHOD =
-      StaticTypeWarningCodeWithUniqueName(
-          'RETURN_OF_INVALID_TYPE',
-          'StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD',
-          "A value of type '{0}' can't be returned from method '{2}' because "
-              "it has a return type of '{1}'.",
-          hasPublishedDocs: true);
-
-  /**
-   * 10 Generics: It is a static type warning if a type parameter is a supertype
-   * of its upper bound.
-   *
-   * Parameters:
-   * 0: the name of the type parameter
-   * 1: the name of the bounding type
-   *
-   * See [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
-   */
-  static const StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND =
-      StaticTypeWarningCode('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND',
-          "'{0}' can't be a supertype of its upper bound.",
-          correction: "Try using a type that is or is a subclass of '{1}'.");
-
-  /**
-   * Parameters:
-   * 0: the name of the enumeration constant that is not defined
-   * 1: the name of the enumeration used to access the constant
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when it encounters an identifier that
-  // appears to be the name of an enum constant, and the name either isn't
-  // defined or isn't visible in the scope in which it's being referenced.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `E` doesn't define a
-  // constant named `c`:
-  //
-  // ```dart
-  // enum E {a, b}
-  //
-  // var e = E.[!c!];
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the constant should be defined, then add it to the declaration of the
-  // enum:
-  //
-  // ```dart
-  // enum E {a, b, c}
-  //
-  // var e = E.c;
-  // ```
-  //
-  // If the constant shouldn't be defined, then change the name to the name of
-  // an existing constant:
-  //
-  // ```dart
-  // enum E {a, b}
-  //
-  // var e = E.b;
-  // ```
-  static const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT =
-      StaticTypeWarningCode('UNDEFINED_ENUM_CONSTANT',
-          "There's no constant named '{0}' in '{1}'.",
-          correction:
-              "Try correcting the name to the name of an existing constant, or "
-              "defining a constant named '{0}'.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the method that is undefined
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when it encounters an identifier that
-  // appears to be the name of a function but either isn't defined or isn't
-  // visible in the scope in which it's being referenced.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because the name `emty` isn't
-  // defined:
-  //
-  // ```dart
-  // List<int> empty() => [];
-  //
-  // void main() {
-  //   print([!emty!]());
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the identifier isn't defined, then either define it or replace it with
-  // the name of a function that is defined. The example above can be corrected
-  // by fixing the spelling of the function:
-  //
-  // ```dart
-  // List<int> empty() => [];
-  //
-  // void main() {
-  //   print(empty());
-  // }
-  // ```
-  //
-  // If the function is defined but isn't visible, then you probably need to add
-  // an import or re-arrange your code to make the function visible.
-  static const StaticTypeWarningCode UNDEFINED_FUNCTION = StaticTypeWarningCode(
-      'UNDEFINED_FUNCTION', "The function '{0}' isn't defined.",
-      correction: "Try importing the library that defines '{0}', "
-          "correcting the name to the name of an existing function, or "
-          "defining a function named '{0}'.",
-      hasPublishedDocs: true,
-      isUnresolvedIdentifier: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the getter
-   * 1: the name of the enclosing type where the getter is being looked for
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when it encounters an identifier that
-  // appears to be the name of a getter but either isn't defined or isn't
-  // visible in the scope in which it's being referenced.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `String` has no member
-  // named `len`:
-  //
-  // ```dart
-  // int f(String s) => s.[!len!];
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the identifier isn't defined, then either define it or replace it with
-  // the name of a getter that is defined. The example above can be corrected by
-  // fixing the spelling of the getter:
-  //
-  // ```dart
-  // int f(String s) => s.length;
-  // ```
-  static const StaticTypeWarningCode UNDEFINED_GETTER = StaticTypeWarningCode(
-      'UNDEFINED_GETTER', "The getter '{0}' isn't defined for the type '{1}'.",
-      correction: "Try importing the library that defines '{0}', "
-          "correcting the name to the name of an existing getter, or "
-          "defining a getter or field named '{0}'.",
-      hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the method that is undefined
-   * 1: the resolved type name that the method lookup is happening on
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when it encounters an identifier that
-  // appears to be the name of a method but either isn't defined or isn't
-  // visible in the scope in which it's being referenced.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because the identifier
-  // `removeMiddle` isn't defined:
-  //
-  // ```dart
-  // int f(List<int> l) => l.[!removeMiddle!]();
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the identifier isn't defined, then either define it or replace it with
-  // the name of a method that is defined. The example above can be corrected by
-  // fixing the spelling of the method:
-  //
-  // ```dart
-  // int f(List<int> l) => l.removeLast();
-  // ```
-  static const StaticTypeWarningCode UNDEFINED_METHOD = StaticTypeWarningCode(
-      'UNDEFINED_METHOD', "The method '{0}' isn't defined for the type '{1}'.",
-      correction:
-          "Try correcting the name to the name of an existing method, or "
-          "defining a method named '{0}'.",
-      hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the operator
-   * 1: the name of the enclosing type where the operator is being looked for
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when a user-definable operator is
-  // invoked on an object for which the operator isn't defined.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because the class `C` doesn't
-  // define the operator `+`:
-  //
-  // ```dart
-  // class C {}
-  //
-  // C f(C c) => c [!+!] 2;
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the operator should be defined for the class, then define it:
-  //
-  // ```dart
-  // class C {
-  //   C operator +(int i) => this;
-  // }
-  //
-  // C f(C c) => c + 2;
-  // ```
-  static const StaticTypeWarningCode UNDEFINED_OPERATOR = StaticTypeWarningCode(
-      'UNDEFINED_OPERATOR',
-      "The operator '{0}' isn't defined for the type '{1}'.",
-      correction: "Try defining the operator '{0}'.",
-      hasPublishedDocs: true);
-
-  /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when a prefixed identifier is found
-  // where the prefix is valid, but the identifier isn't declared in any of the
-  // libraries imported using that prefix.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `dart:core` doesn't
-  // define anything named `a`:
-  //
-  // ```dart
-  // import 'dart:core' as p;
-  //
-  // void f() {
-  //   p.[!a!];
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the library in which the name is declared isn't imported yet, add an
-  // import for the library.
-  //
-  // If the name is wrong, then change it to one of the names that's declared in
-  // the imported libraries.
-  static const StaticTypeWarningCode UNDEFINED_PREFIXED_NAME =
-      StaticTypeWarningCode(
-          'UNDEFINED_PREFIXED_NAME',
-          "The name '{0}' is being referenced through the prefix '{1}', but it "
-              "isn't defined in any of the libraries imported using that "
-              "prefix.",
-          correction: "Try correcting the prefix or "
-              "importing the library that defines '{0}'.",
-          hasPublishedDocs: true);
-
-  /**
-   * Parameters:
-   * 0: the name of the setter
-   * 1: the name of the enclosing type where the setter is being looked for
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when it encounters an identifier that
-  // appears to be the name of a setter but either isn't defined or isn't
-  // visible in the scope in which the identifier is being referenced.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because there isn't a setter
-  // named `z`:
-  //
-  // ```dart
-  // class C {
-  //   int x = 0;
-  //   void m(int y) {
-  //     this.[!z!] = y;
-  //   }
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the identifier isn't defined, then either define it or replace it with
-  // the name of a setter that is defined. The example above can be corrected by
-  // fixing the spelling of the setter:
-  //
-  // ```dart
-  // class C {
-  //   int x = 0;
-  //   void m(int y) {
-  //     this.x = y;
-  //   }
-  // }
-  // ```
-  static const StaticTypeWarningCode UNDEFINED_SETTER = StaticTypeWarningCode(
-      'UNDEFINED_SETTER', "The setter '{0}' isn't defined for the type '{1}'.",
-      correction: "Try importing the library that defines '{0}', "
-          "correcting the name to the name of an existing setter, or "
-          "defining a setter or field named '{0}'.",
-      hasPublishedDocs: true);
-
-  /**
-   * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
-   * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
-   *
-   * Parameters:
-   * 0: the name of the getter
-   * 1: the name of the enclosing type where the getter is being looked for
-   */
-  static const StaticTypeWarningCode UNDEFINED_SUPER_GETTER =
-      StaticTypeWarningCode('UNDEFINED_SUPER_GETTER',
-          "The getter '{0}' isn't defined in a superclass of '{1}'.",
-          correction:
-              "Try correcting the name to the name of an existing getter, or "
-              "defining a getter or field named '{0}' in a superclass.");
-
-  /**
-   * Parameters:
-   * 0: the name of the method that is undefined
-   * 1: the resolved type name that the method lookup is happening on
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when an inherited method is
-  // referenced using `super`, but there’s no method with that name in the
-  // superclass chain.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `Object` doesn't define
-  // a member named `n`:
-  //
-  // ```dart
-  // class C {
-  //   void m() {
-  //     super.[!n!]();
-  //   }
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // If the inherited method you intend to invoke has a different name, then
-  // make the name of the invoked method  match the inherited method.
-  //
-  // If the method you intend to invoke is defined in the same class, then
-  // remove the `super.`.
-  //
-  // If not, then either add the method to one of the superclasses or remove the
-  // invocation.
-  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD =
-      StaticTypeWarningCode('UNDEFINED_SUPER_METHOD',
-          "The method '{0}' isn't defined in a superclass of '{1}'.",
-          correction:
-              "Try correcting the name to the name of an existing method, or "
-              "defining a method named '{0}' in a superclass.",
-          hasPublishedDocs: true);
-
-  /**
-   * 12.18 Assignment: Evaluation of an assignment of the form
-   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
-   * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
-   * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
-   * <i>e<sub>2</sub></i>).
-   *
-   * 12.29 Assignable Expressions: An assignable expression of the form
-   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
-   * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
-   * <i>e<sub>2</sub></i>.
-   *
-   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
-   * It is a static type warning if <i>T</i> does not have an accessible
-   * instance member named <i>m</i>.
-   *
-   * Parameters:
-   * 0: the name of the operator
-   * 1: the name of the enclosing type where the operator is being looked for
-   */
-  static const StaticTypeWarningCode UNDEFINED_SUPER_OPERATOR =
-      StaticTypeWarningCode('UNDEFINED_SUPER_OPERATOR',
-          "The operator '{0}' isn't defined in a superclass of '{1}'.",
-          correction: "Try defining the operator '{0}' in a superclass.");
-
-  /**
-   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
-   * It is a static type warning if <i>T</i> does not have an accessible
-   * instance setter named <i>v=</i>.
-   *
-   * Parameters:
-   * 0: the name of the setter
-   * 1: the name of the enclosing type where the setter is being looked for
-   */
-  static const StaticTypeWarningCode UNDEFINED_SUPER_SETTER =
-      StaticTypeWarningCode('UNDEFINED_SUPER_SETTER',
-          "The setter '{0}' isn't defined in a superclass of '{1}'.",
-          correction:
-              "Try correcting the name to the name of an existing setter, or "
-              "defining a setter or field named '{0}' in a superclass.");
-
-  /**
-   * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
-   * not have an accessible (3.2) instance member named <i>m</i>.
-   *
-   * This is a specialization of [INSTANCE_ACCESS_TO_STATIC_MEMBER] that is used
-   * when we are able to find the name defined in a supertype. It exists to
-   * provide a more informative error message.
-   *
-   * Parameters:
-   * 0: the name of the defining type
-   */
-  static const StaticTypeWarningCode
-      UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = StaticTypeWarningCode(
-          'UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER',
-          "Static members from supertypes must be qualified by the name of the "
-              "defining type.",
-          correction: "Try adding '{0}.' before the name.");
-
-  /**
-   * Parameters:
-   * 0: the name of the type being referenced (<i>G</i>)
-   * 1: the number of type parameters that were declared
-   * 2: the number of type arguments provided
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when a type that has type parameters
-  // is used and type arguments are provided, but the number of type arguments
-  // isn't the same as the number of type parameters.
-  //
-  // The analyzer also produces this diagnostic when a constructor is invoked
-  // and the number of type arguments doesn't match the number of type
-  // parameters declared for the class.
-  //
-  // #### Examples
-  //
-  // The following code produces this diagnostic because `C` has one type
-  // parameter but two type arguments are provided when it is used as a type
-  // annotation:
-  //
-  // ```dart
-  // class C<E> {}
-  //
-  // void f([!C<int, int>!] x) {}
-  // ```
-  //
-  // The following code produces this diagnostic because `C` declares one type
-  // parameter, but two type arguments are provided when creating an instance:
-  //
-  // ```dart
-  // class C<E> {}
-  //
-  // var c = [!C<int, int>!]();
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Add or remove type arguments, as necessary, to match the number of type
-  // parameters defined for the type:
-  //
-  // ```dart
-  // class C<E> {}
-  //
-  // void f(C<int> x) {}
-  // ```
-  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS =
-      StaticTypeWarningCode(
-          'WRONG_NUMBER_OF_TYPE_ARGUMENTS',
-          "The type '{0}' is declared with {1} type parameters, "
-              "but {2} type arguments were given.",
-          correction:
-              "Try adjusting the number of type arguments to match the number "
-              "of type parameters.",
-          hasPublishedDocs: true);
-
-  /**
-   * It will be a static type warning if <i>m</i> is not a generic method with
-   * exactly <i>n</i> type parameters.
-   *
-   * Parameters:
-   * 0: the name of the class being instantiated
-   * 1: the name of the constructor being invoked
-   */
-  static const StaticTypeWarningCode
-      WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR = StaticTypeWarningCode(
-          'WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR',
-          "The constructor '{0}.{1}' doesn't have type parameters.",
-          correction: "Try moving type arguments to after the type name.");
-
-  /**
-   * It will be a static type warning if <i>m</i> is not a generic method with
-   * exactly <i>n</i> type parameters.
-   *
-   * Parameters:
-   * 0: the name of the method being referenced (<i>G</i>)
-   * 1: the number of type parameters that were declared
-   * 2: the number of type arguments provided
-   */
-  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD =
-      StaticTypeWarningCode(
-          'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
-          "The method '{0}' is declared with {1} type parameters, "
-              "but {2} type arguments were given.",
-          correction: "Try adjusting the number of type arguments.");
-
-  /**
-   * 17.16.1 Yield: Let T be the static type of e [the expression to the right
-   * of "yield"] and let f be the immediately enclosing function.  It is a
-   * static type warning if either:
-   *
-   * - the body of f is marked async* and the type Stream<T> may not be
-   *   assigned to the declared return type of f.
-   *
-   * - the body of f is marked sync* and the type Iterable<T> may not be
-   *   assigned to the declared return type of f.
-   *
-   * 17.16.2 Yield-Each: Let T be the static type of e [the expression to the
-   * right of "yield*"] and let f be the immediately enclosing function.  It is
-   * a static type warning if T may not be assigned to the declared return type
-   * of f.  If f is synchronous it is a static type warning if T may not be
-   * assigned to Iterable.  If f is asynchronous it is a static type warning if
-   * T may not be assigned to Stream.
-   */
-  static const StaticTypeWarningCode YIELD_OF_INVALID_TYPE =
-      StaticTypeWarningCode(
-          'YIELD_OF_INVALID_TYPE',
-          "The type '{0}' implied by the 'yield' expression must be assignable "
-              "to '{1}'.");
-
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
-  const StaticTypeWarningCode(String name, String message,
-      {String correction,
-      bool hasPublishedDocs,
-      bool isUnresolvedIdentifier = false})
-      : super.temporary(name, message,
-            correction: correction,
-            hasPublishedDocs: hasPublishedDocs,
-            isUnresolvedIdentifier: isUnresolvedIdentifier);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
-
-  @override
-  ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
-}
-
-class StaticTypeWarningCodeWithUniqueName extends StaticTypeWarningCode {
-  @override
-  final String uniqueName;
-
-  const StaticTypeWarningCodeWithUniqueName(
-      String name, this.uniqueName, String message,
-      {String correction, bool hasPublishedDocs})
-      : super(name, message,
-            correction: correction, hasPublishedDocs: hasPublishedDocs);
-}
-
-/**
  * The error codes used for static warnings. The convention for this class is
  * for the name of the error code to indicate the problem that caused the error
  * to be generated and for the error message to explain what is wrong and, when
@@ -10485,7 +10485,7 @@
           'INVALID_NULL_AWARE_OPERATOR',
           "The target expression can't be null, so the null-aware operator "
               "'{0}' can't be used.",
-          correction: "Try replace the operator '{0}' with '{1}'.",
+          correction: "Try replacing the operator '{0}' with '{1}'.",
           hasPublishedDocs: true);
 
   /**
@@ -10500,7 +10500,7 @@
           'INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT',
           "The target expression can't be null because of short-circuiting, so "
               "the null-aware operator '{0}' can't be used.",
-          correction: "Try replace the operator '{0}' with '{1}'.",
+          correction: "Try replacing the operator '{0}' with '{1}'.",
           hasPublishedDocs: true);
 
   /**
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart
index 5e0ee73..9d78748 100644
--- a/pkg/analyzer/lib/src/error/return_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -119,7 +119,7 @@
       } else {
         checkElement(
           _typeProvider.futureElement,
-          StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
+          CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE,
         );
       }
     } else if (enclosingExecutable.isGenerator) {
@@ -157,25 +157,25 @@
     void reportTypeError() {
       if (enclosingExecutable.isClosure) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
           expression,
           [S, T],
         );
       } else if (enclosingExecutable.isConstructor) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
           expression,
           [S, T, enclosingExecutable.displayName],
         );
       } else if (enclosingExecutable.isFunction) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
           expression,
           [S, T, enclosingExecutable.displayName],
         );
       } else if (enclosingExecutable.isMethod) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
           expression,
           [S, T, enclosingExecutable.displayName],
         );
@@ -258,25 +258,25 @@
     void reportTypeError() {
       if (enclosingExecutable.isClosure) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
           expression,
           [S, T],
         );
       } else if (enclosingExecutable.isConstructor) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
           expression,
           [S, T, enclosingExecutable.displayName],
         );
       } else if (enclosingExecutable.isFunction) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
           expression,
           [S, T, enclosingExecutable.displayName],
         );
       } else if (enclosingExecutable.isMethod) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
           expression,
           [S, T, enclosingExecutable.displayName],
         );
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index ed3f577..ed0cec8 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -48,7 +48,7 @@
         );
       }
       _checkTypeArgumentCount(typeArguments, 1,
-          StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
+          CompileTimeErrorCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
     }
     _checkForImplicitDynamicTypedLiteral(node);
   }
@@ -63,7 +63,7 @@
         );
       }
       _checkTypeArgumentCount(typeArguments, 2,
-          StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
+          CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
     }
     _checkForImplicitDynamicTypedLiteral(node);
   }
@@ -83,7 +83,7 @@
         );
       }
       _checkTypeArgumentCount(typeArguments, 1,
-          StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
+          CompileTimeErrorCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
     }
     _checkForImplicitDynamicTypedLiteral(node);
   }
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 16646b8..2fd3549 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -130,7 +130,7 @@
         var type1 = arguments['type'];
         var type2 = arguments['type2'];
         errorReporter?.reportErrorForOffset(
-            StaticTypeWarningCode.INVALID_ASSIGNMENT,
+            CompileTimeErrorCode.INVALID_ASSIGNMENT,
             offset,
             length,
             [type1, type2]);
@@ -288,15 +288,15 @@
         return;
       case "UNDEFINED_GETTER":
         errorReporter?.reportErrorForOffset(
-            StaticTypeWarningCode.UNDEFINED_GETTER, offset, length);
+            CompileTimeErrorCode.UNDEFINED_GETTER, offset, length);
         return;
       case "UNDEFINED_METHOD":
         errorReporter?.reportErrorForOffset(
-            StaticTypeWarningCode.UNDEFINED_METHOD, offset, length);
+            CompileTimeErrorCode.UNDEFINED_METHOD, offset, length);
         return;
       case "UNDEFINED_SETTER":
         errorReporter?.reportErrorForOffset(
-            StaticTypeWarningCode.UNDEFINED_SETTER, offset, length);
+            CompileTimeErrorCode.UNDEFINED_SETTER, offset, length);
         return;
       case "UNEXPECTED_DOLLAR_IN_STRING":
         errorReporter?.reportErrorForOffset(
@@ -322,7 +322,7 @@
         return;
       case "WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR":
         errorReporter?.reportErrorMessage(
-            StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+            CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
             offset,
             length,
             message);
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 7b6a003..ac374e1 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -521,7 +521,7 @@
               [identifier.name]);
         } else {
           _errorReporter.reportErrorForNode(
-              StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME,
+              CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME,
               identifier,
               [identifier.name, prefixElement.name]);
         }
@@ -787,7 +787,10 @@
       }
       return;
     } else {
-      if (element.isFactory) {
+      if (element.isFactory &&
+          // Check if we've reported [NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS].
+          !element.enclosingElement.constructors
+              .every((constructor) => constructor.isFactory)) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
       }
@@ -851,7 +854,7 @@
   }
 
   /// Check that the given index [expression] was resolved, otherwise a
-  /// [StaticTypeWarningCode.UNDEFINED_OPERATOR] is generated. The [target] is
+  /// [CompileTimeErrorCode.UNDEFINED_OPERATOR] is generated. The [target] is
   /// the target of the expression. The [methodName] is the name of the operator
   /// associated with the context of using of the given index expression.
   void _checkForUndefinedIndexOperator(
@@ -886,7 +889,7 @@
       );
     } else if (target is SuperExpression) {
       _errorReporter.reportErrorForOffset(
-        StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+        CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
         offset,
         length,
         [methodName, staticType],
@@ -904,7 +907,7 @@
       );
     } else {
       _errorReporter.reportErrorForOffset(
-        StaticTypeWarningCode.UNDEFINED_OPERATOR,
+        CompileTimeErrorCode.UNDEFINED_OPERATOR,
         offset,
         length,
         [methodName, staticType],
@@ -1320,8 +1323,8 @@
           _checkForStaticAccessToInstanceMember(propertyName, element);
         } else {
           var code = typeReference.isEnum
-              ? StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT
-              : StaticTypeWarningCode.UNDEFINED_GETTER;
+              ? CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT
+              : CompileTimeErrorCode.UNDEFINED_GETTER;
           _errorReporter.reportErrorForNode(
             code,
             propertyName,
@@ -1356,7 +1359,7 @@
             // The error will be reported in ErrorVerifier.
           } else {
             _errorReporter.reportErrorForNode(
-              StaticTypeWarningCode.UNDEFINED_SETTER,
+              CompileTimeErrorCode.UNDEFINED_SETTER,
               propertyName,
               [propertyName.name, typeReference.name],
             );
@@ -1392,7 +1395,7 @@
               );
             } else {
               _errorReporter.reportErrorForNode(
-                StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
+                CompileTimeErrorCode.UNDEFINED_SUPER_GETTER,
                 propertyName,
                 [propertyName.name, staticType],
               );
@@ -1433,7 +1436,7 @@
               }
             } else {
               _errorReporter.reportErrorForNode(
-                StaticTypeWarningCode.UNDEFINED_SUPER_SETTER,
+                CompileTimeErrorCode.UNDEFINED_SUPER_SETTER,
                 propertyName,
                 [propertyName.name, staticType],
               );
@@ -1494,7 +1497,7 @@
       }
       if (shouldReportUndefinedGetter) {
         _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.UNDEFINED_GETTER,
+          CompileTimeErrorCode.UNDEFINED_GETTER,
           propertyName,
           [propertyName.name, staticType],
         );
@@ -1517,7 +1520,7 @@
           // OK
         } else {
           _errorReporter.reportErrorForNode(
-            StaticTypeWarningCode.UNDEFINED_SETTER,
+            CompileTimeErrorCode.UNDEFINED_SETTER,
             propertyName,
             [propertyName.name, staticType],
           );
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 5821ce0..a195ba9 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -401,7 +401,6 @@
       _duplicateDefinitionVerifier.checkClass(node);
       _checkForBuiltInIdentifierAsName(
           node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
-      _checkForNoDefaultSuperConstructorImplicit(node);
       _checkForConflictingClassTypeVariableErrorCodes();
       TypeName superclass = node.extendsClause?.superclass;
       ImplementsClause implementsClause = node.implementsClause;
@@ -711,7 +710,7 @@
         node.staticElement == null &&
         !_isFunctionType(expressionType)) {
       _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
+          CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
           functionExpression);
     } else if (expressionType is FunctionType) {
       _typeArgumentsVerifier.checkFunctionExpressionInvocation(node);
@@ -1250,7 +1249,8 @@
     // class.
     if (!_checkForExtendsDisallowedClass(superclass) &&
         !_checkForImplementsClauseErrorCodes(implementsClause) &&
-        !_checkForAllMixinErrorCodes(withClause)) {
+        !_checkForAllMixinErrorCodes(withClause) &&
+        !_checkForNoGenerativeConstructorsInSuperclass(superclass)) {
       _checkForImplicitDynamicType(superclass);
       _checkForExtendsDeferredClass(superclass);
       _checkForRepeatedType(implementsClause?.interfaces,
@@ -1260,6 +1260,9 @@
       _checkMixinInference(node, withClause);
       _checkForMixinWithConflictingPrivateMember(withClause, superclass);
       _checkForConflictingGenerics(node);
+      if (node is ClassDeclaration) {
+        _checkForNoDefaultSuperConstructorImplicit(node);
+      }
     }
   }
 
@@ -1537,8 +1540,21 @@
       DartType expectedStaticType,
       ErrorCode errorCode) {
     if (!_typeSystem.isAssignableTo2(actualStaticType, expectedStaticType)) {
+      AstNode getErrorNode(AstNode node) {
+        if (node is CascadeExpression) {
+          return getErrorNode(node.target);
+        }
+        if (node is ParenthesizedExpression) {
+          return getErrorNode(node.expression);
+        }
+        return node;
+      }
+
       _errorReporter.reportErrorForNode(
-          errorCode, expression, [actualStaticType, expectedStaticType]);
+        errorCode,
+        getErrorNode(expression),
+        [actualStaticType, expectedStaticType],
+      );
       return false;
     }
     return true;
@@ -2241,7 +2257,7 @@
 
     if (!_typeSystem.isAssignableTo2(iterableType, requiredSequenceType)) {
       _errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
+        CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
         node.iterable,
         [iterableType, loopTypeName],
       );
@@ -2265,7 +2281,7 @@
 
     if (!_typeSystem.isAssignableTo2(sequenceElementType, variableType)) {
       _errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
+        CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
         node.iterable,
         [iterableType, loopTypeName, variableType],
       );
@@ -2765,7 +2781,7 @@
   /// Check that the given [typeReference] is not a type reference and that then
   /// the [name] is reference to an instance member.
   ///
-  /// See [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
+  /// See [CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
   void _checkForInstanceAccessToStaticMember(
       ClassElement typeReference, Expression target, SimpleIdentifier name) {
     if (_isInComment) {
@@ -2802,7 +2818,7 @@
         }
       }
       _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+          CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
           name,
           [name.name, _getKind(element), element.enclosingElement.name]);
     }
@@ -2838,7 +2854,7 @@
   /// Verify that the given left hand side ([lhs]) and right hand side ([rhs])
   /// represent a valid assignment.
   ///
-  /// See [StaticTypeWarningCode.INVALID_ASSIGNMENT].
+  /// See [CompileTimeErrorCode.INVALID_ASSIGNMENT].
   void _checkForInvalidAssignment(Expression lhs, Expression rhs) {
     if (lhs == null || rhs == null) {
       return;
@@ -2863,7 +2879,7 @@
     }
 
     _checkForAssignableExpression(
-        rhs, leftType, StaticTypeWarningCode.INVALID_ASSIGNMENT);
+        rhs, leftType, CompileTimeErrorCode.INVALID_ASSIGNMENT);
   }
 
   /// Check the given [initializer] to ensure that the field being initialized
@@ -3388,9 +3404,9 @@
     if (superUnnamedConstructor != null) {
       if (superUnnamedConstructor.isFactory) {
         _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
+            CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR,
             declaration.name,
-            [superUnnamedConstructor]);
+            [superElement.name, _enclosingClass.name, superUnnamedConstructor]);
         return;
       }
       if (superUnnamedConstructor.isDefaultConstructor) {
@@ -3408,6 +3424,35 @@
     }
   }
 
+  bool _checkForNoGenerativeConstructorsInSuperclass(TypeName superclass) {
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    if (_enclosingClass.constructors
+        .every((constructor) => constructor.isFactory)) {
+      // A class with no generative constructors *can* be extended if the
+      // subclass has only factory constructors.
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    if (superElement.constructors.isEmpty) {
+      // Exclude empty constructor set, which indicates other errors occurred.
+      return false;
+    }
+    if (superElement.constructors
+        .every((constructor) => constructor.isFactory)) {
+      // For `E extends Exception`, etc., this will never work, because it has
+      // no generative constructors. State this clearly to users.
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS,
+          superclass,
+          [_enclosingClass.name, superElement.name]);
+      return true;
+    }
+    return false;
+  }
+
   /// Verify the given map [literal] either:
   /// * has `const modifier`
   /// * has explicit type arguments
@@ -3433,6 +3478,7 @@
       return;
     }
 
+    /// TODO(srawlins): Add any tests showing this is reported.
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, literal);
   }
@@ -4051,7 +4097,7 @@
 
   /// Check that none of the type [parameters] references itself in its bound.
   ///
-  /// See [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
+  /// See [CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
   void _checkForTypeParameterBoundRecursion(List<TypeParameter> parameters) {
     Map<TypeParameterElement, TypeParameter> elementToNode;
     for (var parameter in parameters) {
@@ -4074,7 +4120,7 @@
           if (step == parameters.length) {
             var element = parameter.declaredElement;
             _errorReporter.reportErrorForNode(
-              StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
+              CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
               parameter,
               [element.displayName, element.bound],
             );
@@ -4141,6 +4187,11 @@
       return;
     }
     ClassElement superElement = superType.element;
+    if (superElement.constructors
+        .every((constructor) => constructor.isFactory)) {
+      // Already reported [NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS].
+      return;
+    }
     ConstructorElement superUnnamedConstructor =
         superElement.unnamedConstructor;
     if (superUnnamedConstructor != null) {
@@ -4256,7 +4307,7 @@
   /// defined in the enclosing class rather than in a superclass.
   ///
   /// See
-  /// [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
+  /// [CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
   void _checkForUnqualifiedReferenceToNonLocalStaticMember(
       SimpleIdentifier name) {
     Element element = name.staticElement;
@@ -4289,8 +4340,7 @@
           [enclosingElement.displayName]);
     } else {
       _errorReporter.reportErrorForNode(
-          StaticTypeWarningCode
-              .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
           name,
           [enclosingElement.displayName]);
     }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index b57f4fe..49cc989 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -616,7 +616,7 @@
     node.condition?.accept(this);
     boolExpressionVerifier.checkForNonBoolExpression(
       node.condition,
-      errorCode: StaticTypeWarningCode.NON_BOOL_EXPRESSION,
+      errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
     );
     _flowAnalysis?.flow?.assert_afterCondition(node.condition);
     node.message?.accept(this);
@@ -630,7 +630,7 @@
     node.condition?.accept(this);
     boolExpressionVerifier.checkForNonBoolExpression(
       node.condition,
-      errorCode: StaticTypeWarningCode.NON_BOOL_EXPRESSION,
+      errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
     );
     _flowAnalysis?.flow?.assert_afterCondition(node.condition);
     node.message?.accept(this);
diff --git a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
index 517c647..d019194 100644
--- a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
+++ b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
@@ -2,9 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:collection';
-
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /// Information about analysis `//ignore:` and `//ignore_for_file` comments
@@ -31,26 +32,73 @@
   static final RegExp _IGNORE_FOR_FILE_MATCHER =
       RegExp(r'//[ ]*ignore_for_file:(.*)$', multiLine: true);
 
-  final Map<int, List<String>> _ignoreMap = HashMap<int, List<String>>();
+  /// A table mapping line numbers to the diagnostics that are ignored on that
+  /// line.
+  final Map<int, List<_DiagnosticName>> _ignoredOnLine = {};
 
-  final Set<String> _ignoreForFileSet = HashSet<String>();
+  /// A list containing all of the diagnostics that are ignored for the whole
+  /// file.
+  final List<_DiagnosticName> _ignoredForFile = [];
 
-  /// Whether this info object defines any ignores.
-  bool get hasIgnores => _ignoreMap.isNotEmpty || _ignoreForFileSet.isNotEmpty;
+  IgnoreInfo();
 
-  /// Test whether this [errorCode] is ignored at the given [line].
-  bool ignoredAt(String errorCode, int line) =>
-      _ignoreForFileSet.contains(errorCode) ||
-      _ignoreMap[line]?.contains(errorCode) == true;
+  /// Initialize a newly created instance of this class to represent the ignore
+  /// comments in the given compilation [unit].
+  IgnoreInfo.forDart(CompilationUnit unit, String content) {
+    var lineInfo = unit.lineInfo;
+    for (var comment in unit.ignoreComments) {
+      var lexeme = comment.lexeme;
+      if (lexeme.contains('ignore:')) {
+        var location = lineInfo.getLocation(comment.offset);
+        var lineNumber = location.lineNumber;
+        String beforeMatch = content.substring(
+            lineInfo.getOffsetOfLine(lineNumber - 1),
+            lineInfo.getOffsetOfLine(lineNumber - 1) +
+                location.columnNumber -
+                1);
+        if (beforeMatch.trim().isEmpty) {
+          // The comment is on its own line, so it refers to the next line.
+          lineNumber++;
+        }
+        _ignoredOnLine
+            .putIfAbsent(lineNumber, () => [])
+            .addAll(comment.diagnosticNames);
+      } else if (lexeme.contains('ignore_for_file:')) {
+        _ignoredForFile.addAll(comment.diagnosticNames);
+      }
+    }
+  }
+
+  /// Return `true` if there are any ignore comments in the file.
+  bool get hasIgnores =>
+      _ignoredOnLine.isNotEmpty || _ignoredForFile.isNotEmpty;
+
+  /// Return `true` if the [errorCode] is ignored at the given [line].
+  bool ignoredAt(String errorCode, int line) {
+    for (var name in _ignoredForFile) {
+      if (name.matches(errorCode)) {
+        return true;
+      }
+    }
+    var ignoredOnLine = _ignoredOnLine[line];
+    if (ignoredOnLine != null) {
+      for (var name in ignoredOnLine) {
+        if (name.matches(errorCode)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
 
   /// Ignore these [errorCodes] at [line].
-  void _addAll(int line, Iterable<String> errorCodes) {
-    _ignoreMap.putIfAbsent(line, () => <String>[]).addAll(errorCodes);
+  void _addAll(int line, Iterable<_DiagnosticName> errorCodes) {
+    _ignoredOnLine.putIfAbsent(line, () => []).addAll(errorCodes);
   }
 
   /// Ignore these [errorCodes] in the whole file.
-  void _addAllForFile(Iterable<String> errorCodes) {
-    _ignoreForFileSet.addAll(errorCodes);
+  void _addAllForFile(Iterable<_DiagnosticName> errorCodes) {
+    _ignoredForFile.addAll(errorCodes);
   }
 
   /// Calculate ignores for the given [content] with line [info].
@@ -64,10 +112,13 @@
     IgnoreInfo ignoreInfo = IgnoreInfo();
     for (Match match in matches) {
       // See _IGNORE_MATCHER for format --- note the possibility of error lists.
-      Iterable<String> codes = match
+      // Note that the offsets are not being computed here. This shouldn't
+      // affect older clients of this class because none of the previous APIs
+      // depended on having offsets.
+      Iterable<_DiagnosticName> codes = match
           .group(1)
           .split(',')
-          .map((String code) => code.trim().toLowerCase());
+          .map((String code) => _DiagnosticName(code.trim().toLowerCase(), -1));
       CharacterLocation location = info.getLocation(match.start);
       int lineNumber = location.lineNumber;
       String beforeMatch = content.substring(
@@ -82,13 +133,75 @@
         ignoreInfo._addAll(lineNumber, codes);
       }
     }
+    // Note that the offsets are not being computed here. This shouldn't affect
+    // older clients of this class because none of the previous APIs depended on
+    // having offsets.
     for (Match match in fileMatches) {
-      Iterable<String> codes = match
+      Iterable<_DiagnosticName> codes = match
           .group(1)
           .split(',')
-          .map((String code) => code.trim().toLowerCase());
+          .map((String code) => _DiagnosticName(code.trim().toLowerCase(), -1));
       ignoreInfo._addAllForFile(codes);
     }
     return ignoreInfo;
   }
 }
+
+/// The name and location of a diagnostic name in an ignore comment.
+class _DiagnosticName {
+  /// The name of the diagnostic being ignored.
+  final String name;
+
+  /// The offset of the diagnostic in the source file.
+  final int offset;
+
+  /// Initialize a newly created diagnostic name to have the given [name] and
+  /// [offset].
+  _DiagnosticName(this.name, this.offset);
+
+  /// Return `true` if this diagnostic name matches the given error code.
+  bool matches(String errorCode) => name == errorCode;
+}
+
+extension on CompilationUnit {
+  /// Return all of the ignore comments in this compilation unit.
+  Iterable<CommentToken> get ignoreComments sync* {
+    Iterable<CommentToken> processPrecedingComments(Token currentToken) sync* {
+      var comment = currentToken.precedingComments;
+      while (comment != null) {
+        var lexeme = comment.lexeme;
+        var match = IgnoreInfo._IGNORE_MATCHER.matchAsPrefix(lexeme);
+        if (match != null) {
+          yield comment;
+        } else {
+          match = IgnoreInfo._IGNORE_FOR_FILE_MATCHER.matchAsPrefix(lexeme);
+          if (match != null) {
+            yield comment;
+          }
+        }
+        comment = comment.next;
+      }
+    }
+
+    var currentToken = beginToken;
+    while (currentToken != currentToken.next) {
+      yield* processPrecedingComments(currentToken);
+      currentToken = currentToken.next;
+    }
+    yield* processPrecedingComments(currentToken);
+  }
+}
+
+extension on CommentToken {
+  /// Return the diagnostic names contained in this comment, assuming that it is
+  /// a correctly formatted ignore comment.
+  Iterable<_DiagnosticName> get diagnosticNames sync* {
+    int offset = lexeme.indexOf(':') + 1;
+    var names = lexeme.substring(offset).split(',');
+    offset += this.offset;
+    for (var name in names) {
+      yield _DiagnosticName(name.trim().toLowerCase(), offset);
+      offset += name.length + 1;
+    }
+  }
+}
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
index 0d43ce3..1ac317b 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
@@ -26,342 +26,6 @@
     ]);
   }
 
-  test_fieldFormalParameterAssignableToField_extends() async {
-    // According to checked-mode type checking rules, a value of type B is
-    // assignable to a field of type A, because B extends A (and hence is a
-    // subtype of A).
-    await assertNoErrorsInCode(r'''
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-class C {
-  final A a;
-  const C(this.a);
-}
-var v = const C(const B());
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() async {
-    // Null always passes runtime type checks, even when the type is
-    // unresolved.
-    await assertErrorsInCode(r'''
-class A {
-  final Unresolved x;
-  const A(String this.x);
-}
-var v = const A(null);
-''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
-    ]);
-  }
-
-  test_fieldFormalParameterAssignableToField_implements() async {
-    // According to checked-mode type checking rules, a value of type B is
-    // assignable to a field of type A, because B implements A (and hence is a
-    // subtype of A).
-    await assertNoErrorsInCode(r'''
-class A {}
-class B implements A {
-  const B();
-}
-class C {
-  final A a;
-  const C(this.a);
-}
-var v = const C(const B());
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_list_dynamic() async {
-    // [1, 2, 3] has type List<dynamic>, which is a subtype of List<int>.
-    await assertNoErrorsInCode(r'''
-class A {
-  const A(List<int> x);
-}
-var x = const A(const [1, 2, 3]);
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_list_nonDynamic() async {
-    // <int>[1, 2, 3] has type List<int>, which is a subtype of List<num>.
-    await assertNoErrorsInCode(r'''
-class A {
-  const A(List<num> x);
-}
-var x = const A(const <int>[1, 2, 3]);
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_map_dynamic() async {
-    // {1: 2} has type Map<dynamic, dynamic>, which is a subtype of
-    // Map<int, int>.
-    await assertNoErrorsInCode(r'''
-class A {
-  const A(Map<int, int> x);
-}
-var x = const A(const {1: 2});
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_map_keyDifferent() async {
-    // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
-    // Map<num, int>.
-    await assertNoErrorsInCode(r'''
-class A {
-  const A(Map<num, int> x);
-}
-var x = const A(const <int, int>{1: 2});
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_map_valueDifferent() async {
-    // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
-    // Map<int, num>.
-    await assertNoErrorsInCode(r'''
-class A {
-  const A(Map<int, num> x);
-}
-var x = const A(const <int, int>{1: 2});
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_notype() async {
-    // If a field is declared without a type, then any value may be assigned to
-    // it.
-    await assertNoErrorsInCode(r'''
-class A {
-  final x;
-  const A(this.x);
-}
-var v = const A(5);
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_null() async {
-    // Null is assignable to anything.
-    await assertNoErrorsInCode(r'''
-class A {
-  final int x;
-  const A(this.x);
-}
-var v = const A(null);
-''');
-  }
-
-  test_fieldFormalParameterAssignableToField_typedef() async {
-    // foo has the runtime type dynamic -> dynamic, so it is not assignable
-    // to A.f.
-    await assertErrorsInCode(r'''
-typedef String Int2String(int x);
-class A {
-  final Int2String f;
-  const A(this.f);
-}
-foo(x) => 1;
-var v = const A(foo);
-''', [
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 116, 3),
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          116,
-          3),
-    ]);
-  }
-
-  test_fieldFormalParameterAssignableToField_typeSubstitution() async {
-    // foo has the runtime type dynamic -> dynamic, so it should be assignable
-    // to A.f.
-    await assertNoErrorsInCode(r'''
-class A<T> {
-  final T x;
-  const A(this.x);
-}
-var v = const A<int>(3);
-''');
-  }
-
-  test_fieldFormalParameterNotAssignableToField() async {
-    await assertErrorsInCode(r'''
-class A {
-  final int x;
-  const A(this.x);
-}
-var v = const A('foo');
-''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          62,
-          5),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 62, 5),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_extends() async {
-    // According to checked-mode type checking rules, a value of type A is not
-    // assignable to a field of type B, because B extends A (the subtyping
-    // relationship is in the wrong direction).
-    await assertErrorsInCode(r'''
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-class C {
-  final B b;
-  const C(this.b);
-}
-const A u = const A();
-var v = const C(u);
-''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          143,
-          1),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_fieldType() async {
-    await assertErrorsInCode(r'''
-class A {
-  final int x;
-  const A(this.x);
-}
-var v = const A('foo');
-''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          62,
-          5),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 62, 5),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_fieldType_unresolved() async {
-    await assertErrorsInCode(r'''
-class A {
-  final Unresolved x;
-  const A(String this.x);
-}
-var v = const A('foo');
-''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_implements() async {
-    // According to checked-mode type checking rules, a value of type A is not
-    // assignable to a field of type B, because B implements A (the subtyping
-    // relationship is in the wrong direction).
-    await assertErrorsInCode(r'''
-class A {
-  const A();
-}
-class B implements A {}
-class C {
-  final B b;
-  const C(this.b);
-}
-const A u = const A();
-var v = const C(u);
-''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          132,
-          1),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_list() async {
-    // <num>[1, 2, 3] has type List<num>, which is not a subtype of List<int>.
-    await assertErrorsInCode(r'''
-class A {
-  const A(List<int> x);
-}
-const dynamic w = const <num>[1, 2, 3];
-var x = const A(w);
-''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          92,
-          1),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_map_keyMismatch() async {
-    // <num, int>{1: 2} has type Map<num, int>, which is not a subtype of
-    // Map<int, int>.
-    await assertErrorsInCode(r'''
-class A {
-  const A(Map<int, int> x);
-}
-const dynamic w = const <num, int>{1: 2};
-var x = const A(w);
-''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          98,
-          1),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_map_valueMismatch() async {
-    // <int, num>{1: 2} has type Map<int, num>, which is not a subtype of
-    // Map<int, int>.
-    await assertErrorsInCode(r'''
-class A {
-  const A(Map<int, int> x);
-}
-const dynamic w = const <int, num>{1: 2};
-var x = const A(w);
-''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          98,
-          1),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_optional() async {
-    await assertErrorsInCode(r'''
-class A {
-  final int x;
-  const A([this.x = 'foo']);
-}
-var v = const A();
-''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 45, 5),
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          64,
-          9),
-    ]);
-  }
-
-  test_fieldFormalParameterNotAssignableToField_typedef() async {
-    // foo has the runtime type String -> int, so it should not be assignable
-    // to A.f (A.f requires it to be int -> String).
-    await assertErrorsInCode(r'''
-typedef String Int2String(int x);
-class A {
-  final Int2String f;
-  const A(this.f);
-}
-int foo(String x) => 1;
-var v = const A(foo);
-''', [
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 127, 3),
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          127,
-          3),
-    ]);
-  }
-
   test_fieldInitializerNotAssignable() async {
     await assertErrorsInCode(r'''
 class A {
@@ -404,7 +68,7 @@
 var v = const C<String>();
 ''',
       [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 27, 1),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 27, 1),
         error(
             CheckedModeCompileTimeErrorCode
                 .CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
@@ -437,7 +101,7 @@
 var v = const C<int>();
 ''',
       [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 27, 1),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 27, 1),
       ],
     );
   }
@@ -538,10 +202,7 @@
 }
 var v = const A('foo');
 ''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          46,
-          5),
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 46, 5),
       error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 46, 5),
     ]);
   }
@@ -554,10 +215,7 @@
 var v = const A<int>('foo');
 ''', [
       error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 5),
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          52,
-          5),
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 52, 5),
     ]);
   }
 
@@ -620,7 +278,7 @@
 const int x = 'foo';
 ''', [
       error(CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH, 14, 5),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 14, 5),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 14, 5),
     ]);
   }
 
diff --git a/pkg/analyzer/test/generated/compile_time_error_code.dart b/pkg/analyzer/test/generated/compile_time_error_code.dart
deleted file mode 100644
index 8afcd5b..0000000
--- a/pkg/analyzer/test/generated/compile_time_error_code.dart
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
-
-import '../src/dart/resolution/driver_resolution.dart';
-
-class CompileTimeErrorCodeTestBase extends DriverResolutionTest {
-  test_bug_23176() async {
-    await assertErrorsInCode('''
-class A {
-  const A([x]);
-}
-class B {
-  dynamic @A(const A()) x;
-}
-''', [
-      error(ParserErrorCode.EXPECTED_TOKEN, 40, 7),
-      error(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 40, 7),
-      error(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 62, 1),
-    ]);
-  }
-
-  test_builtInIdentifierAsType_formalParameter_field() async {
-    await assertErrorsInCode(r'''
-class A {
-  var x;
-  A(static this.x);
-}
-''', [
-      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 23, 6),
-    ]);
-  }
-
-  test_builtInIdentifierAsType_formalParameter_simple() async {
-    await assertErrorsInCode(r'''
-f(static x) {
-}
-''', [
-      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 2, 6),
-    ]);
-  }
-
-  test_builtInIdentifierAsType_variableDeclaration() async {
-    await assertErrorsInCode(r'''
-f() {
-  typedef x;
-}
-''', [
-      error(ParserErrorCode.EXPECTED_TOKEN, 8, 7),
-      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 8, 7),
-      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 16, 1),
-    ]);
-  }
-
-  test_consistentCaseExpressionTypes_dynamic() async {
-    // Even though A.S and S have a static type of "dynamic", we should see
-    // that they match 'abc', because they are constant strings.
-    await assertNoErrorsInCode(r'''
-class A {
-  static const S = 'A.S';
-}
-
-const S = 'S';
-
-foo(var p) {
-  switch (p) {
-    case S:
-      break;
-    case A.S:
-      break;
-    case 'abc':
-      break;
-  }
-}
-''');
-  }
-
-  test_constConstructor_redirect_generic() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {
-  const A(T value) : this._(value);
-  const A._(T value) : value = value;
-  final T value;
-}
-
-void main(){
-  const A<int>(1);
-}
-''');
-  }
-
-  test_constEvalThrowsException() async {
-    await assertErrorsInCode(r'''
-class C {
-  const C();
-}
-f() { return const C(); }
-''', [
-      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, 0, 0),
-    ]);
-  }
-
-  test_constEvalThrowsException_divisionByZero() async {
-    await assertErrorsInCode('''
-const C = 1 ~/ 0;
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE, 10, 6),
-    ]);
-  }
-
-  test_constEvalTypeInt_binary() async {
-    await _check_constEvalTypeBoolOrInt_binary("a ^ ''");
-    await _check_constEvalTypeBoolOrInt_binary("a & ''");
-    await _check_constEvalTypeBoolOrInt_binary("a | ''");
-    await _check_constEvalTypeInt_binary("a >> ''");
-    await _check_constEvalTypeInt_binary("a << ''");
-  }
-
-  test_constEvalTypeNum_binary() async {
-    await _check_constEvalTypeNum_binary("a + ''");
-    await _check_constEvalTypeNum_binary("a - ''");
-    await _check_constEvalTypeNum_binary("a * ''");
-    await _check_constEvalTypeNum_binary("a / ''");
-    await _check_constEvalTypeNum_binary("a ~/ ''");
-    await _check_constEvalTypeNum_binary("a > ''");
-    await _check_constEvalTypeNum_binary("a < ''");
-    await _check_constEvalTypeNum_binary("a >= ''");
-    await _check_constEvalTypeNum_binary("a <= ''");
-    await _check_constEvalTypeNum_binary("a % ''");
-  }
-
-  test_constWithNonConstantArgument_annotation() async {
-    await assertErrorsInCode(r'''
-class A {
-  const A(int p);
-}
-var v = 42;
-@A(v)
-main() {
-}
-''', [
-      error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 45, 1),
-    ]);
-  }
-
-  test_constWithNonConstantArgument_classShadowedBySetter() async {
-    await assertErrorsInCode(r'''
-class Annotation {
-  const Annotation(Object obj);
-}
-
-class Bar {}
-
-class Foo {
-  @Annotation(Bar)
-  set Bar(int value) {}
-}
-''', [
-      error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 94, 3),
-      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 94, 3),
-    ]);
-  }
-
-  test_constWithNonConstantArgument_instanceCreation() async {
-    await assertErrorsInCode(r'''
-class A {
-  const A(a);
-}
-f(p) { return const A(p); }
-''', [
-      error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 48, 1),
-    ]);
-  }
-
-  test_fromEnvironment_bool_badArgs() async {
-    await assertErrorsInCode(r'''
-var b1 = const bool.fromEnvironment(1);
-var b2 = const bool.fromEnvironment('x', defaultValue: 1);
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 29),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 36, 1),
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 49, 48),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 81, 15),
-    ]);
-  }
-
-  test_fromEnvironment_bool_badDefault_whenDefined() async {
-    // The type of the defaultValue needs to be correct even when the default
-    // value isn't used (because the variable is defined in the environment).
-    driver.declaredVariables = DeclaredVariables.fromMap({'x': 'true'});
-    await assertErrorsInCode('''
-var b = const bool.fromEnvironment('x', defaultValue: 1);
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 8, 48),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 40, 15),
-    ]);
-  }
-
-  test_genericFunctionTypeArgument_inference_function() async {
-    await assertErrorsInCode(r'''
-T f<T>(T t) => null;
-main() { f(<S>(S s) => s); }
-''', [
-      error(CompileTimeErrorCode.COULD_NOT_INFER, 30, 1),
-    ]);
-  }
-
-  test_genericFunctionTypeArgument_inference_functionType() async {
-    await assertErrorsInCode(r'''
-T Function<T>(T) f;
-main() { f(<S>(S s) => s); }
-''', [
-      error(CompileTimeErrorCode.COULD_NOT_INFER, 29, 1),
-    ]);
-  }
-
-  test_genericFunctionTypeArgument_inference_method() async {
-    await assertErrorsInCode(r'''
-class C {
-  T f<T>(T t) => null;
-}
-main() { new C().f(<S>(S s) => s); }
-''', [
-      error(CompileTimeErrorCode.COULD_NOT_INFER, 52, 1),
-    ]);
-  }
-
-  test_genericFunctionTypedParameter() async {
-    var code = '''
-void g(T f<T>(T x)) {}
-''';
-    await assertNoErrorsInCode(code);
-  }
-
-  test_length_of_erroneous_constant() async {
-    // Attempting to compute the length of constant that couldn't be evaluated
-    // (due to an error) should not crash the analyzer (see dartbug.com/23383)
-    await assertErrorsInCode('''
-const int i = (1 ? 'alpha' : 'beta').length;
-''', [
-      error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 14,
-          29),
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 15, 1),
-      error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 15, 1),
-    ]);
-  }
-
-  test_nonConstMapAsExpressionStatement_begin() async {
-    // TODO(danrubel): Consider improving recovery
-    await assertErrorsInCode(r'''
-f() {
-  {'a' : 0, 'b' : 1}.length;
-}
-''', [
-      error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
-      error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
-    ]);
-  }
-
-  test_nonConstMapAsExpressionStatement_only() async {
-    // TODO(danrubel): Consider improving recovery
-    await assertErrorsInCode(r'''
-f() {
-  {'a' : 0, 'b' : 1};
-}
-''', [
-      error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
-      error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
-    ]);
-  }
-
-  test_nonConstValueInInitializer_instanceCreation_inDifferentFile() async {
-    newFile('/test/lib/a.dart', content: '''
-import 'b.dart';
-const v = const MyClass();
-''');
-    await assertErrorsInCode('''
-class MyClass {
-  const MyClass([p = foo]);
-}
-''', [
-      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 37, 3),
-      error(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, 37, 3),
-    ]);
-  }
-
-  test_symbol_constructor_badArgs() async {
-    await assertErrorsInCode(r'''
-var s1 = const Symbol('3');
-var s2 = const Symbol(3);
-var s3 = const Symbol();
-var s4 = const Symbol('x', 'y');
-var s5 = const Symbol('x', foo: 'x');
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 17),
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 37, 15),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
-      error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS, 75, 2),
-      error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS, 100, 10),
-      error(CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER, 139, 3),
-    ]);
-  }
-
-  Future<void> _check_constEvalTypeBoolOrInt_binary(String expr) async {
-    await assertErrorsInCode('''
-const int a = 0;
-const _ = $expr;
-''', [
-      error(HintCode.UNUSED_ELEMENT, 23, 1),
-      error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT, 27, 6),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
-    ]);
-  }
-
-  Future<void> _check_constEvalTypeInt_binary(String expr) async {
-    await assertErrorsInCode('''
-const int a = 0;
-const _ = $expr;
-''', [
-      error(HintCode.UNUSED_ELEMENT, 23, 1),
-      error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT, 27, 6),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
-    ]);
-  }
-
-  Future<void> _check_constEvalTypeNum_binary(String expr) async {
-    await assertErrorsInCode('''
-const num a = 0;
-const _ = $expr;
-''', [
-      error(HintCode.UNUSED_ELEMENT, 23, 1),
-      error(CompileTimeErrorCode.CONST_EVAL_TYPE_NUM, 27, 6),
-      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
-    ]);
-  }
-}
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
deleted file mode 100644
index b77cbfd..0000000
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) 2017, 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:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../src/dart/resolution/driver_resolution.dart';
-import 'compile_time_error_code.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(CompileTimeErrorCodeTest);
-    defineReflectiveTests(ControlFlowCollectionsTest);
-  });
-}
-
-@reflectiveTest
-class CompileTimeErrorCodeTest extends CompileTimeErrorCodeTestBase {
-  @override
-  @failingTest
-  test_constEvalThrowsException() {
-    return super.test_constEvalThrowsException();
-  }
-}
-
-@reflectiveTest
-class ControlFlowCollectionsTest extends DriverResolutionTest {
-  test_listElementTypeNotAssignable_const() async {
-    await assertErrorsInCode('''
-var v = const <String>[42];
-''', [
-      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 23, 2),
-    ]);
-  }
-
-  test_mapValueTypeNotAssignable_const() async {
-    await assertErrorsInCode('''
-var v = const <String, String>{'a' : 2};
-''', [
-      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 37, 1),
-    ]);
-  }
-
-  test_nonBoolCondition_for_declaration() async {
-    // https://github.com/dart-lang/sdk/issues/24713
-    await assertErrorsInCode(r'''
-f() {
-  for (int i = 0; 3;) {}
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 24, 1),
-    ]);
-  }
-
-  test_nonBoolCondition_for_expression() async {
-    // https://github.com/dart-lang/sdk/issues/24713
-    await assertErrorsInCode(r'''
-f() {
-  int i;
-  for (i = 0; 3;) {}
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 29, 1),
-    ]);
-  }
-
-  test_nonConstMapAsExpressionStatement_begin() async {
-    // TODO(danrubel) Fasta is not recovering well.
-    // Ideally we would produce a single diagnostic:
-    // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
-    await assertErrorsInCode(r'''
-f() {
-  {'a' : 0, 'b' : 1}.length;
-}
-''', [
-      error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
-      error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
-    ]);
-  }
-
-  test_nonConstMapAsExpressionStatement_only() async {
-    // TODO(danrubel) Fasta is not recovering well.
-    // Ideally we would produce a single diagnostic:
-    // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
-    await assertErrorsInCode(r'''
-f() {
-  {'a' : 0, 'b' : 1};
-}
-''', [
-      error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
-      error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
-      error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
-      error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
-    ]);
-  }
-
-  test_setElementTypeNotAssignable_const() async {
-    await assertErrorsInCode('''
-var v = const <String>{42};
-''', [
-      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 23, 2),
-    ]);
-  }
-}
diff --git a/pkg/analyzer/test/generated/error_suppression_test.dart b/pkg/analyzer/test/generated/error_suppression_test.dart
index 877c713..2335951 100644
--- a/pkg/analyzer/test/generated/error_suppression_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_test.dart
@@ -22,7 +22,7 @@
     await assertErrorsInCode('''
 int x = ''; // ignore: invalid_assignment
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 2),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 8, 2),
     ]);
   }
 
@@ -31,7 +31,7 @@
 // ignore: unused_import, undefined_function
 f() => g();
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 52, 1),
+      error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 52, 1),
     ]);
   }
 
@@ -41,7 +41,7 @@
 int x = '';
 int _y = 0; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 34, 2),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 34, 2),
       error(HintCode.UNUSED_ELEMENT, 42, 2),
     ]);
   }
@@ -139,7 +139,7 @@
 int x = '';
 const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 2),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 2),
       error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 57,
           1),
     ]);
@@ -153,7 +153,7 @@
 ''', [
       error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 43,
           1),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 1),
     ]);
   }
 
@@ -162,7 +162,7 @@
 // ignore invalid_assignment
 String y = 3; //INVALID_ASSIGNMENT
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 40, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 40, 1),
     ]);
   }
 
@@ -228,7 +228,7 @@
 int x = ''; //INVALID_ASSIGNMENT
 const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 2),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 8, 2),
       error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 43,
           1),
     ]);
@@ -260,7 +260,7 @@
       '''
 f() => g();
 ''',
-      [error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 7, 1)],
+      [error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 7, 1)],
     );
   }
 
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 035fd21..7b2fb4a 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -329,6 +329,17 @@
 ''');
   }
 
+  test_typeBeforeAnnotation() async {
+    await _assertCanBeAnalyzed('''
+class A {
+  const A([x]);
+}
+class B {
+  dynamic @A(const A()) x;
+}
+''');
+  }
+
   Future<void> _assertCanBeAnalyzed(String text) async {
     await resolveTestCode(text);
     assertHasTestErrors();
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 4527bd6..286187a 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -2181,7 +2181,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 93, 1),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 97, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 97, 1),
     ]);
     var z = result.unit.declaredElement.topLevelVariables
         .where((e) => e.name == 'z')
@@ -2796,8 +2796,8 @@
   null[0];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 0, 0),
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 0, 0),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 0, 0),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 0, 0),
     ]);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 61362bf..9423c6c 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -6880,7 +6880,7 @@
     InstanceCreationExpressionImpl expression =
         parseExpression('new a.b.c<C>()', errors: [
       expectedError(
-          StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+          CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           8,
           1)
     ]);
@@ -15153,7 +15153,7 @@
     }
     var statement = parseStatement('const A<B>.c<C>();') as ExpressionStatement;
     assertErrorsWithCodes(
-        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR]);
+        [CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR]);
     expect(statement.expression, isNotNull);
   }
 
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 16902a4..bc21731 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -314,7 +314,7 @@
   assert (n is int);
   return n & 0x0F;
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 47, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 47, 1),
     ]);
   }
 
@@ -337,7 +337,7 @@
 int f(num n) {
   return (n is! int) ? 0 : n & 0x0F;
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 44, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 44, 1),
     ]);
   }
 
@@ -346,7 +346,7 @@
 int f(num n) {
   return (n is! int || n < 0) ? 0 : n & 0x0F;
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 53, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 53, 1),
     ]);
   }
 
@@ -373,7 +373,7 @@
 }''', [
       error(HintCode.MISSING_RETURN, 4, 1),
       error(HintCode.UNUSED_LOCAL_VARIABLE, 30, 3),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 76, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 76, 1),
     ]);
   }
 
@@ -406,7 +406,7 @@
     return n & 0x0F;
   }
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 72, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 72, 1),
     ]);
   }
 
@@ -418,7 +418,7 @@
   }
   return n & 0x0F;
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 63, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 63, 1),
     ]);
   }
 
@@ -431,7 +431,7 @@
     return n & 0x0F;
   }
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 81, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 81, 1),
     ]);
   }
 
@@ -441,7 +441,7 @@
   num n = 1234;
   return n & 0x0F;
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 37, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 37, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 4ff5151..09bb730 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -786,7 +786,7 @@
   List<List<int>> b;
   b[0][0] = 'hi';
 }''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 39, 4),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 39, 4),
     ]);
     verifyTestResolved();
   }
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index d0ad450..14674c4 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -34,7 +34,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 65, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 65, 3),
     ]);
   }
 
@@ -59,7 +59,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 68, 1),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 72, 10),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 72, 10),
     ]);
   }
 
@@ -84,7 +84,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 75, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
     ]);
   }
 
@@ -135,7 +135,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 64, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
     ]);
   }
 
@@ -185,8 +185,8 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 271, 4),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 289, 2),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 304, 2),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 289, 2),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 304, 2),
     ]);
   }
 
@@ -207,7 +207,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
     ]);
   }
 
@@ -272,7 +272,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
     ]);
   }
 
@@ -306,7 +306,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
     ]);
   }
 
@@ -344,7 +344,7 @@
   p = 0;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 71, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 71, 6),
     ]);
   }
 
@@ -354,7 +354,7 @@
   ((p is String) && ((p = 42) == 42)) && p.length != 0;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 60, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 60, 6),
     ]);
   }
 
@@ -364,7 +364,7 @@
   (p is String) && (((p = 42) == 42) && p.length != 0);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 59, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 59, 6),
     ]);
   }
 
@@ -376,7 +376,7 @@
   p = 42;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 68, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 68, 6),
     ]);
   }
 
@@ -388,7 +388,7 @@
   p is String ? callMe(() { p.length; }) : 0;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 78, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 78, 6),
     ]);
   }
 
@@ -398,7 +398,7 @@
   p is String ? (p.length + (p = 42)) : 0;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 36, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 36, 6),
     ]);
   }
 
@@ -414,7 +414,7 @@
   p = 0;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 83, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 83, 6),
     ]);
   }
 
@@ -426,7 +426,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 66, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 66, 6),
     ]);
   }
 
@@ -444,7 +444,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 100, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 100, 1),
     ]);
   }
 
@@ -462,7 +462,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 105, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 105, 1),
     ]);
   }
 
@@ -475,7 +475,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
     ]);
   }
 
@@ -488,7 +488,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 55, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 55, 6),
     ]);
   }
 
@@ -501,7 +501,7 @@
   () {p = 0;};
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
     ]);
   }
 
@@ -514,7 +514,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 59, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 59, 6),
     ]);
   }
 
@@ -527,7 +527,7 @@
   f() {p = 0;};
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
       error(HintCode.UNUSED_ELEMENT, 58, 1),
     ]);
   }
@@ -542,7 +542,7 @@
 }
 ''', [
       error(HintCode.UNUSED_ELEMENT, 19, 1),
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 60, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 60, 6),
     ]);
   }
 
@@ -560,7 +560,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 103, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 103, 1),
     ]);
   }
 
@@ -578,7 +578,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 112, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 112, 1),
     ]);
   }
 
@@ -591,7 +591,7 @@
   a.element.anyGetterExistsInDynamic;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 35, 10),
+      error(CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT, 35, 10),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 6504efa..efa2a44 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -912,7 +912,7 @@
     // Test that FutureOr does not have the constituent type methods
     MethodInvocation invoke = await _testFutureOr(r'''
     dynamic test(FutureOr<int> x) => x.abs();
-    ''', errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
+    ''', errors: [CompileTimeErrorCode.UNDEFINED_METHOD]);
     _isDynamic(invoke.staticType);
   }
 
@@ -920,7 +920,7 @@
     // Test that FutureOr does not have the Future type methods
     MethodInvocation invoke = await _testFutureOr(r'''
     dynamic test(FutureOr<int> x) => x.then((x) => x);
-    ''', errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
+    ''', errors: [CompileTimeErrorCode.UNDEFINED_METHOD]);
     _isDynamic(invoke.staticType);
   }
 
@@ -928,7 +928,7 @@
     // Test that FutureOr<dynamic> does not have all methods
     MethodInvocation invoke = await _testFutureOr(r'''
     dynamic test(FutureOr<dynamic> x) => x.abs();
-    ''', errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
+    ''', errors: [CompileTimeErrorCode.UNDEFINED_METHOD]);
     _isDynamic(invoke.staticType);
   }
 
@@ -3667,7 +3667,7 @@
   test_returnOfInvalidType_object_void() async {
     await assertErrorsInCode(
         "Object f() { void voidFn() => null; return voidFn(); }", [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 43, 8),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 43, 8),
     ]);
   }
 
@@ -3702,7 +3702,7 @@
 }
 set g(int x) => 42;
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 41, 4),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 41, 4),
     ]);
   }
 
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 12c45df..4d5a888 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -7,7 +7,6 @@
 import 'all_the_rest_test.dart' as all_the_rest;
 import 'checked_mode_compile_time_error_code_test.dart'
     as checked_mode_compile_time_error_code;
-import 'compile_time_error_code_test.dart' as compile_time_error_code;
 // ignore: deprecated_member_use_from_same_package
 import 'constant_test.dart' as constant_test;
 import 'element_resolver_test.dart' as element_resolver_test;
@@ -37,7 +36,6 @@
   defineReflectiveSuite(() {
     all_the_rest.main();
     checked_mode_compile_time_error_code.main();
-    compile_time_error_code.main();
     constant_test.main();
     element_resolver_test.main();
     error_suppression.main();
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 3929a49..3c0dd2d 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -4,14 +4,11 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/least_upper_bound.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -21,8 +18,6 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignabilityTest);
-    defineReflectiveTests(LeastUpperBoundFunctionsTest);
-    defineReflectiveTests(LeastUpperBoundTest);
     defineReflectiveTests(TryPromoteToTest);
   });
 }
@@ -87,10 +82,6 @@
       typeSystem: typeSystem,
     );
   }
-
-  String _typeString(TypeImpl type) {
-    return type.getDisplayString(withNullability: true);
-  }
 }
 
 @reflectiveTest
@@ -441,1238 +432,6 @@
   }
 }
 
-/// Base class for testing LUB and GLB in spec and strong mode.
-abstract class BoundTestBase extends AbstractTypeSystemTest {
-  void _checkLeastUpperBound(DartType T1, DartType T2, DartType expected) {
-    var expectedStr = _typeString(expected);
-
-    var result = typeSystem.getLeastUpperBound(T1, T2);
-    var resultStr = _typeString(result);
-    expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
-
-    // Check that the result is an upper bound.
-    expect(typeSystem.isSubtypeOf(T1, result), true);
-    expect(typeSystem.isSubtypeOf(T2, result), true);
-
-    // Check for symmetry.
-    result = typeSystem.getLeastUpperBound(T2, T1);
-    resultStr = _typeString(result);
-    expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
-  }
-}
-
-@reflectiveTest
-class LeastUpperBoundFunctionsTest extends BoundTestBase {
-  void test_differentRequiredArity() {
-    var type1 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: intStar),
-        requiredParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: intStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, typeProvider.functionType);
-  }
-
-  void test_fuzzyArrows() {
-    var type1 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: dynamicType),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        requiredParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_glbNamedParams() {
-    var type1 = functionTypeStar(
-      parameters: [
-        namedParameter(name: 'a', type: stringStar),
-        namedParameter(name: 'b', type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        namedParameter(name: 'a', type: intStar),
-        namedParameter(name: 'b', type: numStar),
-      ],
-      returnType: voidNone,
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        namedParameter(name: 'a', type: neverStar),
-        namedParameter(name: 'b', type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_glbPositionalParams() {
-    var type1 = functionTypeStar(
-      parameters: [
-        positionalParameter(type: stringStar),
-        positionalParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        positionalParameter(type: intStar),
-        positionalParameter(type: numStar),
-      ],
-      returnType: voidNone,
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        positionalParameter(type: neverStar),
-        positionalParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_glbRequiredParams() {
-    var type1 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: stringStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: intStar),
-        requiredParameter(type: doubleStar),
-        requiredParameter(type: numStar),
-      ],
-      returnType: voidNone,
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        requiredParameter(type: neverStar),
-        requiredParameter(type: neverStar),
-        requiredParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_ignoreExtraNamedParams() {
-    var type1 = functionTypeStar(
-      parameters: [
-        namedParameter(name: 'a', type: intStar),
-        namedParameter(name: 'b', type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        namedParameter(name: 'a', type: intStar),
-        namedParameter(name: 'c', type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        namedParameter(name: 'a', type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_ignoreExtraPositionalParams() {
-    var type1 = functionTypeStar(
-      parameters: [
-        positionalParameter(type: intStar),
-        positionalParameter(type: intStar),
-        positionalParameter(type: stringStar),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        positionalParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        positionalParameter(type: intStar),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_lubReturnType() {
-    var type1 = functionTypeStar(returnType: intStar);
-    var type2 = functionTypeStar(returnType: doubleStar);
-    var expected = functionTypeStar(returnType: numStar);
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_sameType_withNamed() {
-    var type1 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: stringStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: numStar),
-        namedParameter(name: 'n', type: numStar),
-      ],
-      returnType: intStar,
-    );
-
-    var type2 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: stringStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: numStar),
-        namedParameter(name: 'n', type: numStar),
-      ],
-      returnType: intStar,
-    );
-
-    var expected = functionTypeStar(
-      parameters: [
-        requiredParameter(type: stringStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: numStar),
-        namedParameter(name: 'n', type: numStar),
-      ],
-      returnType: intStar,
-    );
-
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_sameType_withOptional() {
-    var type1 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: stringStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: numStar),
-        positionalParameter(type: doubleStar),
-      ],
-      returnType: intStar,
-    );
-
-    var type2 = functionTypeStar(
-      parameters: [
-        requiredParameter(type: stringStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: numStar),
-        positionalParameter(type: doubleStar),
-      ],
-      returnType: intStar,
-    );
-
-    var expected = functionTypeStar(
-      parameters: [
-        requiredParameter(type: stringStar),
-        requiredParameter(type: intStar),
-        requiredParameter(type: numStar),
-        positionalParameter(type: doubleStar),
-      ],
-      returnType: intStar,
-    );
-
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_typeFormals_differentBounds() {
-    var T1 = typeParameter('T1', bound: intStar);
-    var type1 = functionTypeStar(
-      typeFormals: [T1],
-      returnType: typeParameterTypeStar(T1),
-    );
-
-    var T2 = typeParameter('T2', bound: doubleStar);
-    var type2 = functionTypeStar(
-      typeFormals: [T2],
-      returnType: typeParameterTypeStar(T2),
-    );
-
-    _checkLeastUpperBound(type1, type2, typeProvider.functionType);
-  }
-
-  void test_typeFormals_differentNumber() {
-    var T1 = typeParameter('T1', bound: numStar);
-    var type1 = functionTypeStar(
-      typeFormals: [T1],
-      returnType: typeParameterTypeStar(T1),
-    );
-
-    var type2 = functionTypeStar(returnType: intStar);
-
-    _checkLeastUpperBound(type1, type2, typeProvider.functionType);
-  }
-
-  void test_typeFormals_sameBounds() {
-    var T1 = typeParameter('T1', bound: numStar);
-    var type1 = functionTypeStar(
-      typeFormals: [T1],
-      returnType: typeParameterTypeStar(T1),
-    );
-
-    var T2 = typeParameter('T2', bound: numStar);
-    var type2 = functionTypeStar(
-      typeFormals: [T2],
-      returnType: typeParameterTypeStar(T2),
-    );
-
-    var TE = typeParameter('T', bound: numStar);
-    var expected = functionTypeStar(
-      typeFormals: [TE],
-      returnType: typeParameterTypeStar(TE),
-    );
-
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-}
-
-@reflectiveTest
-class LeastUpperBoundTest extends BoundTestBase {
-  void test_bottom_function() {
-    _checkLeastUpperBound(neverStar, functionTypeStar(returnType: voidNone),
-        functionTypeStar(returnType: voidNone));
-  }
-
-  void test_bottom_interface() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-    _checkLeastUpperBound(neverStar, typeA, typeA);
-  }
-
-  void test_bottom_typeParam() {
-    var T = typeParameter('T');
-    var typeT = typeParameterTypeStar(T);
-    _checkLeastUpperBound(neverStar, typeT, typeT);
-  }
-
-  void test_directInterfaceCase() {
-    // class A
-    // class B implements A
-    // class C implements B
-
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', interfaces: [typeA]);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', interfaces: [typeB]);
-    var typeC = interfaceTypeStar(C);
-
-    _checkLeastUpperBound(typeB, typeC, typeB);
-  }
-
-  void test_directSubclassCase() {
-    // class A
-    // class B extends A
-    // class C extends B
-
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', superType: typeA);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', superType: typeB);
-    var typeC = interfaceTypeStar(C);
-
-    _checkLeastUpperBound(typeB, typeC, typeB);
-  }
-
-  void test_directSuperclass_nullability() {
-    var aElement = class_(name: 'A');
-    var aQuestion = interfaceTypeQuestion(aElement);
-    var aStar = interfaceTypeStar(aElement);
-    var aNone = interfaceTypeNone(aElement);
-
-    var bElementStar = class_(name: 'B', superType: aStar);
-    var bElementNone = class_(name: 'B', superType: aNone);
-
-    InterfaceTypeImpl _bTypeStarElement(NullabilitySuffix nullability) {
-      return interfaceType(
-        bElementStar,
-        nullabilitySuffix: nullability,
-      );
-    }
-
-    InterfaceTypeImpl _bTypeNoneElement(NullabilitySuffix nullability) {
-      return interfaceType(
-        bElementNone,
-        nullabilitySuffix: nullability,
-      );
-    }
-
-    var bStarQuestion = _bTypeStarElement(NullabilitySuffix.question);
-    var bStarStar = _bTypeStarElement(NullabilitySuffix.star);
-    var bStarNone = _bTypeStarElement(NullabilitySuffix.none);
-
-    var bNoneQuestion = _bTypeNoneElement(NullabilitySuffix.question);
-    var bNoneStar = _bTypeNoneElement(NullabilitySuffix.star);
-    var bNoneNone = _bTypeNoneElement(NullabilitySuffix.none);
-
-    void assertLUB(DartType type1, DartType type2, DartType expected) {
-      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
-      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
-    }
-
-    assertLUB(bStarQuestion, aQuestion, aQuestion);
-    assertLUB(bStarQuestion, aStar, aQuestion);
-    assertLUB(bStarQuestion, aNone, aQuestion);
-
-    assertLUB(bStarStar, aQuestion, aQuestion);
-    assertLUB(bStarStar, aStar, aStar);
-    assertLUB(bStarStar, aNone, aStar);
-
-    assertLUB(bStarNone, aQuestion, aQuestion);
-    assertLUB(bStarNone, aStar, aStar);
-    assertLUB(bStarNone, aNone, aNone);
-
-    assertLUB(bNoneQuestion, aQuestion, aQuestion);
-    assertLUB(bNoneQuestion, aStar, aQuestion);
-    assertLUB(bNoneQuestion, aNone, aQuestion);
-
-    assertLUB(bNoneStar, aQuestion, aQuestion);
-    assertLUB(bNoneStar, aStar, aStar);
-    assertLUB(bNoneStar, aNone, aStar);
-
-    assertLUB(bNoneNone, aQuestion, aQuestion);
-    assertLUB(bNoneNone, aStar, aStar);
-    assertLUB(bNoneNone, aNone, aNone);
-  }
-
-  void test_dynamic_bottom() {
-    _checkLeastUpperBound(dynamicType, neverStar, dynamicType);
-  }
-
-  void test_dynamic_function() {
-    _checkLeastUpperBound(
-        dynamicType, functionTypeStar(returnType: voidNone), dynamicType);
-  }
-
-  void test_dynamic_interface() {
-    var A = class_(name: 'A');
-    _checkLeastUpperBound(dynamicType, interfaceTypeStar(A), dynamicType);
-  }
-
-  void test_dynamic_typeParam() {
-    var T = typeParameter('T');
-    _checkLeastUpperBound(dynamicType, typeParameterTypeStar(T), dynamicType);
-  }
-
-  void test_dynamic_void() {
-    // Note: _checkLeastUpperBound tests `LUB(x, y)` as well as `LUB(y, x)`
-    _checkLeastUpperBound(dynamicType, voidNone, voidNone);
-  }
-
-  void test_interface_function() {
-    var A = class_(name: 'A');
-    _checkLeastUpperBound(interfaceTypeStar(A),
-        functionTypeStar(returnType: voidNone), objectStar);
-  }
-
-  void test_interface_sameElement_nullability() {
-    var aElement = class_(name: 'A');
-
-    var aQuestion = interfaceTypeQuestion(aElement);
-    var aStar = interfaceTypeStar(aElement);
-    var aNone = interfaceTypeNone(aElement);
-
-    void assertLUB(DartType type1, DartType type2, DartType expected) {
-      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
-      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
-    }
-
-    assertLUB(aQuestion, aQuestion, aQuestion);
-    assertLUB(aQuestion, aStar, aQuestion);
-    assertLUB(aQuestion, aNone, aQuestion);
-
-    assertLUB(aStar, aQuestion, aQuestion);
-    assertLUB(aStar, aStar, aStar);
-    assertLUB(aStar, aNone, aStar);
-
-    assertLUB(aNone, aQuestion, aQuestion);
-    assertLUB(aNone, aStar, aStar);
-    assertLUB(aNone, aNone, aNone);
-  }
-
-  void test_mixinAndClass_constraintAndInterface() {
-    var classA = class_(name: 'A');
-    var instA = InstantiatedClass(classA, []);
-
-    var classB = class_(
-      name: 'B',
-      interfaces: [instA.withNullabilitySuffixNone],
-    );
-
-    var mixinM = mixin_(
-      name: 'M',
-      constraints: [instA.withNullabilitySuffixNone],
-    );
-
-    _checkLeastUpperBound(
-      interfaceTypeStar(classB),
-      interfaceTypeStar(mixinM),
-      instA.withNullability(NullabilitySuffix.star),
-    );
-  }
-
-  void test_mixinAndClass_object() {
-    var classA = class_(name: 'A');
-    var mixinM = mixin_(name: 'M');
-
-    _checkLeastUpperBound(
-      interfaceTypeStar(classA),
-      interfaceTypeStar(mixinM),
-      objectStar,
-    );
-  }
-
-  void test_mixinAndClass_sharedInterface() {
-    var classA = class_(name: 'A');
-    var instA = InstantiatedClass(classA, []);
-
-    var classB = class_(
-      name: 'B',
-      interfaces: [instA.withNullabilitySuffixNone],
-    );
-
-    var mixinM = mixin_(
-      name: 'M',
-      interfaces: [instA.withNullabilitySuffixNone],
-    );
-
-    _checkLeastUpperBound(
-      interfaceTypeStar(classB),
-      interfaceTypeStar(mixinM),
-      instA.withNullability(NullabilitySuffix.star),
-    );
-  }
-
-  void test_mixinCase() {
-    // class A
-    // class B extends A
-    // class C extends A
-    // class D extends B with M, N, O, P
-
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', superType: typeA);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', superType: typeA);
-    var typeC = interfaceTypeStar(C);
-
-    var D = class_(
-      name: 'D',
-      superType: typeB,
-      mixins: [
-        interfaceTypeStar(class_(name: 'M')),
-        interfaceTypeStar(class_(name: 'N')),
-        interfaceTypeStar(class_(name: 'O')),
-        interfaceTypeStar(class_(name: 'P')),
-      ],
-    );
-    var typeD = interfaceTypeStar(D);
-
-    _checkLeastUpperBound(typeD, typeC, typeA);
-  }
-
-  void test_nestedFunctionsLubInnerParamTypes() {
-    var type1 = functionTypeStar(
-      parameters: [
-        requiredParameter(
-          type: functionTypeStar(
-            parameters: [
-              requiredParameter(type: stringStar),
-              requiredParameter(type: intStar),
-              requiredParameter(type: intStar),
-            ],
-            returnType: voidNone,
-          ),
-        ),
-      ],
-      returnType: voidNone,
-    );
-    var type2 = functionTypeStar(
-      parameters: [
-        requiredParameter(
-          type: functionTypeStar(
-            parameters: [
-              requiredParameter(type: intStar),
-              requiredParameter(type: doubleStar),
-              requiredParameter(type: numStar),
-            ],
-            returnType: voidNone,
-          ),
-        ),
-      ],
-      returnType: voidNone,
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        requiredParameter(
-          type: functionTypeStar(
-            parameters: [
-              requiredParameter(type: objectStar),
-              requiredParameter(type: numStar),
-              requiredParameter(type: numStar),
-            ],
-            returnType: voidNone,
-          ),
-        ),
-      ],
-      returnType: voidNone,
-    );
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_nestedNestedFunctionsGlbInnermostParamTypes() {
-    var type1 = functionTypeStar(
-      parameters: [
-        requiredParameter(
-          type: functionTypeStar(
-            parameters: [
-              requiredParameter(
-                type: functionTypeStar(
-                  parameters: [
-                    requiredParameter(type: stringStar),
-                    requiredParameter(type: intStar),
-                    requiredParameter(type: intStar)
-                  ],
-                  returnType: voidNone,
-                ),
-              ),
-            ],
-            returnType: voidNone,
-          ),
-        ),
-      ],
-      returnType: voidNone,
-    );
-    expect(
-      _typeString(type1),
-      'void Function(void Function(void Function(String*, int*, int*)*)*)*',
-    );
-
-    var type2 = functionTypeStar(
-      parameters: [
-        requiredParameter(
-          type: functionTypeStar(
-            parameters: [
-              requiredParameter(
-                type: functionTypeStar(
-                  parameters: [
-                    requiredParameter(type: intStar),
-                    requiredParameter(type: doubleStar),
-                    requiredParameter(type: numStar)
-                  ],
-                  returnType: voidNone,
-                ),
-              ),
-            ],
-            returnType: voidNone,
-          ),
-        ),
-      ],
-      returnType: voidNone,
-    );
-    expect(
-      _typeString(type2),
-      'void Function(void Function(void Function(int*, double*, num*)*)*)*',
-    );
-    var expected = functionTypeStar(
-      parameters: [
-        requiredParameter(
-          type: functionTypeStar(
-            parameters: [
-              requiredParameter(
-                type: functionTypeStar(
-                  parameters: [
-                    requiredParameter(type: neverStar),
-                    requiredParameter(type: neverStar),
-                    requiredParameter(type: intStar)
-                  ],
-                  returnType: voidNone,
-                ),
-              ),
-            ],
-            returnType: voidNone,
-          ),
-        ),
-      ],
-      returnType: voidNone,
-    );
-    expect(
-      _typeString(expected),
-      'void Function(void Function(void Function(Never*, Never*, int*)*)*)*',
-    );
-
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_object() {
-    var A = class_(name: 'A');
-    var B = class_(name: 'B');
-    var typeA = interfaceTypeStar(A);
-    var typeB = interfaceTypeStar(B);
-    var typeObject = typeA.element.supertype;
-    // assert that object does not have a super type
-    expect(typeObject.element.supertype, isNull);
-    // assert that both A and B have the same super type of Object
-    expect(typeB.element.supertype, typeObject);
-    // finally, assert that the only least upper bound of A and B is Object
-    _checkLeastUpperBound(typeA, typeB, typeObject);
-  }
-
-  void test_self() {
-    var T = typeParameter('T');
-    var A = class_(name: 'A');
-
-    List<DartType> types = [
-      dynamicType,
-      voidNone,
-      neverStar,
-      typeParameterTypeStar(T),
-      interfaceTypeStar(A),
-      functionTypeStar(returnType: voidNone)
-    ];
-
-    for (DartType type in types) {
-      _checkLeastUpperBound(type, type, type);
-    }
-  }
-
-  void test_sharedSuperclass1() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', superType: typeA);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', superType: typeA);
-    var typeC = interfaceTypeStar(C);
-
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_sharedSuperclass1_nullability() {
-    var aElement = class_(name: 'A');
-    var aQuestion = interfaceTypeQuestion(aElement);
-    var aStar = interfaceTypeStar(aElement);
-    var aNone = interfaceTypeNone(aElement);
-
-    var bElementNone = class_(name: 'B', superType: aNone);
-    var bElementStar = class_(name: 'B', superType: aStar);
-
-    var cElementNone = class_(name: 'C', superType: aNone);
-    var cElementStar = class_(name: 'C', superType: aStar);
-
-    InterfaceTypeImpl bTypeElementNone(NullabilitySuffix nullability) {
-      return interfaceType(
-        bElementNone,
-        nullabilitySuffix: nullability,
-      );
-    }
-
-    InterfaceTypeImpl bTypeElementStar(NullabilitySuffix nullability) {
-      return interfaceType(
-        bElementStar,
-        nullabilitySuffix: nullability,
-      );
-    }
-
-    var bNoneQuestion = bTypeElementNone(NullabilitySuffix.question);
-    var bNoneStar = bTypeElementNone(NullabilitySuffix.star);
-    var bNoneNone = bTypeElementNone(NullabilitySuffix.none);
-
-    var bStarQuestion = bTypeElementStar(NullabilitySuffix.question);
-    var bStarStar = bTypeElementStar(NullabilitySuffix.star);
-    var bStarNone = bTypeElementStar(NullabilitySuffix.none);
-
-    InterfaceTypeImpl cTypeElementNone(NullabilitySuffix nullability) {
-      return interfaceType(
-        cElementNone,
-        nullabilitySuffix: nullability,
-      );
-    }
-
-    InterfaceTypeImpl cTypeElementStar(NullabilitySuffix nullability) {
-      return interfaceType(
-        cElementStar,
-        nullabilitySuffix: nullability,
-      );
-    }
-
-    var cNoneQuestion = cTypeElementNone(NullabilitySuffix.question);
-    var cNoneStar = cTypeElementNone(NullabilitySuffix.star);
-    var cNoneNone = cTypeElementNone(NullabilitySuffix.none);
-
-    var cStarQuestion = cTypeElementStar(NullabilitySuffix.question);
-    var cStarStar = cTypeElementStar(NullabilitySuffix.star);
-    var cStarNone = cTypeElementStar(NullabilitySuffix.none);
-
-    void assertLUB(DartType type1, DartType type2, DartType expected) {
-      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
-      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
-    }
-
-    assertLUB(bNoneQuestion, cNoneQuestion, aQuestion);
-    assertLUB(bNoneQuestion, cNoneStar, aQuestion);
-    assertLUB(bNoneQuestion, cNoneNone, aQuestion);
-    assertLUB(bNoneQuestion, cStarQuestion, aQuestion);
-    assertLUB(bNoneQuestion, cStarStar, aQuestion);
-    assertLUB(bNoneQuestion, cStarNone, aQuestion);
-
-    assertLUB(bNoneStar, cNoneQuestion, aQuestion);
-    assertLUB(bNoneStar, cNoneStar, aStar);
-    assertLUB(bNoneStar, cNoneNone, aStar);
-    assertLUB(bNoneStar, cStarQuestion, aQuestion);
-    assertLUB(bNoneStar, cStarStar, aStar);
-    assertLUB(bNoneStar, cStarNone, aStar);
-
-    assertLUB(bNoneNone, cNoneQuestion, aQuestion);
-    assertLUB(bNoneNone, cNoneStar, aStar);
-    assertLUB(bNoneNone, cNoneNone, aNone);
-    assertLUB(bNoneNone, cStarQuestion, aQuestion);
-    assertLUB(bNoneNone, cStarStar, aStar);
-    assertLUB(bNoneNone, cStarNone, aNone);
-
-    assertLUB(bStarQuestion, cNoneQuestion, aQuestion);
-    assertLUB(bStarQuestion, cNoneStar, aQuestion);
-    assertLUB(bStarQuestion, cNoneNone, aQuestion);
-    assertLUB(bStarQuestion, cStarQuestion, aQuestion);
-    assertLUB(bStarQuestion, cStarStar, aQuestion);
-    assertLUB(bStarQuestion, cStarNone, aQuestion);
-
-    assertLUB(bStarStar, cNoneQuestion, aQuestion);
-    assertLUB(bStarStar, cNoneStar, aStar);
-    assertLUB(bStarStar, cNoneNone, aStar);
-    assertLUB(bStarStar, cStarQuestion, aQuestion);
-    assertLUB(bStarStar, cStarStar, aStar);
-    assertLUB(bStarStar, cStarNone, aStar);
-
-    assertLUB(bStarNone, cNoneQuestion, aQuestion);
-    assertLUB(bStarNone, cNoneStar, aStar);
-    assertLUB(bStarNone, cNoneNone, aNone);
-    assertLUB(bStarNone, cStarQuestion, aQuestion);
-    assertLUB(bStarNone, cStarStar, aStar);
-    assertLUB(bStarNone, cStarNone, aNone);
-  }
-
-  void test_sharedSuperclass2() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', superType: typeA);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', superType: typeA);
-    var typeC = interfaceTypeStar(C);
-
-    var D = class_(name: 'D', superType: typeC);
-    var typeD = interfaceTypeStar(D);
-
-    _checkLeastUpperBound(typeB, typeD, typeA);
-  }
-
-  void test_sharedSuperclass3() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', superType: typeA);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', superType: typeB);
-    var typeC = interfaceTypeStar(C);
-
-    var D = class_(name: 'D', superType: typeB);
-    var typeD = interfaceTypeStar(D);
-
-    _checkLeastUpperBound(typeC, typeD, typeB);
-  }
-
-  void test_sharedSuperclass4() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var A2 = class_(name: 'A2');
-    var typeA2 = interfaceTypeStar(A2);
-
-    var A3 = class_(name: 'A3');
-    var typeA3 = interfaceTypeStar(A3);
-
-    var B = class_(name: 'B', superType: typeA, interfaces: [typeA2]);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', superType: typeA, interfaces: [typeA3]);
-    var typeC = interfaceTypeStar(C);
-
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_sharedSuperinterface1() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', interfaces: [typeA]);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', interfaces: [typeA]);
-    var typeC = interfaceTypeStar(C);
-
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_sharedSuperinterface2() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', interfaces: [typeA]);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', interfaces: [typeA]);
-    var typeC = interfaceTypeStar(C);
-
-    var D = class_(name: 'D', interfaces: [typeC]);
-    var typeD = interfaceTypeStar(D);
-
-    _checkLeastUpperBound(typeB, typeD, typeA);
-  }
-
-  void test_sharedSuperinterface3() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', interfaces: [typeA]);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', interfaces: [typeB]);
-    var typeC = interfaceTypeStar(C);
-
-    var D = class_(name: 'D', interfaces: [typeB]);
-    var typeD = interfaceTypeStar(D);
-
-    _checkLeastUpperBound(typeC, typeD, typeB);
-  }
-
-  void test_sharedSuperinterface4() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var A2 = class_(name: 'A2');
-    var typeA2 = interfaceTypeStar(A2);
-
-    var A3 = class_(name: 'A3');
-    var typeA3 = interfaceTypeStar(A3);
-
-    var B = class_(name: 'B', interfaces: [typeA, typeA2]);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', interfaces: [typeA, typeA3]);
-    var typeC = interfaceTypeStar(C);
-
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_twoComparables() {
-    _checkLeastUpperBound(stringStar, numStar, objectStar);
-  }
-
-  void test_typeParam_boundedByParam() {
-    var S = typeParameter('S');
-    var typeS = typeParameterTypeStar(S);
-
-    var T = typeParameter('T', bound: typeS);
-    var typeT = typeParameterTypeStar(T);
-
-    _checkLeastUpperBound(typeT, typeS, typeS);
-  }
-
-  void test_typeParam_class_implements_Function_ignored() {
-    var A = class_(name: 'A', superType: typeProvider.functionType);
-    var T = typeParameter('T', bound: interfaceTypeStar(A));
-    _checkLeastUpperBound(typeParameterTypeStar(T),
-        functionTypeStar(returnType: voidNone), objectStar);
-  }
-
-  void test_typeParam_fBounded() {
-    var T = typeParameter('Q');
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    var S = typeParameter('S');
-    var typeS = typeParameterTypeStar(S);
-    S.bound = interfaceTypeStar(A, typeArguments: [typeS]);
-
-    var U = typeParameter('U');
-    var typeU = typeParameterTypeStar(U);
-    U.bound = interfaceTypeStar(A, typeArguments: [typeU]);
-
-    _checkLeastUpperBound(
-      typeS,
-      typeParameterTypeStar(U),
-      interfaceTypeStar(A, typeArguments: [objectStar]),
-    );
-  }
-
-  void test_typeParam_function_bounded() {
-    var T = typeParameter('T', bound: typeProvider.functionType);
-    _checkLeastUpperBound(
-      typeParameterTypeStar(T),
-      functionTypeStar(returnType: voidNone),
-      typeProvider.functionType,
-    );
-  }
-
-  void test_typeParam_function_noBound() {
-    var T = typeParameter('T');
-    _checkLeastUpperBound(
-      typeParameterTypeStar(T),
-      functionTypeStar(returnType: voidNone),
-      objectStar,
-    );
-  }
-
-  void test_typeParam_interface_bounded() {
-    var A = class_(name: 'A');
-    var typeA = interfaceTypeStar(A);
-
-    var B = class_(name: 'B', superType: typeA);
-    var typeB = interfaceTypeStar(B);
-
-    var C = class_(name: 'C', superType: typeA);
-    var typeC = interfaceTypeStar(C);
-
-    var T = typeParameter('T', bound: typeB);
-    var typeT = typeParameterTypeStar(T);
-
-    _checkLeastUpperBound(typeT, typeC, typeA);
-  }
-
-  void test_typeParam_interface_noBound() {
-    var T = typeParameter('T');
-    var A = class_(name: 'A');
-    _checkLeastUpperBound(
-      typeParameterTypeStar(T),
-      interfaceTypeStar(A),
-      objectStar,
-    );
-  }
-
-  void test_typeParameters_contravariant_different() {
-    // class A<in T>
-    var T = typeParameter('T', variance: Variance.contravariant);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    // A<num>
-    // A<int>
-    var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-    var aInt = interfaceTypeStar(A, typeArguments: [intStar]);
-
-    _checkLeastUpperBound(aInt, aNum, aInt);
-  }
-
-  void test_typeParameters_contravariant_same() {
-    // class A<in T>
-    var T = typeParameter('T', variance: Variance.contravariant);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    // A<num>
-    var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-
-    _checkLeastUpperBound(aNum, aNum, aNum);
-  }
-
-  void test_typeParameters_covariant_different() {
-    // class A<out T>
-    var T = typeParameter('T', variance: Variance.covariant);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    // A<num>
-    // A<int>
-    var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-    var aInt = interfaceTypeStar(A, typeArguments: [intStar]);
-
-    _checkLeastUpperBound(aInt, aNum, aNum);
-  }
-
-  void test_typeParameters_covariant_same() {
-    // class A<out T>
-    var T = typeParameter('T', variance: Variance.covariant);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    // A<num>
-    var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-
-    _checkLeastUpperBound(aNum, aNum, aNum);
-  }
-
-  /// Check least upper bound of the same class with different type parameters.
-  void test_typeParameters_different() {
-    // class List<int>
-    // class List<double>
-    var listOfIntType = listStar(intStar);
-    var listOfDoubleType = listStar(doubleStar);
-    var listOfNum = listStar(numStar);
-    _checkLeastUpperBound(listOfIntType, listOfDoubleType, listOfNum);
-  }
-
-  void test_typeParameters_invariant_object() {
-    // class A<inout T>
-    var T = typeParameter('T', variance: Variance.invariant);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    // A<num>
-    // A<int>
-    var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-    var aInt = interfaceTypeStar(A, typeArguments: [intStar]);
-
-    _checkLeastUpperBound(aNum, aInt, objectStar);
-  }
-
-  void test_typeParameters_invariant_same() {
-    // class A<inout T>
-    var T = typeParameter('T', variance: Variance.invariant);
-    var A = class_(name: 'A', typeParameters: [T]);
-
-    // A<num>
-    var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-
-    _checkLeastUpperBound(aNum, aNum, aNum);
-  }
-
-  void test_typeParameters_multi_basic() {
-    // class Multi<out T, inout U, in V>
-    var T = typeParameter('T', variance: Variance.covariant);
-    var U = typeParameter('T', variance: Variance.invariant);
-    var V = typeParameter('T', variance: Variance.contravariant);
-    var Multi = class_(name: 'A', typeParameters: [T, U, V]);
-
-    // Multi<num, num, num>
-    // Multi<int, num, int>
-    var multiNumNumNum =
-        interfaceTypeStar(Multi, typeArguments: [numStar, numStar, numStar]);
-    var multiIntNumInt =
-        interfaceTypeStar(Multi, typeArguments: [intStar, numStar, intStar]);
-
-    // We expect Multi<num, num, int>
-    var multiNumNumInt =
-        interfaceTypeStar(Multi, typeArguments: [numStar, numStar, intStar]);
-
-    _checkLeastUpperBound(multiNumNumNum, multiIntNumInt, multiNumNumInt);
-  }
-
-  void test_typeParameters_multi_objectInterface() {
-    // class Multi<out T, inout U, in V>
-    var T = typeParameter('T', variance: Variance.covariant);
-    var U = typeParameter('T', variance: Variance.invariant);
-    var V = typeParameter('T', variance: Variance.contravariant);
-    var Multi = class_(name: 'A', typeParameters: [T, U, V]);
-
-    // Multi<num, String, num>
-    // Multi<int, num, int>
-    var multiNumStringNum =
-        interfaceTypeStar(Multi, typeArguments: [numStar, stringStar, numStar]);
-    var multiIntNumInt =
-        interfaceTypeStar(Multi, typeArguments: [intStar, numStar, intStar]);
-
-    _checkLeastUpperBound(multiNumStringNum, multiIntNumInt, objectStar);
-  }
-
-  void test_typeParameters_multi_objectType() {
-    // class Multi<out T, inout U, in V>
-    var T = typeParameter('T', variance: Variance.covariant);
-    var U = typeParameter('T', variance: Variance.invariant);
-    var V = typeParameter('T', variance: Variance.contravariant);
-    var Multi = class_(name: 'A', typeParameters: [T, U, V]);
-
-    // Multi<String, num, num>
-    // Multi<int, num, int>
-    var multiStringNumNum =
-        interfaceTypeStar(Multi, typeArguments: [stringStar, numStar, numStar]);
-    var multiIntNumInt =
-        interfaceTypeStar(Multi, typeArguments: [intStar, numStar, intStar]);
-
-    // We expect Multi<Object, num, int>
-    var multiObjectNumInt =
-        interfaceTypeStar(Multi, typeArguments: [objectStar, numStar, intStar]);
-
-    _checkLeastUpperBound(multiStringNumNum, multiIntNumInt, multiObjectNumInt);
-  }
-
-  void test_typeParameters_same() {
-    // List<int>
-    // List<int>
-    var listOfIntType = listStar(intStar);
-    _checkLeastUpperBound(listOfIntType, listOfIntType, listOfIntType);
-  }
-
-  /// Check least upper bound of two related classes with different
-  /// type parameters.
-  void test_typeParametersAndClass_different() {
-    // class List<int>
-    // class Iterable<double>
-    var listOfIntType = listStar(intStar);
-    var iterableOfDoubleType = iterableStar(doubleStar);
-    // TODO(leafp): this should be iterableOfNumType
-    _checkLeastUpperBound(listOfIntType, iterableOfDoubleType, objectStar);
-  }
-
-  void test_void() {
-    var T = typeParameter('T');
-    var A = class_(name: 'A');
-    List<DartType> types = [
-      neverStar,
-      functionTypeStar(returnType: voidNone),
-      interfaceTypeStar(A),
-      typeParameterTypeStar(T),
-    ];
-    for (DartType type in types) {
-      _checkLeastUpperBound(
-        functionTypeStar(returnType: voidNone),
-        functionTypeStar(returnType: type),
-        functionTypeStar(returnType: voidNone),
-      );
-    }
-  }
-}
-
 @reflectiveTest
 class TryPromoteToTest extends AbstractTypeSystemTest {
   @override
diff --git a/pkg/analyzer/test/source/error_processor_test.dart b/pkg/analyzer/test/source/error_processor_test.dart
index f3e548d..2a58d77 100644
--- a/pkg/analyzer/test/source/error_processor_test.dart
+++ b/pkg/analyzer/test/source/error_processor_test.dart
@@ -19,7 +19,7 @@
 
 main() {
   AnalysisError invalid_assignment = AnalysisError(
-      TestSource(), 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
+      TestSource(), 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
     ['x'],
     ['y']
   ]);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 031f9e3..2f46907 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1666,7 +1666,7 @@
       ResolvedUnitResult result = await driver.getResult(b);
       List<AnalysisError> errors = result.errors;
       expect(errors, hasLength(1));
-      expect(errors[0].errorCode, StaticTypeWarningCode.INVALID_ASSIGNMENT);
+      expect(errors[0].errorCode, CompileTimeErrorCode.INVALID_ASSIGNMENT);
     }
   }
 
diff --git a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
index 3e95b6c..30418ae 100644
--- a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
@@ -11,7 +11,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../generated/elements_types_mixin.dart';
+import '../../../generated/type_system_test.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -20,7 +20,7 @@
 }
 
 @reflectiveTest
-class InterfaceLeastUpperBoundHelperTest with ElementsTypesMixin {
+class InterfaceLeastUpperBoundHelperTest extends AbstractTypeSystemTest {
   @override
   final TestTypeProvider typeProvider = TestTypeProvider();
 
@@ -535,6 +535,7 @@
   }
 
   Set<InstantiatedClass> _superInterfaces(InstantiatedClass type) {
-    return InterfaceLeastUpperBoundHelper.computeSuperinterfaceSet(type);
+    var helper = InterfaceLeastUpperBoundHelper(typeSystem);
+    return helper.computeSuperinterfaceSet(type);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
index 19d5cef..6454cda 100644
--- a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
+++ b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
@@ -11,6 +12,7 @@
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/element/type_visitor.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -20,6 +22,8 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(BoundsHelperPredicatesTest);
     defineReflectiveTests(LowerBoundTest);
+    defineReflectiveTests(UpperBound_FunctionTypes_Test);
+    defineReflectiveTests(UpperBound_InterfaceTypes_Test);
     defineReflectiveTests(UpperBoundTest);
   });
 }
@@ -528,8 +532,8 @@
 class LowerBoundTest extends _BoundsTestBase {
   test_bottom_any() {
     void check(DartType T1, DartType T2) {
-      expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isBottom(T2), isFalse, reason: _typeString(T2));
+      _assertBottom(T1);
+      _assertNotBottom(T2);
       _checkGreatestLowerBound(T1, T2, T1);
     }
 
@@ -571,8 +575,8 @@
 
   test_bottom_bottom() {
     void check(DartType T1, DartType T2) {
-      expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isBottom(T2), isTrue, reason: _typeString(T2));
+      _assertBottom(T1);
+      _assertBottom(T2);
       _checkGreatestLowerBound(T1, T2, T1);
     }
 
@@ -1097,11 +1101,9 @@
 
   test_null_any() {
     void check(DartType T2, DartType expected) {
-      var T2_str = _typeString(T2);
-
-      expect(typeSystem.isNull(T2), isFalse, reason: 'isNull: $T2_str');
-      expect(typeSystem.isTop(T2), isFalse, reason: 'isTop: $T2_str');
-      expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+      _assertNotBottom(T2);
+      _assertNotNull(T2);
+      _assertNotTop(T2);
 
       _checkGreatestLowerBound(nullNone, T2, expected);
     }
@@ -1143,14 +1145,11 @@
 
   test_null_null() {
     void check(DartType T1, DartType T2) {
-      var T1_str = _typeString(T1);
-      var T2_str = _typeString(T2);
+      _assertNull(T1);
+      _assertNull(T2);
 
-      expect(typeSystem.isNull(T1), isTrue, reason: 'isNull: $T1_str');
-      expect(typeSystem.isNull(T2), isTrue, reason: 'isNull: $T2_str');
-
-      expect(typeSystem.isBottom(T1), isFalse, reason: 'isBottom: $T1_str');
-      expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+      _assertNotBottom(T1);
+      _assertNotBottom(T2);
 
       _checkGreatestLowerBound(T1, T2, T1);
     }
@@ -1161,8 +1160,7 @@
 
   test_object_any() {
     void check(DartType T2, DartType expected) {
-      var T2_str = _typeString(T2);
-      expect(typeSystem.isObject(T2), isFalse, reason: 'isObject: $T2_str');
+      _assertNotObject(T2);
 
       _checkGreatestLowerBound(objectNone, T2, expected);
     }
@@ -1216,11 +1214,8 @@
 
   test_object_object() {
     void check(DartType T1, DartType T2) {
-      var T1_str = _typeString(T1);
-      var T2_str = _typeString(T2);
-
-      expect(typeSystem.isObject(T1), isTrue, reason: 'isObject: $T1_str');
-      expect(typeSystem.isObject(T2), isTrue, reason: 'isObject: $T2_str');
+      _assertObject(T1);
+      _assertObject(T2);
 
       _checkGreatestLowerBound(T1, T2, T1);
     }
@@ -1309,8 +1304,8 @@
 
   test_top_any() {
     void check(DartType T1, DartType T2) {
-      expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isTop(T2), isFalse, reason: _typeString(T2));
+      _assertTop(T1);
+      _assertNotTop(T2);
       _checkGreatestLowerBound(T1, T2, T2);
     }
 
@@ -1357,8 +1352,8 @@
 
   test_top_top() {
     void check(DartType T1, DartType T2) {
-      expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isTop(T2), isTrue, reason: _typeString(T2));
+      _assertTop(T1);
+      _assertTop(T2);
       _checkGreatestLowerBound(T1, T2, T2);
     }
 
@@ -1455,74 +1450,182 @@
 }
 
 @reflectiveTest
-class UpperBoundTest extends _BoundsTestBase {
-  test_bottom_any() {
-    void check(DartType T1, DartType T2) {
-      expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isBottom(T2), isFalse, reason: _typeString(T2));
-      _checkLeastUpperBound(T1, T2, T2);
-    }
-
-    check(neverNone, objectNone);
-    check(neverNone, objectStar);
-    check(neverNone, objectQuestion);
-
-    check(neverNone, intNone);
-    check(neverNone, intQuestion);
-    check(neverNone, intStar);
-
-    check(neverNone, listNone(intNone));
-    check(neverNone, listQuestion(intNone));
-    check(neverNone, listStar(intNone));
-
-    check(neverNone, futureOrNone(intNone));
-    check(neverNone, futureOrQuestion(intNone));
-    check(neverNone, futureOrStar(intNone));
-
-    {
-      var T = typeParameterTypeNone(
-        typeParameter('T', bound: neverNone),
-      );
-      check(T, intNone);
-      check(T, intQuestion);
-      check(T, intStar);
-    }
-
-    {
-      var T = promotedTypeParameterTypeNone(
-        typeParameter('T', bound: objectQuestion),
-        neverNone,
-      );
-      check(T, intNone);
-      check(T, intQuestion);
-      check(T, intStar);
-    }
-  }
-
-  test_bottom_bottom() {
-    void check(DartType T1, DartType T2) {
-      expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isBottom(T2), isTrue, reason: _typeString(T2));
-      _checkLeastUpperBound(T1, T2, T2);
-    }
-
-    check(
-      neverNone,
-      typeParameterTypeNone(
-        typeParameter('T', bound: neverNone),
-      ),
+class UpperBound_FunctionTypes_Test extends _BoundsTestBase {
+  void test_nested2_upParameterType() {
+    var T1 = functionTypeNone(
+      parameters: [
+        requiredParameter(
+          type: functionTypeNone(
+            parameters: [
+              requiredParameter(type: stringNone),
+              requiredParameter(type: intNone),
+              requiredParameter(type: intNone),
+            ],
+            returnType: voidNone,
+          ),
+        ),
+      ],
+      returnType: voidNone,
+    );
+    expect(
+      _typeString(T1),
+      'void Function(void Function(String, int, int))',
     );
 
-    check(
-      neverNone,
-      promotedTypeParameterTypeNone(
-        typeParameter('T', bound: objectQuestion),
-        neverNone,
-      ),
+    var T2 = functionTypeNone(
+      parameters: [
+        requiredParameter(
+          type: functionTypeNone(
+            parameters: [
+              requiredParameter(type: intNone),
+              requiredParameter(type: doubleNone),
+              requiredParameter(type: numNone),
+            ],
+            returnType: voidNone,
+          ),
+        ),
+      ],
+      returnType: voidNone,
     );
+    expect(
+      _typeString(T2),
+      'void Function(void Function(int, double, num))',
+    );
+
+    var expected = functionTypeNone(
+      parameters: [
+        requiredParameter(
+          type: functionTypeNone(
+            parameters: [
+              requiredParameter(type: objectNone),
+              requiredParameter(type: numNone),
+              requiredParameter(type: numNone),
+            ],
+            returnType: voidNone,
+          ),
+        ),
+      ],
+      returnType: voidNone,
+    );
+    expect(
+      _typeString(expected),
+      'void Function(void Function(Object, num, num))',
+    );
+
+    _checkLeastUpperBound(T1, T2, expected);
   }
 
-  test_functionType2_parameters_optionalNamed() {
+  void test_nested3_downParameterTypes() {
+    var T1 = functionTypeNone(
+      parameters: [
+        requiredParameter(
+          type: functionTypeNone(
+            parameters: [
+              requiredParameter(
+                type: functionTypeNone(
+                  parameters: [
+                    requiredParameter(type: stringNone),
+                    requiredParameter(type: intNone),
+                    requiredParameter(type: intNone)
+                  ],
+                  returnType: voidNone,
+                ),
+              ),
+            ],
+            returnType: voidNone,
+          ),
+        ),
+      ],
+      returnType: voidNone,
+    );
+    expect(
+      _typeString(T1),
+      'void Function(void Function(void Function(String, int, int)))',
+    );
+
+    var T2 = functionTypeNone(
+      parameters: [
+        requiredParameter(
+          type: functionTypeNone(
+            parameters: [
+              requiredParameter(
+                type: functionTypeNone(
+                  parameters: [
+                    requiredParameter(type: intNone),
+                    requiredParameter(type: doubleNone),
+                    requiredParameter(type: numNone)
+                  ],
+                  returnType: voidNone,
+                ),
+              ),
+            ],
+            returnType: voidNone,
+          ),
+        ),
+      ],
+      returnType: voidNone,
+    );
+    expect(
+      _typeString(T2),
+      'void Function(void Function(void Function(int, double, num)))',
+    );
+
+    var expected = functionTypeNone(
+      parameters: [
+        requiredParameter(
+          type: functionTypeNone(
+            parameters: [
+              requiredParameter(
+                type: functionTypeNone(
+                  parameters: [
+                    requiredParameter(type: neverNone),
+                    requiredParameter(type: neverNone),
+                    requiredParameter(type: intNone)
+                  ],
+                  returnType: voidNone,
+                ),
+              ),
+            ],
+            returnType: voidNone,
+          ),
+        ),
+      ],
+      returnType: voidNone,
+    );
+    expect(
+      _typeString(expected),
+      'void Function(void Function(void Function(Never, Never, int)))',
+    );
+
+    _checkLeastUpperBound(T1, T2, expected);
+  }
+
+  void test_parameters_fuzzyArrows() {
+    var T1 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: dynamicType),
+      ],
+      returnType: voidNone,
+    );
+
+    var T2 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: intNone),
+      ],
+      returnType: voidNone,
+    );
+
+    var expected = functionTypeNone(
+      parameters: [
+        requiredParameter(type: intNone),
+      ],
+      returnType: voidNone,
+    );
+
+    _checkLeastUpperBound(T1, T2, expected);
+  }
+
+  test_parameters_optionalNamed() {
     FunctionType build(Map<String, DartType> namedTypes) {
       return functionTypeNone(
         returnType: voidNone,
@@ -1549,7 +1652,7 @@
     check({'a': intNone, 'b': doubleNone}, {'a': intNone}, {'a': intNone});
   }
 
-  test_functionType2_parameters_optionalPositional() {
+  test_parameters_optionalPositional() {
     FunctionType build(List<DartType> positionalTypes) {
       return functionTypeNone(
         returnType: voidNone,
@@ -1584,7 +1687,7 @@
     );
   }
 
-  test_functionType2_parameters_requiredNamed() {
+  test_parameters_requiredNamed() {
     _checkLeastUpperBound(
       functionTypeNone(
         returnType: voidNone,
@@ -1698,7 +1801,7 @@
     );
   }
 
-  test_functionType2_parameters_requiredPositional() {
+  test_parameters_requiredPositional() {
     FunctionType build(List<DartType> requiredTypes) {
       return functionTypeNone(
         returnType: voidNone,
@@ -1732,7 +1835,28 @@
     );
   }
 
-  test_functionType2_returnType() {
+  void test_parameters_requiredPositional_differentArity() {
+    var T1 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: intNone),
+        requiredParameter(type: intNone),
+      ],
+      returnType: voidNone,
+    );
+
+    var T2 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: intNone),
+        requiredParameter(type: intNone),
+        requiredParameter(type: intNone),
+      ],
+      returnType: voidNone,
+    );
+
+    _checkLeastUpperBound(T1, T2, typeProvider.functionType);
+  }
+
+  test_returnType() {
     void check(DartType T1_ret, DartType T2_ret, DartType expected_ret) {
       _checkLeastUpperBound(
         functionTypeNone(returnType: T1_ret),
@@ -1753,7 +1877,75 @@
     check(intNone, neverNone, intNone);
   }
 
-  test_functionType2_typeParameters() {
+  void test_sameType_withNamed() {
+    var T1 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: stringNone),
+        requiredParameter(type: intNone),
+        requiredParameter(type: numNone),
+        namedParameter(name: 'n', type: numNone),
+      ],
+      returnType: intNone,
+    );
+
+    var T2 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: stringNone),
+        requiredParameter(type: intNone),
+        requiredParameter(type: numNone),
+        namedParameter(name: 'n', type: numNone),
+      ],
+      returnType: intNone,
+    );
+
+    var expected = functionTypeNone(
+      parameters: [
+        requiredParameter(type: stringNone),
+        requiredParameter(type: intNone),
+        requiredParameter(type: numNone),
+        namedParameter(name: 'n', type: numNone),
+      ],
+      returnType: intNone,
+    );
+
+    _checkLeastUpperBound(T1, T2, expected);
+  }
+
+  void test_sameType_withOptional() {
+    var T1 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: stringNone),
+        requiredParameter(type: intNone),
+        requiredParameter(type: numNone),
+        positionalParameter(type: doubleNone),
+      ],
+      returnType: intNone,
+    );
+
+    var T2 = functionTypeNone(
+      parameters: [
+        requiredParameter(type: stringNone),
+        requiredParameter(type: intNone),
+        requiredParameter(type: numNone),
+        positionalParameter(type: doubleNone),
+      ],
+      returnType: intNone,
+    );
+
+    var expected = functionTypeNone(
+      parameters: [
+        requiredParameter(type: stringNone),
+        requiredParameter(type: intNone),
+        requiredParameter(type: numNone),
+        positionalParameter(type: doubleNone),
+      ],
+      returnType: intNone,
+    );
+
+    _checkLeastUpperBound(T1, T2, expected);
+  }
+
+  test_typeParameters() {
     void check(FunctionType T1, FunctionType T2, DartType expected) {
       _assertNullabilityNone(T1);
       _assertNullabilityNone(T2);
@@ -1808,6 +2000,559 @@
       );
     }
   }
+}
+
+@reflectiveTest
+class UpperBound_InterfaceTypes_Test extends _BoundsTestBase {
+  test_directInterface() {
+    // class A
+    // class B implements A
+    // class C implements B
+
+    var A = class_(name: 'A');
+    var typeA = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', interfaces: [typeA]);
+    var typeB = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', interfaces: [typeB]);
+    var typeC = interfaceTypeNone(C);
+
+    _checkLeastUpperBound(typeB, typeC, typeB);
+  }
+
+  test_directInterface_legacy() {
+    typeSystem = analysisContext.typeSystemLegacy;
+
+    // (null safe) class A<T> {}
+    // (legacy)    class B implements A<int> {}
+    // (null safe) class C implements A<int> {}
+
+    var A = class_(
+      name: 'A',
+      typeParameters: [typeParameter('T')],
+    );
+
+    var B = class_(
+      name: 'B',
+      interfaces: [
+        interfaceTypeStar(A, typeArguments: [intStar])
+      ],
+    );
+
+    var C = class_(
+      name: 'C',
+      interfaces: [
+        interfaceTypeNone(A, typeArguments: [intNone])
+      ],
+    );
+
+    _checkLeastUpperBound(
+      interfaceTypeNone(B),
+      interfaceTypeNone(C),
+      interfaceTypeNone(A, typeArguments: [intStar]),
+    );
+  }
+
+  test_directSuperclass() {
+    // class A
+    // class B extends A
+    // class C extends B
+
+    var A = class_(name: 'A');
+    var typeA = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', superType: typeA);
+    var typeB = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', superType: typeB);
+    var typeC = interfaceTypeNone(C);
+
+    _checkLeastUpperBound(typeB, typeC, typeB);
+  }
+
+  void test_directSuperclass_nullability() {
+    var aElement = class_(name: 'A');
+    var aQuestion = interfaceTypeQuestion(aElement);
+    var aStar = interfaceTypeStar(aElement);
+    var aNone = interfaceTypeNone(aElement);
+
+    var bElementStar = class_(name: 'B', superType: aStar);
+    var bElementNone = class_(name: 'B', superType: aNone);
+
+    InterfaceTypeImpl _bTypeStarElement(NullabilitySuffix nullability) {
+      return interfaceType(
+        bElementStar,
+        nullabilitySuffix: nullability,
+      );
+    }
+
+    InterfaceTypeImpl _bTypeNoneElement(NullabilitySuffix nullability) {
+      return interfaceType(
+        bElementNone,
+        nullabilitySuffix: nullability,
+      );
+    }
+
+    var bStarQuestion = _bTypeStarElement(NullabilitySuffix.question);
+    var bStarStar = _bTypeStarElement(NullabilitySuffix.star);
+    var bStarNone = _bTypeStarElement(NullabilitySuffix.none);
+
+    var bNoneQuestion = _bTypeNoneElement(NullabilitySuffix.question);
+    var bNoneStar = _bTypeNoneElement(NullabilitySuffix.star);
+    var bNoneNone = _bTypeNoneElement(NullabilitySuffix.none);
+
+    void assertLUB(DartType type1, DartType type2, DartType expected) {
+      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+    }
+
+    assertLUB(bStarQuestion, aQuestion, aQuestion);
+    assertLUB(bStarQuestion, aStar, aQuestion);
+    assertLUB(bStarQuestion, aNone, aQuestion);
+
+    assertLUB(bStarStar, aQuestion, aQuestion);
+    assertLUB(bStarStar, aStar, aStar);
+    assertLUB(bStarStar, aNone, aStar);
+
+    assertLUB(bStarNone, aQuestion, aQuestion);
+    assertLUB(bStarNone, aStar, aStar);
+    assertLUB(bStarNone, aNone, aNone);
+
+    assertLUB(bNoneQuestion, aQuestion, aQuestion);
+    assertLUB(bNoneQuestion, aStar, aQuestion);
+    assertLUB(bNoneQuestion, aNone, aQuestion);
+
+    assertLUB(bNoneStar, aQuestion, aQuestion);
+    assertLUB(bNoneStar, aStar, aStar);
+    assertLUB(bNoneStar, aNone, aStar);
+
+    assertLUB(bNoneNone, aQuestion, aQuestion);
+    assertLUB(bNoneNone, aStar, aStar);
+    assertLUB(bNoneNone, aNone, aNone);
+  }
+
+  void test_implementationsOfComparable() {
+    _checkLeastUpperBound(stringNone, numNone, objectNone);
+  }
+
+  void test_mixinAndClass_constraintAndInterface() {
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', interfaces: [A_none]);
+    var M = mixin_(name: 'M', constraints: [A_none]);
+
+    _checkLeastUpperBound(
+      interfaceTypeNone(B),
+      interfaceTypeNone(M),
+      A_none,
+    );
+  }
+
+  void test_mixinAndClass_object() {
+    var A = class_(name: 'A');
+    var M = mixin_(name: 'M');
+
+    _checkLeastUpperBound(
+      interfaceTypeNone(A),
+      interfaceTypeNone(M),
+      objectNone,
+    );
+  }
+
+  void test_mixinAndClass_sharedInterface() {
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', interfaces: [A_none]);
+    var M = mixin_(name: 'M', interfaces: [A_none]);
+
+    _checkLeastUpperBound(
+      interfaceTypeNone(B),
+      interfaceTypeNone(M),
+      A_none,
+    );
+  }
+
+  void test_sameElement_nullability() {
+    var aElement = class_(name: 'A');
+
+    var aQuestion = interfaceTypeQuestion(aElement);
+    var aStar = interfaceTypeStar(aElement);
+    var aNone = interfaceTypeNone(aElement);
+
+    void assertLUB(DartType type1, DartType type2, DartType expected) {
+      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+    }
+
+    assertLUB(aQuestion, aQuestion, aQuestion);
+    assertLUB(aQuestion, aStar, aQuestion);
+    assertLUB(aQuestion, aNone, aQuestion);
+
+    assertLUB(aStar, aQuestion, aQuestion);
+    assertLUB(aStar, aStar, aStar);
+    assertLUB(aStar, aNone, aStar);
+
+    assertLUB(aNone, aQuestion, aQuestion);
+    assertLUB(aNone, aStar, aStar);
+    assertLUB(aNone, aNone, aNone);
+  }
+
+  void test_sharedSuperclass1() {
+    // class A {}
+    // class B extends A {}
+    // class C extends A {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', superType: A_none);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', superType: A_none);
+    var C_none = interfaceTypeNone(C);
+
+    _checkLeastUpperBound(B_none, C_none, A_none);
+  }
+
+  void test_sharedSuperclass1_nullability() {
+    var aElement = class_(name: 'A');
+    var aQuestion = interfaceTypeQuestion(aElement);
+    var aStar = interfaceTypeStar(aElement);
+    var aNone = interfaceTypeNone(aElement);
+
+    var bElementNone = class_(name: 'B', superType: aNone);
+    var bElementStar = class_(name: 'B', superType: aStar);
+
+    var cElementNone = class_(name: 'C', superType: aNone);
+    var cElementStar = class_(name: 'C', superType: aStar);
+
+    InterfaceTypeImpl bTypeElementNone(NullabilitySuffix nullability) {
+      return interfaceType(
+        bElementNone,
+        nullabilitySuffix: nullability,
+      );
+    }
+
+    InterfaceTypeImpl bTypeElementStar(NullabilitySuffix nullability) {
+      return interfaceType(
+        bElementStar,
+        nullabilitySuffix: nullability,
+      );
+    }
+
+    var bNoneQuestion = bTypeElementNone(NullabilitySuffix.question);
+    var bNoneStar = bTypeElementNone(NullabilitySuffix.star);
+    var bNoneNone = bTypeElementNone(NullabilitySuffix.none);
+
+    var bStarQuestion = bTypeElementStar(NullabilitySuffix.question);
+    var bStarStar = bTypeElementStar(NullabilitySuffix.star);
+    var bStarNone = bTypeElementStar(NullabilitySuffix.none);
+
+    InterfaceTypeImpl cTypeElementNone(NullabilitySuffix nullability) {
+      return interfaceType(
+        cElementNone,
+        nullabilitySuffix: nullability,
+      );
+    }
+
+    InterfaceTypeImpl cTypeElementStar(NullabilitySuffix nullability) {
+      return interfaceType(
+        cElementStar,
+        nullabilitySuffix: nullability,
+      );
+    }
+
+    var cNoneQuestion = cTypeElementNone(NullabilitySuffix.question);
+    var cNoneStar = cTypeElementNone(NullabilitySuffix.star);
+    var cNoneNone = cTypeElementNone(NullabilitySuffix.none);
+
+    var cStarQuestion = cTypeElementStar(NullabilitySuffix.question);
+    var cStarStar = cTypeElementStar(NullabilitySuffix.star);
+    var cStarNone = cTypeElementStar(NullabilitySuffix.none);
+
+    void assertLUB(DartType type1, DartType type2, DartType expected) {
+      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+    }
+
+    assertLUB(bNoneQuestion, cNoneQuestion, aQuestion);
+    assertLUB(bNoneQuestion, cNoneStar, aQuestion);
+    assertLUB(bNoneQuestion, cNoneNone, aQuestion);
+    assertLUB(bNoneQuestion, cStarQuestion, aQuestion);
+    assertLUB(bNoneQuestion, cStarStar, aQuestion);
+    assertLUB(bNoneQuestion, cStarNone, aQuestion);
+
+    assertLUB(bNoneStar, cNoneQuestion, aQuestion);
+    assertLUB(bNoneStar, cNoneStar, aStar);
+    assertLUB(bNoneStar, cNoneNone, aStar);
+    assertLUB(bNoneStar, cStarQuestion, aQuestion);
+    assertLUB(bNoneStar, cStarStar, aStar);
+    assertLUB(bNoneStar, cStarNone, aStar);
+
+    assertLUB(bNoneNone, cNoneQuestion, aQuestion);
+    assertLUB(bNoneNone, cNoneStar, aStar);
+    assertLUB(bNoneNone, cNoneNone, aNone);
+    assertLUB(bNoneNone, cStarQuestion, aQuestion);
+    assertLUB(bNoneNone, cStarStar, aStar);
+    assertLUB(bNoneNone, cStarNone, aNone);
+
+    assertLUB(bStarQuestion, cNoneQuestion, aQuestion);
+    assertLUB(bStarQuestion, cNoneStar, aQuestion);
+    assertLUB(bStarQuestion, cNoneNone, aQuestion);
+    assertLUB(bStarQuestion, cStarQuestion, aQuestion);
+    assertLUB(bStarQuestion, cStarStar, aQuestion);
+    assertLUB(bStarQuestion, cStarNone, aQuestion);
+
+    assertLUB(bStarStar, cNoneQuestion, aQuestion);
+    assertLUB(bStarStar, cNoneStar, aStar);
+    assertLUB(bStarStar, cNoneNone, aStar);
+    assertLUB(bStarStar, cStarQuestion, aQuestion);
+    assertLUB(bStarStar, cStarStar, aStar);
+    assertLUB(bStarStar, cStarNone, aStar);
+
+    assertLUB(bStarNone, cNoneQuestion, aQuestion);
+    assertLUB(bStarNone, cNoneStar, aStar);
+    assertLUB(bStarNone, cNoneNone, aNone);
+    assertLUB(bStarNone, cStarQuestion, aQuestion);
+    assertLUB(bStarNone, cStarStar, aStar);
+    assertLUB(bStarNone, cStarNone, aNone);
+  }
+
+  void test_sharedSuperclass2() {
+    // class A {}
+    // class B extends A {}
+    // class C extends A {}
+    // class D extends C {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', superType: A_none);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', superType: A_none);
+    var C_none = interfaceTypeNone(C);
+
+    var D = class_(name: 'D', superType: C_none);
+    var D_none = interfaceTypeNone(D);
+
+    _checkLeastUpperBound(B_none, D_none, A_none);
+  }
+
+  void test_sharedSuperclass3() {
+    // class A {}
+    // class B extends A {}
+    // class C extends B {}
+    // class D extends B {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', superType: A_none);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', superType: B_none);
+    var C_none = interfaceTypeNone(C);
+
+    var D = class_(name: 'D', superType: B_none);
+    var D_none = interfaceTypeNone(D);
+
+    _checkLeastUpperBound(C_none, D_none, B_none);
+  }
+
+  void test_sharedSuperclass4() {
+    // class A {}
+    // class A2 {}
+    // class A3 {}
+    // class B extends A implements A2 {}
+    // class C extends A implement A3 {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var A2 = class_(name: 'A2');
+    var A2_none = interfaceTypeNone(A2);
+
+    var A3 = class_(name: 'A3');
+    var A3_none = interfaceTypeNone(A3);
+
+    var B = class_(name: 'B', superType: A_none, interfaces: [A2_none]);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', superType: A_none, interfaces: [A3_none]);
+    var C_none = interfaceTypeNone(C);
+
+    _checkLeastUpperBound(B_none, C_none, A_none);
+  }
+
+  void test_sharedSuperinterface1() {
+    // class A {}
+    // class B implements A {}
+    // class C implements A {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', interfaces: [A_none]);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', interfaces: [A_none]);
+    var C_none = interfaceTypeNone(C);
+
+    _checkLeastUpperBound(B_none, C_none, A_none);
+  }
+
+  void test_sharedSuperinterface2() {
+    // class A {}
+    // class B implements A {}
+    // class C implements A {}
+    // class D implements C {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', interfaces: [A_none]);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', interfaces: [A_none]);
+    var C_none = interfaceTypeNone(C);
+
+    var D = class_(name: 'D', interfaces: [C_none]);
+    var D_none = interfaceTypeNone(D);
+
+    _checkLeastUpperBound(B_none, D_none, A_none);
+  }
+
+  void test_sharedSuperinterface3() {
+    // class A {}
+    // class B implements A {}
+    // class C implements B {}
+    // class D implements B {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', interfaces: [A_none]);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', interfaces: [B_none]);
+    var C_none = interfaceTypeNone(C);
+
+    var D = class_(name: 'D', interfaces: [B_none]);
+    var D_none = interfaceTypeNone(D);
+
+    _checkLeastUpperBound(C_none, D_none, B_none);
+  }
+
+  void test_sharedSuperinterface4() {
+    // class A {}
+    // class A2 {}
+    // class A3 {}
+    // class B implements A, A2 {}
+    // class C implements A, A3 {}
+
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var A2 = class_(name: 'A2');
+    var A2_none = interfaceTypeNone(A2);
+
+    var A3 = class_(name: 'A3');
+    var A3_none = interfaceTypeNone(A3);
+
+    var B = class_(name: 'B', interfaces: [A_none, A2_none]);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', interfaces: [A_none, A3_none]);
+    var C_none = interfaceTypeNone(C);
+
+    _checkLeastUpperBound(B_none, C_none, A_none);
+  }
+}
+
+@reflectiveTest
+class UpperBoundTest extends _BoundsTestBase {
+  test_bottom_any() {
+    void check(DartType T1, DartType T2) {
+      _assertBottom(T1);
+      _assertNotBottom(T2);
+      _checkLeastUpperBound(T1, T2, T2);
+    }
+
+    check(neverNone, dynamicNone);
+
+    check(neverNone, objectNone);
+    check(neverNone, objectStar);
+    check(neverNone, objectQuestion);
+
+    check(neverNone, intNone);
+    check(neverNone, intQuestion);
+    check(neverNone, intStar);
+
+    check(neverNone, listNone(intNone));
+    check(neverNone, listQuestion(intNone));
+    check(neverNone, listStar(intNone));
+
+    check(neverNone, futureOrNone(intNone));
+    check(neverNone, futureOrQuestion(intNone));
+    check(neverNone, futureOrStar(intNone));
+
+    check(neverNone, functionTypeNone(returnType: voidNone));
+    check(neverNone, functionTypeQuestion(returnType: voidNone));
+    check(neverNone, functionTypeStar(returnType: voidNone));
+
+    {
+      var T = typeParameter('T');
+      check(neverNone, typeParameterTypeNone(T));
+      check(neverNone, typeParameterTypeQuestion(T));
+      check(neverNone, typeParameterTypeStar(T));
+    }
+
+    {
+      var T = typeParameterTypeNone(
+        typeParameter('T', bound: neverNone),
+      );
+      check(T, intNone);
+      check(T, intQuestion);
+      check(T, intStar);
+    }
+
+    {
+      var T = promotedTypeParameterTypeNone(
+        typeParameter('T', bound: objectQuestion),
+        neverNone,
+      );
+      check(T, intNone);
+      check(T, intQuestion);
+      check(T, intStar);
+    }
+  }
+
+  test_bottom_bottom() {
+    void check(DartType T1, DartType T2) {
+      _assertBottom(T1);
+      _assertBottom(T2);
+      _checkLeastUpperBound(T1, T2, T2);
+    }
+
+    check(
+      neverNone,
+      typeParameterTypeNone(
+        typeParameter('T', bound: neverNone),
+      ),
+    );
+
+    check(
+      neverNone,
+      promotedTypeParameterTypeNone(
+        typeParameter('T', bound: objectQuestion),
+        neverNone,
+      ),
+    );
+  }
 
   test_functionType_interfaceType() {
     void check(FunctionType T1, InterfaceType T2, InterfaceType expected) {
@@ -1860,6 +2605,16 @@
     check(listNone(intNone));
   }
 
+  void test_interfaceType_functionType() {
+    var A = class_(name: 'A');
+
+    _checkLeastUpperBound(
+      interfaceTypeNone(A),
+      functionTypeNone(returnType: voidNone),
+      objectNone,
+    );
+  }
+
   test_none_question() {
     void check(DartType T1, DartType T2, DartType expected) {
       _assertNullabilityNone(T1);
@@ -1894,17 +2649,14 @@
 
   test_null_any() {
     void check(DartType T1, DartType T2, DartType expected) {
-      var T1_str = _typeString(T1);
-      var T2_str = _typeString(T2);
+      _assertNull(T1);
+      _assertNotNull(T2);
 
-      expect(typeSystem.isNull(T1), isTrue, reason: 'isNull: $T1_str');
-      expect(typeSystem.isNull(T2), isFalse, reason: 'isNull: $T2_str');
+      _assertNotTop(T1);
+      _assertNotTop(T2);
 
-      expect(typeSystem.isTop(T1), isFalse, reason: 'isTop: $T1_str');
-      expect(typeSystem.isTop(T2), isFalse, reason: 'isTop: $T2_str');
-
-      expect(typeSystem.isBottom(T1), isFalse, reason: 'isBottom: $T1_str');
-      expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+      _assertNotBottom(T1);
+      _assertNotBottom(T2);
 
       _checkLeastUpperBound(T1, T2, expected);
     }
@@ -1943,14 +2695,11 @@
 
   test_null_null() {
     void check(DartType T1, DartType T2) {
-      var T1_str = _typeString(T1);
-      var T2_str = _typeString(T2);
+      _assertNull(T1);
+      _assertNull(T2);
 
-      expect(typeSystem.isNull(T1), isTrue, reason: 'isNull: $T1_str');
-      expect(typeSystem.isNull(T2), isTrue, reason: 'isNull: $T2_str');
-
-      expect(typeSystem.isBottom(T1), isFalse, reason: 'isBottom: $T1_str');
-      expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+      _assertNotBottom(T1);
+      _assertNotBottom(T2);
 
       _checkLeastUpperBound(T1, T2, T2);
     }
@@ -1961,11 +2710,8 @@
 
   test_object_any() {
     void check(DartType T1, DartType T2, DartType expected) {
-      var T1_str = _typeString(T1);
-      var T2_str = _typeString(T2);
-
-      expect(typeSystem.isObject(T1), isTrue, reason: 'isObject: $T1_str');
-      expect(typeSystem.isObject(T2), isFalse, reason: 'isObject: $T2_str');
+      _assertObject(T1);
+      _assertNotObject(T2);
 
       _checkLeastUpperBound(T1, T2, expected);
     }
@@ -1983,11 +2729,8 @@
 
   test_object_object() {
     void check(DartType T1, DartType T2) {
-      var T1_str = _typeString(T1);
-      var T2_str = _typeString(T2);
-
-      expect(typeSystem.isObject(T1), isTrue, reason: 'isObject: $T1_str');
-      expect(typeSystem.isObject(T2), isTrue, reason: 'isObject: $T2_str');
+      _assertObject(T1);
+      _assertObject(T2);
 
       _checkLeastUpperBound(T1, T2, T2);
     }
@@ -2052,48 +2795,42 @@
 
   test_top_any() {
     void check(DartType T1, DartType T2) {
-      expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isTop(T2), isFalse, reason: _typeString(T2));
+      _assertTop(T1);
+      _assertNotTop(T2);
       _checkLeastUpperBound(T1, T2, T1);
     }
 
-    check(voidNone, objectNone);
-    check(voidNone, intNone);
-    check(voidNone, intQuestion);
-    check(voidNone, intStar);
-    check(voidNone, listNone(intNone));
-    check(voidNone, futureOrNone(intNone));
+    void check2(DartType T1) {
+      check(T1, objectNone);
+      check(T1, intNone);
+      check(T1, intQuestion);
+      check(T1, intStar);
+      check(T1, listNone(intNone));
+      check(T1, futureOrNone(intNone));
+      check(T1, functionTypeNone(returnType: voidNone));
 
-    check(dynamicNone, objectNone);
-    check(dynamicNone, intNone);
-    check(dynamicNone, intQuestion);
-    check(dynamicNone, intStar);
-    check(dynamicNone, listNone(intNone));
-    check(dynamicNone, futureOrNone(intNone));
+      {
+        var T = typeParameter('T');
+        check(T1, typeParameterTypeNone(T));
+        check(T1, typeParameterTypeQuestion(T));
+        check(T1, typeParameterTypeStar(T));
+      }
+    }
 
-    check(objectQuestion, objectNone);
-    check(objectQuestion, intNone);
-    check(objectQuestion, intQuestion);
-    check(objectQuestion, intStar);
-    check(objectQuestion, listNone(intNone));
-    check(objectQuestion, futureOrNone(intNone));
+    check2(voidNone);
+    check2(dynamicNone);
+    check2(objectQuestion);
+    check2(objectStar);
 
-    check(objectStar, objectNone);
-    check(objectStar, intNone);
-    check(objectStar, intQuestion);
-    check(objectStar, intStar);
-    check(objectStar, listNone(intNone));
-    check(objectStar, futureOrNone(intNone));
-
-    check(futureOrNone(voidNone), intNone);
-    check(futureOrQuestion(voidNone), intNone);
-    check(futureOrStar(voidNone), intNone);
+    check2(futureOrNone(voidNone));
+    check2(futureOrQuestion(voidNone));
+    check2(futureOrStar(voidNone));
   }
 
   test_top_top() {
     void check(DartType T1, DartType T2) {
-      expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
-      expect(typeSystem.isTop(T2), isTrue, reason: _typeString(T2));
+      _assertTop(T1);
+      _assertTop(T2);
       _checkLeastUpperBound(T1, T2, T1);
     }
 
@@ -2188,32 +2925,246 @@
     }
   }
 
-  void _checkLeastUpperBound(DartType T1, DartType T2, DartType expected) {
-    var expectedStr = _typeString(expected);
+  void test_typeParameter_fBounded() {
+    // class A<T> {}
+    var T = typeParameter('T');
+    var A = class_(name: 'A', typeParameters: [T]);
 
-    var result = typeSystem.getLeastUpperBound(T1, T2);
-    var resultStr = _typeString(result);
-    expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
+    // <S extends A<S>>
+    var S = typeParameter('S');
+    var S_none = typeParameterTypeNone(S);
+    S.bound = interfaceTypeNone(A, typeArguments: [S_none]);
 
-    // Check that the result is an upper bound.
-    expect(typeSystem.isSubtypeOf2(T1, result), true);
-    expect(typeSystem.isSubtypeOf2(T2, result), true);
+    // <U extends A<U>>
+    var U = typeParameter('U');
+    var U_none = typeParameterTypeNone(U);
+    U.bound = interfaceTypeNone(A, typeArguments: [U_none]);
 
-    // Check for symmetry.
-    result = typeSystem.getLeastUpperBound(T2, T1);
-    resultStr = _typeString(result);
-    expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
+    _checkLeastUpperBound(
+      S_none,
+      typeParameterTypeNone(U),
+      interfaceTypeNone(A, typeArguments: [objectNone]),
+    );
+  }
+
+  void test_typeParameter_function_bounded() {
+    var T = typeParameter('T', bound: typeProvider.functionType);
+
+    _checkLeastUpperBound(
+      typeParameterTypeNone(T),
+      functionTypeNone(returnType: voidNone),
+      typeProvider.functionType,
+    );
+  }
+
+  void test_typeParameter_function_noBound() {
+    var T = typeParameter('T', bound: objectQuestion);
+
+    _checkLeastUpperBound(
+      typeParameterTypeNone(T),
+      functionTypeNone(returnType: voidNone),
+      objectQuestion,
+    );
+  }
+
+  void test_typeParameter_interface_bounded() {
+    var A = class_(name: 'A');
+    var A_none = interfaceTypeNone(A);
+
+    var B = class_(name: 'B', superType: A_none);
+    var B_none = interfaceTypeNone(B);
+
+    var C = class_(name: 'C', superType: A_none);
+    var C_none = interfaceTypeNone(C);
+
+    var T = typeParameter('T', bound: B_none);
+    var typeT = typeParameterTypeNone(T);
+
+    _checkLeastUpperBound(typeT, C_none, A_none);
+  }
+
+  void test_typeParameter_interface_noBound() {
+    var T = typeParameter('T', bound: objectQuestion);
+
+    var A = class_(name: 'A');
+
+    _checkLeastUpperBound(
+      typeParameterTypeNone(T),
+      interfaceTypeNone(A),
+      objectQuestion,
+    );
+  }
+
+  void test_typeParameters_contravariant_different() {
+    // class A<in T>
+    var T = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    // A<int>
+    var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+    var A_int = interfaceTypeNone(A, typeArguments: [intNone]);
+
+    _checkLeastUpperBound(A_int, A_num, A_int);
+  }
+
+  void test_typeParameters_contravariant_same() {
+    // class A<in T>
+    var T = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+
+    _checkLeastUpperBound(A_num, A_num, A_num);
+  }
+
+  void test_typeParameters_covariant_different() {
+    // class A<out T>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    // A<int>
+    var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+    var A_int = interfaceTypeNone(A, typeArguments: [intNone]);
+
+    _checkLeastUpperBound(A_int, A_num, A_num);
+  }
+
+  void test_typeParameters_covariant_same() {
+    // class A<out T>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    var A_num = interfaceTypeStar(A, typeArguments: [numNone]);
+
+    _checkLeastUpperBound(A_num, A_num, A_num);
+  }
+
+  void test_typeParameters_invariant_object() {
+    // class A<inout T>
+    var T = typeParameter('T', variance: Variance.invariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    // A<int>
+    var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+    var A_int = interfaceTypeNone(A, typeArguments: [intNone]);
+
+    _checkLeastUpperBound(A_num, A_int, objectNone);
+  }
+
+  void test_typeParameters_invariant_same() {
+    // class A<inout T>
+    var T = typeParameter('T', variance: Variance.invariant);
+    var A = class_(name: 'A', typeParameters: [T]);
+
+    // A<num>
+    var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+
+    _checkLeastUpperBound(A_num, A_num, A_num);
+  }
+
+  void test_typeParameters_multi_basic() {
+    // class A<out T, inout U, in V>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var U = typeParameter('T', variance: Variance.invariant);
+    var V = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T, U, V]);
+
+    // A<num, num, num>
+    // A<int, num, int>
+    var A_num_num_num = interfaceTypeNone(
+      A,
+      typeArguments: [numNone, numNone, numNone],
+    );
+    var A_num_int_num = interfaceTypeNone(
+      A,
+      typeArguments: [intNone, numNone, intNone],
+    );
+
+    // We expect A<num, num, int>
+    var A_num_num_int = interfaceTypeNone(
+      A,
+      typeArguments: [numNone, numNone, intNone],
+    );
+
+    _checkLeastUpperBound(A_num_num_num, A_num_int_num, A_num_num_int);
+  }
+
+  void test_typeParameters_multi_objectInterface() {
+    // class A<out T, inout U, in V>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var U = typeParameter('T', variance: Variance.invariant);
+    var V = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T, U, V]);
+
+    // A<num, String, num>
+    // A<int, num, int>
+    var A_num_String_num = interfaceTypeNone(
+      A,
+      typeArguments: [numNone, stringNone, numNone],
+    );
+    var A_int_num_int = interfaceTypeNone(
+      A,
+      typeArguments: [intNone, numNone, intNone],
+    );
+
+    _checkLeastUpperBound(A_num_String_num, A_int_num_int, objectNone);
+  }
+
+  void test_typeParameters_multi_objectType() {
+    // class A<out T, inout U, in V>
+    var T = typeParameter('T', variance: Variance.covariant);
+    var U = typeParameter('T', variance: Variance.invariant);
+    var V = typeParameter('T', variance: Variance.contravariant);
+    var A = class_(name: 'A', typeParameters: [T, U, V]);
+
+    // A<String, num, num>
+    // A<int, num, int>
+    var A_String_num_num = interfaceTypeNone(
+      A,
+      typeArguments: [stringNone, numNone, numNone],
+    );
+    var A_int_num_int = interfaceTypeNone(
+      A,
+      typeArguments: [intNone, numNone, intNone],
+    );
+
+    // We expect A<Object, num, int>
+    var A_Object_num_int = interfaceTypeNone(
+      A,
+      typeArguments: [objectNone, numNone, intNone],
+    );
+
+    _checkLeastUpperBound(A_String_num_num, A_int_num_int, A_Object_num_int);
+  }
+
+  /// Check least upper bound of the same class with different type parameters.
+  void test_typeParameters_noVariance_different() {
+    _checkLeastUpperBound(
+      listNone(intNone),
+      listNone(doubleNone),
+      listNone(numNone),
+    );
+  }
+
+  void test_typeParameters_noVariance_same() {
+    var listOfInt = listNone(intNone);
+    _checkLeastUpperBound(listOfInt, listOfInt, listOfInt);
   }
 }
 
 @reflectiveTest
 class _BoundsTestBase extends AbstractTypeSystemNullSafetyTest {
+  void _assertBottom(DartType type) {
+    if (!typeSystem.isBottom(type)) {
+      fail('isBottom must be true: ' + _typeString(type));
+    }
+  }
+
   void _assertNotBottom(DartType type) {
     if (typeSystem.isBottom(type)) {
       fail('isBottom must be false: ' + _typeString(type));
@@ -2245,6 +3196,12 @@
     }
   }
 
+  void _assertNull(DartType type) {
+    if (!typeSystem.isNull(type)) {
+      fail('isNull must be true: ' + _typeString(type));
+    }
+  }
+
   void _assertNullability(DartType type, NullabilitySuffix expected) {
     if (type.nullabilitySuffix != expected) {
       fail('Expected $expected in ' + _typeString(type));
@@ -2263,6 +3220,43 @@
     _assertNullability(type, NullabilitySuffix.star);
   }
 
+  void _assertObject(DartType type) {
+    if (!typeSystem.isObject(type)) {
+      fail('isObject must be true: ' + _typeString(type));
+    }
+  }
+
+  void _assertTop(DartType type) {
+    if (!typeSystem.isTop(type)) {
+      fail('isTop must be true: ' + _typeString(type));
+    }
+  }
+
+  void _checkLeastUpperBound(DartType T1, DartType T2, DartType expected) {
+    NullSafetyUnderstandingFlag.enableNullSafetyTypes(() async {
+      var expectedStr = _typeString(expected);
+
+      var result = typeSystem.getLeastUpperBound(T1, T2);
+      var resultStr = _typeString(result);
+      expect(result, expected, reason: '''
+expected: $expectedStr
+actual: $resultStr
+''');
+
+      // Check that the result is an upper bound.
+      expect(typeSystem.isSubtypeOf2(T1, result), true);
+      expect(typeSystem.isSubtypeOf2(T2, result), true);
+
+      // Check for symmetry.
+      result = typeSystem.getLeastUpperBound(T2, T1);
+      resultStr = _typeString(result);
+      expect(result, expected, reason: '''
+expected: $expectedStr
+actual: $resultStr
+''');
+    });
+  }
+
   String _typeParametersStr(TypeImpl type) {
     var typeStr = '';
 
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 0053393..eb8b108 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -152,7 +152,7 @@
 num a = 0;
 int b = a;
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
     ]);
   }
 
@@ -167,7 +167,7 @@
 num a = 0;
 int b = a;
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
     ]);
   }
 
@@ -184,7 +184,7 @@
 num a = 0;
 int b = a;
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
     ]);
   }
 
@@ -383,7 +383,7 @@
 num a = 0;
 int b = a;
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
     ]);
 
     // Implicit casts are enabled in 'bbb'.
@@ -398,7 +398,7 @@
 num a = 0;
 int b = a;
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 531f4b1..4b8a397 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -153,10 +153,10 @@
   i %= 1.2;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 3),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 33, 3),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 45, 3),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 57, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 33, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 45, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 57, 3),
     ]);
     assertType(findNode.assignment('+='), 'double');
     assertType(findNode.assignment('-='), 'double');
@@ -187,7 +187,7 @@
   a ??= b;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 32, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 32, 1),
     ]);
     assertType(findNode.assignment('??='), 'num');
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
index d8216d2..9bb1581 100644
--- a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
@@ -138,7 +138,7 @@
   prefix.A.named<int>(0);
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           50, 5),
     ]);
 
@@ -220,7 +220,7 @@
   A.named<int, String>(0);
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           52, 13),
     ]);
 
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index 891e684..3b4f1a2 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -681,7 +681,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_GETTER, 58, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_GETTER, 58, 1),
     ]);
   }
 
@@ -694,7 +694,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, 56, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 56, 1),
     ]);
   }
 
@@ -707,7 +707,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 1),
     ]);
   }
 
@@ -720,8 +720,8 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
     ]);
   }
 
@@ -734,7 +734,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 11),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 11),
     ]);
   }
 
@@ -747,7 +747,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 71, 7),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 71, 7),
     ]);
   }
 
@@ -760,7 +760,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_SETTER, 49, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_SETTER, 49, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index 191d6c2..b4414b36 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -149,7 +149,7 @@
   c.a;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 1),
     ]);
   }
 
@@ -167,7 +167,7 @@
   c.a;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
index 1ae8a7d..35e383a 100644
--- a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
@@ -122,7 +122,7 @@
 ''', [
       error(ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE, 13, 1),
       error(ParserErrorCode.EXPECTED_TYPE_NAME, 15, 1),
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 33, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 33, 1),
     ]);
   }
 
@@ -137,7 +137,7 @@
   p.F.a;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 1),
     ]);
   }
 
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 5091559..85e42d9 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -19,7 +19,7 @@
     await assertErrorsInCode(r'''
 final foo = Map<int>();
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 12, 8),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 12, 8),
     ]);
 
     var creation = findNode.instanceCreation('Map<int>');
@@ -42,7 +42,7 @@
   new Foo.bar<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           53, 5),
     ]);
 
@@ -70,7 +70,7 @@
   new p.Foo.bar<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           44, 3),
     ]);
 
@@ -97,7 +97,7 @@
   Foo.bar<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           49, 5),
     ]);
 
@@ -129,7 +129,7 @@
   p.Foo.bar<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           43, 5),
     ]);
 
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 35c029e..513338a 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -78,7 +78,7 @@
   a.foo(0);
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 57, 3),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 57, 3),
     ]);
     assertMethodInvocation2(
       findNode.methodInvocation('a.foo(0)'),
@@ -99,7 +99,7 @@
   c();
 }
 ''', [
-      error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 51, 1),
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 51, 1),
     ]);
 
     var invocation = findNode.functionExpressionInvocation('c();');
@@ -119,7 +119,7 @@
   foo();
 }
 ''', [
-      error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 25, 3),
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 25, 3),
     ]);
 
     var invocation = findNode.functionExpressionInvocation('foo();');
@@ -265,7 +265,7 @@
   C.foo();
 }
 ''', [
-      error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 42, 5),
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 42, 5),
     ]);
 
     var invocation = findNode.functionExpressionInvocation('foo();');
@@ -289,7 +289,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 46, 3),
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 46, 3),
     ]);
 
     var invocation = findNode.functionExpressionInvocation('foo();');
@@ -314,7 +314,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 68, 9),
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 68, 9),
     ]);
 
     var invocation = findNode.functionExpressionInvocation('foo();');
@@ -401,7 +401,7 @@
   foo(0);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 11, 3),
+      error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 11, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0)');
   }
@@ -414,7 +414,7 @@
   math.foo(0);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 45, 3),
+      error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 45, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
   }
@@ -437,7 +437,7 @@
   C.foo(0);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 24, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 24, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
   }
@@ -451,7 +451,7 @@
   C.foo(x);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 32, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 32, 3),
     ]);
 
     _assertUnresolvedMethodInvocation('foo(x);');
@@ -470,7 +470,7 @@
   C.foo(0);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 76, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 76, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
   }
@@ -483,7 +483,7 @@
   C.foo<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
     ]);
 
     _assertUnresolvedMethodInvocation(
@@ -499,7 +499,7 @@
   static main() => C.T();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 34, 1),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 34, 1),
     ]);
     _assertUnresolvedMethodInvocation('C.T();');
   }
@@ -510,7 +510,7 @@
   42.foo(0);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 14, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 14, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
   }
@@ -522,7 +522,7 @@
   v.foo(0);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 30, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 30, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
   }
@@ -535,7 +535,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
   }
@@ -546,7 +546,7 @@
   null.foo();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 16, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 16, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo();');
   }
@@ -557,7 +557,7 @@
   o.call();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 21, 4),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 21, 4),
     ]);
   }
 
@@ -576,7 +576,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 53, 4),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 53, 4),
     ]);
     _assertUnresolvedMethodInvocation('_foo(0);');
   }
@@ -591,7 +591,7 @@
   C..foo();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 50, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 50, 3),
     ]);
   }
 
@@ -604,7 +604,7 @@
   A?.toString();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 8),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 8),
     ]);
   }
 
@@ -618,7 +618,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, 62, 3),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 62, 3),
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
     assertSuperExpression(findNode.super_('super.foo'));
@@ -637,7 +637,7 @@
 }
 ''', [
       error(
-          StaticTypeWarningCode
+          CompileTimeErrorCode
               .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
           71,
           3),
@@ -830,7 +830,7 @@
   foo<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 29, 5),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 29, 5),
     ]);
     assertMethodInvocation(
       findNode.methodInvocation('foo<int>()'),
@@ -848,7 +848,7 @@
   foo<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 58, 5),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 58, 5),
     ]);
     assertMethodInvocation(
       findNode.methodInvocation('foo<int>()'),
@@ -1655,7 +1655,7 @@
 }
 ''', [
       error(
-          StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 32, 13),
+          CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 32, 13),
     ]);
     var invocation = findNode.methodInvocation('foo<int, double>();');
     assertTypeArgumentTypes(invocation, ['dynamic']);
@@ -1914,7 +1914,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 27, 1),
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 29, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 29, 3),
     ]);
 
     assertMethodInvocation2(
@@ -1939,7 +1939,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 65, 1),
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 67, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 67, 3),
     ]);
 
     assertMethodInvocation2(
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index 3732016..5fcc5b5 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -958,7 +958,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, 52, 3),
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 52, 3),
     ]);
 
     var invocation = findNode.methodInvocation('foo(42)');
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
index 14dd4c2..d32b3cb 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
@@ -64,7 +64,7 @@
   !x;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, 14, 1),
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 14, 1),
     ]);
 
     assertPrefixExpression(
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index 4288df4..9222211 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -102,7 +102,7 @@
   return a;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 50, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 50, 1),
     ]);
 
     var identifier = findNode.simple('a;');
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 1c626bd..b57b14e 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -51,7 +51,7 @@
   return B().a; // ref
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 85, 5),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 85, 5),
     ]);
 
     var identifier = findNode.simple('a; // ref');
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index df4940b..f67b736 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -322,7 +322,9 @@
     assertType(ref, type);
   }
 
-  void assertImportPrefix(SimpleIdentifier identifier, PrefixElement element) {
+  /// In valid code [element] must be a [PrefixElement], but for invalid code
+  /// like `int.double v;` we want to resolve `int` somehow. Still not type.
+  void assertImportPrefix(SimpleIdentifier identifier, Element element) {
     assertElement(identifier, element);
     assertTypeNull(identifier);
   }
@@ -655,7 +657,7 @@
 
   void assertTypeName(
       TypeName node, Element expectedElement, String expectedType,
-      {PrefixElement expectedPrefix}) {
+      {Element expectedPrefix}) {
     assertType(node, expectedType);
 
     if (expectedPrefix == null) {
diff --git a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
index c62baeb..732f7b1 100644
--- a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
@@ -151,7 +151,7 @@
   return a;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 68, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 68, 1),
     ]);
 
     var identifier = findNode.simple('a;');
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
index 031d921..84ca28f 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
@@ -20,7 +20,7 @@
   test_contextFunctionType_returnType_async_blockBody_futureOrVoid() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 72, 1),
+        error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 72, 1),
       ],
       legacy: [],
     );
@@ -43,7 +43,7 @@
   test_contextFunctionType_returnType_async_blockBody_futureVoid() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 48, 1),
+        error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 48, 1),
       ],
       legacy: [],
     );
@@ -164,7 +164,7 @@
 
   test_contextFunctionType_returnType_sync_blockBody_void() async {
     var expectedErrors = expectedErrorsByNullability(nullable: [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 34, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 34, 1),
     ], legacy: []);
     await assertErrorsInCode('''
 void Function() v = () {
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
index 32c358a..53970af 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
@@ -43,7 +43,7 @@
   test_context_noTypeArgs_noElements_typeParameter() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 39, 2),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 39, 2),
       ],
       legacy: [
         error(CompileTimeErrorCode.INVALID_CAST_LITERAL_LIST, 39, 2),
@@ -60,7 +60,7 @@
   test_context_noTypeArgs_noElements_typeParameter_dynamic() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 2),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 2),
       ],
       legacy: [
         error(CompileTimeErrorCode.INVALID_CAST_LITERAL_LIST, 43, 2),
@@ -78,7 +78,7 @@
     await assertErrorsInCode('''
 List<String> a = <int>[0];
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 17, 8),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 17, 8),
     ]);
     assertType(findNode.listLiteral('['), 'List<int>');
   }
@@ -113,7 +113,7 @@
     await assertErrorsInCode('''
 List<String> a = <int>[];
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 17, 7),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 17, 7),
     ]);
     assertType(findNode.listLiteral('['), 'List<int>');
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
index c387ddf..54c5c98 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
@@ -66,7 +66,7 @@
   test_context_noTypeArgs_noEntries_typeParameters() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 46, 2),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 46, 2),
       ],
       legacy: [
         error(CompileTimeErrorCode.INVALID_CAST_LITERAL_MAP, 46, 2),
@@ -83,7 +83,7 @@
   test_context_noTypeArgs_noEntries_typeParameters_dynamic() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 51, 2),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 51, 2),
       ],
       legacy: [
         error(CompileTimeErrorCode.INVALID_CAST_LITERAL_MAP, 51, 2),
@@ -126,7 +126,7 @@
     await assertErrorsInCode('''
 Map<String, String> a = <int, int>{};
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 24, 12),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 24, 12),
     ]);
     assertType(setOrMapLiteral('{'), 'Map<int, int>');
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
index 9a25ca0..267717e 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
@@ -57,7 +57,7 @@
   test_context_noTypeArgs_noElements_typeParameter() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 38, 2),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 38, 2),
       ],
       legacy: [
         error(CompileTimeErrorCode.INVALID_CAST_LITERAL_SET, 38, 2),
@@ -74,7 +74,7 @@
   test_context_noTypeArgs_noElements_typeParameter_dynamic() async {
     var expectedErrors = expectedErrorsByNullability(
       nullable: [
-        error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 42, 2),
+        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 42, 2),
       ],
       legacy: [
         error(CompileTimeErrorCode.INVALID_CAST_LITERAL_SET, 42, 2),
@@ -116,7 +116,7 @@
     await assertErrorsInCode('''
 Set<String> a = <int>{};
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 16, 7),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 16, 7),
     ]);
     assertType(setLiteral('{'), 'Set<int>');
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
index ccce771..7300c58 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
@@ -241,6 +241,40 @@
     );
   }
 
+  test_invalid_prefixedIdentifier_instanceCreation() async {
+    await assertErrorsInCode(r'''
+void f() {
+  new int.double.other();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 17, 10),
+    ]);
+
+    assertTypeName(
+      findNode.typeName('int.double'),
+      null,
+      'dynamic',
+      expectedPrefix: intElement,
+    );
+  }
+
+  test_invalid_prefixedIdentifier_literal() async {
+    await assertErrorsInCode(r'''
+void f() {
+  0 as int.double;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_A_TYPE, 18, 10),
+    ]);
+
+    assertTypeName(
+      findNode.typeName('int.double'),
+      null,
+      'dynamic',
+      expectedPrefix: intElement,
+    );
+  }
+
   test_never() async {
     await assertNoErrorsInCode(r'''
 f(Never a) {}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index dc9635c6..a27736a 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -31,7 +31,7 @@
 ''', [
       error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 110, 1),
       error(
-          StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 110, 1),
+          CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 110, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 373f343..a0f5a93 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -113,10 +113,7 @@
 main() {
   const A(42);
 }''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          52,
-          2),
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 52, 2),
       error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 2),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
index 3361f23..ad89ea1 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
@@ -30,7 +30,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.ASSIGNMENT_TO_METHOD, 87, 5),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 95, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 95, 1),
     ]);
   }
 
@@ -61,7 +61,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.ASSIGNMENT_TO_METHOD, 86, 8),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 97, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 97, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
index 6331a80..ed901d3 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
@@ -14,10 +14,87 @@
   });
 }
 
-/// TODO(paulberry): move other tests from [CheckedModeCompileTimeErrorCodeTest]
-/// to this class.
 @reflectiveTest
 class ConstConstructorParamTypeMismatchTest extends DriverResolutionTest {
+  test_assignable_null() async {
+    // Null is assignable to anything (before null safety).
+    await assertNoErrorsInCode(r'''
+class A {
+  final int x;
+  const A(this.x);
+}
+var v = const A(null);
+''');
+  }
+
+  test_assignable_omittedType() async {
+    // If a field is declared without a type, and no initializer, it's type is
+    // dynamic.
+    await assertNoErrorsInCode(r'''
+class A {
+  final x;
+  const A(this.x);
+}
+var v = const A(5);
+''');
+  }
+
+  test_assignable_subtype() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+class C {
+  final A a;
+  const C(this.a);
+}
+var v = const C(const B());
+''');
+  }
+
+  test_assignable_typedef() async {
+    // foo has the type dynamic -> dynamic, so it is not assignable to A.f.
+    await assertErrorsInCode(r'''
+typedef String Int2String(int x);
+class A {
+  final Int2String f;
+  const A(this.f);
+}
+foo(x) => 1;
+var v = const A(foo);
+''', [
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 116, 3),
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 116, 3),
+    ]);
+  }
+
+  test_assignable_typeSubstitution() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  final T x;
+  const A(this.x);
+}
+var v = const A<int>(3);
+''');
+  }
+
+  test_assignable_unresolved_null() async {
+    // Null always passes runtime type checks, even when the type is
+    // unresolved.
+    await assertErrorsInCode(r'''
+class A {
+  final Unresolved x;
+  const A(String this.x);
+}
+var v = const A(null);
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
+    ]);
+  }
+
   test_int_to_double_reference_from_other_library_other_file_after() async {
     newFile('/test/lib/other.dart', content: '''
 import 'test.dart';
@@ -77,15 +154,10 @@
   const C([this.x = 0]);
 }
 ''');
-    await assertErrorsInCode('''
+    await assertNoErrorsInCode('''
 import 'other.dart';
-
-void main() {
-  const c = C();
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 44, 1),
-    ]);
+const c = C();
+''');
     var otherFileResult =
         await resolveFile(convertPath('/test/lib/other.dart'));
     expect(otherFileResult.errors, isEmpty);
@@ -102,14 +174,83 @@
         await resolveFile(convertPath('/test/lib/other.dart'));
     expect(otherFileResult.errors, isEmpty);
 
-    await assertErrorsInCode('''
+    await assertNoErrorsInCode('''
 import 'other.dart';
+const c = C();
+''');
+  }
 
-void main() {
-  const c = C();
+  test_notAssignable_optional() async {
+    await assertErrorsInCode(r'''
+class A {
+  final int x;
+  const A([this.x = 'foo']);
 }
+var v = const A();
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 44, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 45, 5),
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 64, 9),
+    ]);
+  }
+
+  test_notAssignable_supertype() async {
+    await assertErrorsInCode(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+class C {
+  final B b;
+  const C(this.b);
+}
+const A u = const A();
+var v = const C(u);
+''', [
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 143, 1),
+    ]);
+  }
+
+  test_notAssignable_typedef() async {
+    // foo has type String -> int, so it is not assignable to A.f
+    // (A.f requires it to be int -> String).
+    await assertErrorsInCode(r'''
+typedef String Int2String(int x);
+class A {
+  final Int2String f;
+  const A(this.f);
+}
+int foo(String x) => 1;
+var v = const A(foo);
+''', [
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 127, 3),
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 127, 3),
+    ]);
+  }
+
+  test_notAssignable_unrelated() async {
+    await assertErrorsInCode(r'''
+class A {
+  final int x;
+  const A(this.x);
+}
+var v = const A('foo');
+''', [
+      error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 62, 5),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 62, 5),
+    ]);
+  }
+
+  test_notAssignable_unresolved() async {
+    await assertErrorsInCode(r'''
+class A {
+  final Unresolved x;
+  const A(String this.x);
+}
+var v = const A('foo');
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index bb4c910..37c2845 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_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/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -20,8 +21,6 @@
   });
 }
 
-/// TODO(paulberry): move other tests from [CompileTimeErrorCodeTestBase] to
-/// this class.
 @reflectiveTest
 class ConstEvalThrowsExceptionTest extends DriverResolutionTest {
   test_CastError_intToDouble_constructor_importAnalyzedAfter() async {
@@ -168,6 +167,30 @@
 ''');
   }
 
+  test_fromEnvironment_bool_badArgs() async {
+    await assertErrorsInCode(r'''
+var b1 = const bool.fromEnvironment(1);
+var b2 = const bool.fromEnvironment('x', defaultValue: 1);
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 29),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 36, 1),
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 49, 48),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 81, 15),
+    ]);
+  }
+
+  test_fromEnvironment_bool_badDefault_whenDefined() async {
+    // The type of the defaultValue needs to be correct even when the default
+    // value isn't used (because the variable is defined in the environment).
+    driver.declaredVariables = DeclaredVariables.fromMap({'x': 'true'});
+    await assertErrorsInCode('''
+var b = const bool.fromEnvironment('x', defaultValue: 1);
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 8, 48),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 40, 15),
+    ]);
+  }
+
   test_ifElement_false_thenNotEvaluated() async {
     await assertErrorsInCode(
         '''
@@ -257,6 +280,23 @@
     ]);
   }
 
+  test_symbolConstructor_badStringArgument() async {
+    await assertErrorsInCode(r'''
+var s1 = const Symbol('3');
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 17),
+    ]);
+  }
+
+  test_symbolConstructor_nonStringArgument() async {
+    await assertErrorsInCode(r'''
+var s2 = const Symbol(3);
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 15),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 22, 1),
+    ]);
+  }
+
   test_unaryBitNot_null() async {
     await assertErrorsInCode('''
 const dynamic D = null;
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart
new file mode 100644
index 0000000..a07e903
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart
@@ -0,0 +1,25 @@
+// 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstEvalThrowsIdbzeTest);
+  });
+}
+
+@reflectiveTest
+class ConstEvalThrowsIdbzeTest extends DriverResolutionTest {
+  test_divisionByZero() async {
+    await assertErrorsInCode('''
+const C = 1 ~/ 0;
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE, 10, 6),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart
new file mode 100644
index 0000000..9799548
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart
@@ -0,0 +1,35 @@
+// 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstEvalTypeBoolIntTest);
+  });
+}
+
+@reflectiveTest
+class ConstEvalTypeBoolIntTest extends DriverResolutionTest {
+  test_binary() async {
+    await _check_constEvalTypeBoolOrInt_binary("a ^ ''");
+    await _check_constEvalTypeBoolOrInt_binary("a & ''");
+    await _check_constEvalTypeBoolOrInt_binary("a | ''");
+    await _check_constEvalTypeBoolOrInt_binary("a >> ''");
+    await _check_constEvalTypeBoolOrInt_binary("a << ''");
+  }
+
+  Future<void> _check_constEvalTypeBoolOrInt_binary(String expr) async {
+    await assertErrorsInCode('''
+const int a = 0;
+const b = $expr;
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT, 27, 6),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
index 711122d..cc8982d 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
@@ -20,7 +20,7 @@
 const c = true && '';
 ''', [
       error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 10, 10),
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 18, 2),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 18, 2),
     ]);
   }
 
@@ -29,7 +29,7 @@
 const c = (true || 0);
 ''', [
       error(HintCode.DEAD_CODE, 19, 1),
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 19, 1),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 19, 1),
     ]);
   }
 
@@ -38,7 +38,20 @@
 const c = false || '';
 ''', [
       error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 10, 11),
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 19, 2),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 19, 2),
+    ]);
+  }
+
+  test_lengthOfErroneousConstant() async {
+    // Attempting to compute the length of constant that couldn't be evaluated
+    // (due to an error) should not crash the analyzer (see dartbug.com/23383)
+    await assertErrorsInCode('''
+const int i = (1 ? 'alpha' : 'beta').length;
+''', [
+      error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 14,
+          29),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 1),
+      error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 15, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart
new file mode 100644
index 0000000..8d3aeae
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstEvalTypeNumTest);
+  });
+}
+
+@reflectiveTest
+class ConstEvalTypeNumTest extends DriverResolutionTest {
+  test_binary() async {
+    await _check_constEvalTypeNum_binary("a + ''");
+    await _check_constEvalTypeNum_binary("a - ''");
+    await _check_constEvalTypeNum_binary("a * ''");
+    await _check_constEvalTypeNum_binary("a / ''");
+    await _check_constEvalTypeNum_binary("a ~/ ''");
+    await _check_constEvalTypeNum_binary("a > ''");
+    await _check_constEvalTypeNum_binary("a < ''");
+    await _check_constEvalTypeNum_binary("a >= ''");
+    await _check_constEvalTypeNum_binary("a <= ''");
+    await _check_constEvalTypeNum_binary("a % ''");
+  }
+
+  Future<void> _check_constEvalTypeNum_binary(String expr) async {
+    await assertErrorsInCode('''
+const num a = 0;
+const b = $expr;
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_TYPE_NUM, 27, 6),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart
new file mode 100644
index 0000000..9fc2328
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstWithNonConstantArgumentTest);
+  });
+}
+
+@reflectiveTest
+class ConstWithNonConstantArgumentTest extends DriverResolutionTest {
+  test_annotation() async {
+    await assertErrorsInCode(r'''
+class A {
+  const A(int p);
+}
+var v = 42;
+@A(v)
+main() {
+}
+''', [
+      error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 45, 1),
+    ]);
+  }
+
+  test_classShadowedBySetter() async {
+    await assertErrorsInCode(r'''
+class Annotation {
+  const Annotation(Object obj);
+}
+
+class Bar {}
+
+class Foo {
+  @Annotation(Bar)
+  set Bar(int value) {}
+}
+''', [
+      error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 94, 3),
+      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 94, 3),
+    ]);
+  }
+
+  test_instanceCreation() async {
+    await assertErrorsInCode(r'''
+class A {
+  const A(a);
+}
+f(p) { return const A(p); }
+''', [
+      error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 48, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
new file mode 100644
index 0000000..73430bb
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
@@ -0,0 +1,46 @@
+// 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CouldNotInferTest);
+  });
+}
+
+@reflectiveTest
+class CouldNotInferTest extends DriverResolutionTest {
+  test_function() async {
+    await assertErrorsInCode(r'''
+T f<T>(T t) => null;
+main() { f(<S>(S s) => s); }
+''', [
+      error(CompileTimeErrorCode.COULD_NOT_INFER, 30, 1),
+    ]);
+  }
+
+  test_functionType() async {
+    await assertErrorsInCode(r'''
+T Function<T>(T) f;
+main() { f(<S>(S s) => s); }
+''', [
+      error(CompileTimeErrorCode.COULD_NOT_INFER, 29, 1),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode(r'''
+class C {
+  T f<T>(T t) => null;
+}
+main() { new C().f(<S>(S s) => s); }
+''', [
+      error(CompileTimeErrorCode.COULD_NOT_INFER, 52, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
index c5b3597..c478806 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
@@ -28,7 +28,7 @@
 main() {
   <int, int>[];
 }''', [
-      error(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, 11, 10),
+      error(CompileTimeErrorCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, 11, 10),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
index 890ca88..2192c2b 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
@@ -20,7 +20,7 @@
 main() {
   <int, int, int>{2, 3};
 }''', [
-      error(StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS, 11, 15),
+      error(CompileTimeErrorCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS, 11, 15),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
index a8b297f..5c1a840 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
@@ -22,7 +22,7 @@
 main() {
   <int, int, int>{};
 }''', [
-      error(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
+      error(CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
     ]);
   }
 
@@ -31,7 +31,7 @@
 main() {
   <int, int, int>{1: 2};
 }''', [
-      error(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
+      error(CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
index eb1ddf7..8824a62 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
@@ -24,7 +24,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 75, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
     ]);
   }
 
@@ -38,7 +38,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 64, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
     ]);
   }
 
@@ -51,7 +51,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
     ]);
   }
 
@@ -62,7 +62,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
     ]);
   }
 
@@ -74,7 +74,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index a07d16bc..00e6a70 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -35,7 +35,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, 41, 1),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 41, 1),
     ]);
   }
 
@@ -57,7 +57,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, 29, 1),
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 29, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
index a5d8ce9..55ed10e 100644
--- a/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
@@ -19,7 +19,7 @@
     await assertErrorsInCode('''
 int f() async {}
 ''', [
-      error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
+      error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
     ]);
   }
 
@@ -35,7 +35,7 @@
   return 2;
 }
 ''', [
-      error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
+      error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
     ]);
   }
 
@@ -47,7 +47,7 @@
   return 0;
 }
 ''', [
-      error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 73, 14),
+      error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 73, 14),
     ]);
   }
 
@@ -57,7 +57,7 @@
   int m() async {}
 }
 ''', [
-      error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 12, 3),
+      error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 12, 3),
     ]);
   }
 
@@ -79,7 +79,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 85, 14),
+      error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 85, 14),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart b/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart
index 675931b..9e1911c 100644
--- a/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart
@@ -17,6 +17,29 @@
 
 @reflectiveTest
 class InconsistentCaseExpressionTypesTest extends DriverResolutionTest {
+  test_dynamic() async {
+    // Even though A.S and S have a static type of "dynamic", we should see
+    // that they match 'abc', because they are constant strings.
+    await assertNoErrorsInCode(r'''
+class A {
+  static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+  switch (p) {
+    case S:
+      break;
+    case A.S:
+      break;
+    case 'abc':
+      break;
+  }
+}
+''');
+  }
+
   test_int() async {
     await assertNoErrorsInCode(r'''
 void f(var e) {
diff --git a/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart b/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
index 9e8bee8..3e42a57 100644
--- a/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
@@ -30,8 +30,8 @@
 // @dart = 2.6
 part of 'a.dart';
 ''',
-      partErrors: [
-        error(_errorCode, 0, 14),
+      libraryErrors: [
+        error(_errorCode, 20, 8),
       ],
     );
   }
@@ -46,7 +46,7 @@
 // @dart = 2.5
 part of 'a.dart';
 ''',
-      partErrors: [],
+      libraryErrors: [],
     );
   }
 
@@ -58,7 +58,7 @@
       partContent: r'''
 part of 'a.dart';
 ''',
-      partErrors: [],
+      libraryErrors: [],
     );
   }
 
@@ -71,8 +71,8 @@
       partContent: r'''
 part of 'a.dart';
 ''',
-      partErrors: [
-        error(_errorCode, 0, 7),
+      libraryErrors: [
+        error(_errorCode, 20, 8),
       ],
     );
   }
@@ -86,8 +86,8 @@
 // @dart = 2.5
 part of 'a.dart';
 ''',
-      partErrors: [
-        error(_errorCode, 0, 14),
+      libraryErrors: [
+        error(_errorCode, 5, 8),
       ],
     );
   }
@@ -95,7 +95,7 @@
   Future<void> _checkLibraryAndPart({
     @required String libraryContent,
     @required String partContent,
-    @required List<ExpectedError> partErrors,
+    @required List<ExpectedError> libraryErrors,
   }) async {
     var libraryPath = convertPath('/test/lib/a.dart');
     var partPath = convertPath('/test/lib/b.dart');
@@ -104,8 +104,6 @@
 
     newFile(partPath, content: partContent);
 
-    await resolveFile(libraryPath);
-
-    await assertErrorsInFile2(partPath, partErrors);
+    await assertErrorsInFile2(libraryPath, libraryErrors);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart
index da96679..5064a6c 100644
--- a/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart
@@ -59,6 +59,12 @@
     ]);
   }
 
+  test_namedParameter_withVar_unreferenced() async {
+    await assertNoErrorsInCode(r'''
+void fn({var a}) {}
+''');
+  }
+
   test_parameter() async {
     await assertErrorsInCode(r'''
 void fn(a) => print(a);
@@ -70,13 +76,55 @@
   test_parameter_inConstructor() async {
     await assertErrorsInCode(r'''
 class C {
-  C(var a) {}
+  C(var a) {
+    a;
+  }
 }
 ''', [
       error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 14, 5),
     ]);
   }
 
+  test_parameter_inConstructor_fieldFormal() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  int a;
+  C(this.a) {
+    a;
+  }
+}
+''');
+  }
+
+  test_parameter_inConstructor_fieldFormal_withVar() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  int a;
+  C(var this.a) {
+    a;
+  }
+}
+''');
+  }
+
+  test_parameter_inConstructor_referencedInInitializer() async {
+    await assertErrorsInCode(r'''
+class C {
+  C(var a) : assert(a != null);
+}
+''', [
+      error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 14, 5),
+    ]);
+  }
+
+  test_parameter_inConstructor_unreferenced() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  C(var a);
+}
+''');
+  }
+
   test_parameter_inConstructor_withType() async {
     await assertNoErrorsInCode(r'''
 class C {
@@ -88,7 +136,7 @@
   test_parameter_inFunctionLiteral() async {
     await assertErrorsInCode(r'''
 void fn() {
-  var f = (var a) {};
+  var f = (var a) => a;
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 1),
@@ -115,13 +163,9 @@
   }
 
   test_parameter_inFunctionLiteral_withType() async {
-    await assertErrorsInCode(r'''
-void fn() {
-  var f = (int a) {};
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 1),
-    ]);
+    await assertNoErrorsInCode(r'''
+var f = (int a) => false;
+''');
   }
 
   test_parameter_inGenericFunction_withType() async {
@@ -140,6 +184,16 @@
     ]);
   }
 
+  test_parameter_inMethod_abstract() async {
+    await assertErrorsInCode(r'''
+abstract class C {
+  void fn(var a);
+}
+''', [
+      error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 29, 5),
+    ]);
+  }
+
   test_parameter_inMethod_withType() async {
     await assertNoErrorsInCode(r'''
 class C {
@@ -204,6 +258,14 @@
 ''');
   }
 
+  test_parameter_inTypedef_withoutType() async {
+    await assertErrorsInCode(r'''
+typedef void cb(a);
+''', [
+      error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 16, 1),
+    ]);
+  }
+
   test_parameter_inTypedef_withType() async {
     await assertNoErrorsInCode(r'''
 typedef cb = void Function(int a);
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index a409b21..6eb6bef 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -28,7 +28,7 @@
   g(c).a;
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 93, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 93, 1),
     ]);
     assertElement(
       findNode.simple('a;'),
@@ -48,7 +48,7 @@
   c.a();
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
     ]);
     assertElement(
       findNode.methodInvocation('a();'),
@@ -68,7 +68,7 @@
   c.a = 2;
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
     ]);
     assertElement(
       findNode.simple('a = 2;'),
@@ -85,7 +85,7 @@
   a.m;
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
     ]);
   }
 
@@ -98,7 +98,7 @@
   a.f;
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
     ]);
   }
 
@@ -111,7 +111,7 @@
   a.f;
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 50, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 50, 1),
     ]);
   }
 
@@ -124,7 +124,7 @@
   a.f = 42;
 }
 ''', [
-      error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 49, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 49, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index 348b422..d553a80 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -26,7 +26,7 @@
   d ??= i;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 37, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 37, 1),
     ]);
   }
 
@@ -59,7 +59,7 @@
 }
 ''', [
       error(HintCode.DEAD_CODE, 24, 5),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 24, 4),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 24, 4),
     ]);
   }
 
@@ -72,7 +72,7 @@
 }
 ''', [
       error(HintCode.DEAD_CODE, 37, 5),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 37, 4),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 37, 4),
     ]);
   }
 
@@ -88,7 +88,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 58, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 58, 1),
     ]);
   }
 }
@@ -106,6 +106,17 @@
     ]);
   }
 
+  test_cascadeExpression() async {
+    await assertErrorsInCode(r'''
+void f(int a) {
+  // ignore:unused_local_variable
+  String v = (a)..isEven;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 64, 1),
+    ]);
+  }
+
   test_compoundAssignment() async {
     await assertErrorsInCode(r'''
 class byte {
@@ -129,7 +140,7 @@
 f({String x: 0}) {
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 13, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 13, 1),
     ]);
   }
 
@@ -143,7 +154,7 @@
     await assertErrorsInCode(r'''
 f([String x = 0]) {
 }''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 14, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 14, 1),
     ]);
   }
 
@@ -160,7 +171,7 @@
   dynamic = 1;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 1),
     ]);
   }
 
@@ -170,7 +181,7 @@
   String x = (() => 5)();
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 23, 11),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 23, 11),
     ]);
   }
 
@@ -181,7 +192,7 @@
   d ??= i;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 36, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 36, 1),
     ]);
   }
 
@@ -292,7 +303,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 80, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 80, 1),
     ]);
   }
 
@@ -316,7 +327,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 3),
     ]);
   }
 
@@ -329,7 +340,18 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 44, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 44, 1),
+    ]);
+  }
+
+  test_parenthesizedExpression() async {
+    await assertErrorsInCode(r'''
+void f(int a) {
+  // ignore:unused_local_variable
+  String v = (a);
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 64, 1),
     ]);
   }
 
@@ -345,7 +367,7 @@
   a++;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 65, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 65, 3),
     ]);
   }
 
@@ -377,7 +399,7 @@
   c.a++;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 91, 5),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 91, 5),
     ]);
   }
 
@@ -409,7 +431,7 @@
   ++a;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 65, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 65, 3),
     ]);
   }
 
@@ -441,7 +463,7 @@
   ++c.a;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 91, 5),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 91, 5),
     ]);
   }
 
@@ -491,7 +513,7 @@
   T t = int;
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 3),
     ]);
   }
 
@@ -504,7 +526,7 @@
   A.x = '0';
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 46, 3),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 46, 3),
     ]);
   }
 
@@ -519,7 +541,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 74, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 74, 1),
     ]);
   }
 
@@ -527,7 +549,7 @@
     await assertErrorsInCode('''
 int x = 'string';
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 8),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 8, 8),
     ]);
   }
 
@@ -541,7 +563,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 57, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 57, 1),
     ]);
   }
 
@@ -559,7 +581,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 131, 1),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 131, 1),
     ]);
   }
 
@@ -569,7 +591,7 @@
   int x = 'string';
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 20, 8),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 20, 8),
     ]);
   }
 
@@ -590,7 +612,7 @@
   print(n);
 }
 ''', [
-      error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 218, 7),
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 218, 7),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart b/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
index 0554340..9435340 100644
--- a/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
@@ -21,7 +21,7 @@
   3(5);
 }
 ''', [
-      error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 8, 1),
+      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 8, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/no_generative_constructors_in_superclass_test.dart b/pkg/analyzer/test/src/diagnostics/no_generative_constructors_in_superclass_test.dart
new file mode 100644
index 0000000..0ace42c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/no_generative_constructors_in_superclass_test.dart
@@ -0,0 +1,96 @@
+// 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NoGenerativeConstructorsInSuperclassTest);
+  });
+}
+
+@reflectiveTest
+class NoGenerativeConstructorsInSuperclassTest extends DriverResolutionTest {
+  test_explicit() async {
+    await assertErrorsInCode(r'''
+class A {
+  factory A() => throw '';
+}
+class B extends A {
+  B() : super();
+}
+''', [
+      error(
+          CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+    ]);
+  }
+
+  test_explicit_oneFactory() async {
+    await assertErrorsInCode(r'''
+class A {
+  factory A() => throw '';
+}
+class B extends A {
+  B() : super();
+  factory B.second() => throw '';
+}
+''', [
+      error(
+          CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+    ]);
+  }
+
+  test_hasFactories() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  factory A() => throw '';
+}
+class B extends A {
+  factory B() => throw '';
+  factory B.second() => throw '';
+}
+''');
+  }
+
+  test_hasFactory() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  factory A() => throw '';
+}
+class B extends A {
+  factory B() => throw '';
+}
+''');
+  }
+
+  test_implicit() async {
+    await assertErrorsInCode(r'''
+class A {
+  factory A() => throw '';
+}
+class B extends A {
+  B();
+}
+''', [
+      error(
+          CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+    ]);
+  }
+
+  test_implicit2() async {
+    await assertErrorsInCode(r'''
+class A {
+  factory A() => throw '';
+}
+class B extends A {
+}
+''', [
+      error(
+          CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
index 02438ae..da24c7b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
@@ -21,7 +21,7 @@
     await assertErrorsInCode('''
 f() { return 3 ? 2 : 1; }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 13, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 1),
     ]);
   }
 
@@ -31,7 +31,7 @@
   do {} while (3);
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 21, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 21, 1),
     ]);
   }
 
@@ -42,7 +42,31 @@
   for (;3;) {}
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 14, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 14, 1),
+    ]);
+  }
+
+  test_for_declaration() async {
+    // https://github.com/dart-lang/sdk/issues/24713
+    await assertErrorsInCode(r'''
+f() {
+  for (int i = 0; 3;) {}
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 24, 1),
+    ]);
+  }
+
+  test_for_expression() async {
+    // https://github.com/dart-lang/sdk/issues/24713
+    await assertErrorsInCode(r'''
+f() {
+  int i;
+  for (i = 0; 3;) {}
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 29, 1),
     ]);
   }
 
@@ -50,7 +74,7 @@
     await assertErrorsInCode('''
 var v = [for (; 0;) 1];
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 16, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 16, 1),
     ]);
   }
 
@@ -60,7 +84,7 @@
   if (3) return 2; else return 1;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 12, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 12, 1),
     ]);
   }
 
@@ -68,7 +92,7 @@
     await assertErrorsInCode('''
 var v = [if (3) 1];
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 13, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 1),
     ]);
   }
 
@@ -78,7 +102,7 @@
   while (3) {}
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 15, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 1),
     ]);
   }
 }
@@ -93,7 +117,7 @@
   if (x) {}
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 22, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 22, 1),
     ]);
   }
 
@@ -104,7 +128,7 @@
   x ? 0 : 1;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 18, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 18, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
index 258accb..61535c7 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
@@ -22,7 +22,7 @@
   assert(makeAssertion);
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_EXPRESSION, 45, 13),
+      error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 45, 13),
     ]);
   }
 
@@ -33,7 +33,7 @@
   assert(makeAssertion);
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_EXPRESSION, 41, 13),
+      error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 41, 13),
     ]);
   }
 
@@ -43,7 +43,7 @@
   assert(0);
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_EXPRESSION, 15, 1),
+      error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 15, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
index 7eb4c52..f0c4ff3 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
@@ -23,7 +23,7 @@
   !42;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, 9, 2),
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 9, 2),
     ]);
   }
 }
@@ -39,7 +39,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, 19, 1),
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 19, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
index 07c6c1d..f3496ef 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
@@ -23,7 +23,7 @@
   return left && right;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 40, 4),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 40, 4),
     ]);
   }
 
@@ -33,7 +33,7 @@
   return left && right;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 51, 5),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 51, 5),
     ]);
   }
 
@@ -43,7 +43,7 @@
   return left || right;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 46, 4),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 46, 4),
     ]);
   }
 
@@ -53,7 +53,7 @@
   return left || right;
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 51, 5),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 51, 5),
     ]);
   }
 }
@@ -68,7 +68,7 @@
   if(x && true) {}
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 21, 1),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 21, 1),
     ]);
   }
 
@@ -79,7 +79,7 @@
   if(x || false) {}
 }
 ''', [
-      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 21, 1),
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 21, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor_test.dart
similarity index 78%
rename from pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
rename to pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor_test.dart
index 408fc1a..35ecf41 100644
--- a/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor_test.dart
@@ -40,10 +40,7 @@
   @literal
   const A();
 }
-
-void main() {
-  const a = A();
-}
+const a = A();
 ''');
   }
 
@@ -54,10 +51,7 @@
   @literal
   const A();
 }
-
-void main() {
-  const a = const A();
-}
+const a = const A();
 ''');
   }
 
@@ -68,12 +62,9 @@
   @literal
   const A.named();
 }
-void main() {
-  var a = A.named();
-}
+var a = A.named();
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 95, 1),
-      error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 99, 9),
+      error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 83, 9),
     ]);
   }
 
@@ -84,12 +75,9 @@
   @literal
   const A();
 }
-void main() {
-  var a = A();
-}
+var a = A();
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 89, 1),
-      error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 93, 3),
+      error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 77, 3),
     ]);
   }
 
@@ -100,10 +88,7 @@
   @literal
   const A(List list);
 }
-
-void main() {
-  var a = A(new List());
-}
+var a = A(new List());
 ''');
   }
 
@@ -114,12 +99,9 @@
   @literal
   const A();
 }
-void main() {
-  var a = new A();
-}
+var a = new A();
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 89, 1),
-      error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW, 93, 7),
+      error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW, 77, 7),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart b/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart
new file mode 100644
index 0000000..216836c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart
@@ -0,0 +1,48 @@
+// 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:analyzer/src/error/codes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonConstMapAsExpressionStatementTest);
+  });
+}
+
+@reflectiveTest
+class NonConstMapAsExpressionStatementTest extends DriverResolutionTest {
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/42850')
+  test_beginningOfExpressiontatement() async {
+    // TODO(srawlins) Fasta is not recovering well.
+    // Ideally we would produce a single diagnostic:
+    // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
+    addTestFile(r'''
+f() {
+  {'a' : 0, 'b' : 1}.length;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors[0].errorCode,
+        CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT);
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/42850')
+  test_expressionStatementOnly() async {
+    // TODO(danrubel) Fasta is not recovering well.
+    // Ideally we would produce a single diagnostic:
+    // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
+    addTestFile(r'''
+f() {
+  {'a' : 0, 'b' : 1};
+}
+''');
+    await resolveTestFile();
+    expect(result.errors[0].errorCode,
+        CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
index 7898167..6e01fe5 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
@@ -61,6 +61,21 @@
 ''', [ExpectedError(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, 67, 1)]);
   }
 
+  test_constructor_inDifferentFile() async {
+    newFile('/test/lib/a.dart', content: '''
+import 'b.dart';
+const v = const MyClass();
+''');
+    await assertErrorsInCode('''
+class MyClass {
+  const MyClass([p = foo]);
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 37, 3),
+      error(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, 37, 3),
+    ]);
+  }
+
   test_constructor_named() async {
     await assertErrorsInCode(r'''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart
index fd89b22..4879b59 100644
--- a/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart
@@ -19,12 +19,13 @@
     await assertErrorsInCode(r'''
 class A {
   factory A.named() => throw 0;
+  A.generative();
 }
 class B extends A {
   B() : super.named();
 }
 ''', [
-      error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 72, 13),
+      error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 90, 13),
     ]);
   }
 
@@ -56,24 +57,13 @@
     await assertErrorsInCode(r'''
 class A {
   factory A() => throw 0;
+  A.named();
 }
 class B extends A {
   B();
 }
 ''', [
-      error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 60, 1),
-    ]);
-  }
-
-  test_implicit2() async {
-    await assertErrorsInCode(r'''
-class A {
-  factory A() => throw 0;
-}
-class B extends A {
-}
-''', [
-      error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 44, 1),
+      error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 73, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_generative_implicit_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/non_generative_implicit_constructor_test.dart
new file mode 100644
index 0000000..452a436
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_generative_implicit_constructor_test.dart
@@ -0,0 +1,30 @@
+// 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonGenerativeImplicitConstructorTest);
+  });
+}
+
+@reflectiveTest
+class NonGenerativeImplicitConstructorTest extends DriverResolutionTest {
+  test_implicit() async {
+    await assertErrorsInCode(r'''
+class A {
+  factory A() => throw 0;
+  A.named();
+}
+class B extends A {
+}
+''', [
+      error(CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR, 57, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart b/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart
index 576cbdb..0ec59d1 100644
--- a/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart
@@ -28,7 +28,7 @@
 ''', [
       // This changed from a method to a extension method, uses Dart semantics
       // instead of manual check now.
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 98, 10),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 98, 10),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart b/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart
index 82e57ab..cd93d58 100644
--- a/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart
@@ -21,7 +21,7 @@
 class B<E> {}
 f(B<A> b) {}
 ''', [
-      error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 25, 1),
+      error(CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT, 25, 1),
     ]);
   }
 
@@ -30,7 +30,7 @@
 class B<E> {}
 f(B<A> b) {}
 ''', [
-      error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 18, 1),
+      error(CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT, 18, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 67439cb..5e10b8c 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -191,7 +191,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
     ]);
 
     assertIndexExpression(
@@ -209,8 +209,8 @@
 }
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
     ]);
 
     assertIndexExpression(
@@ -230,7 +230,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
     ]);
 
     assertIndexExpression(
@@ -536,7 +536,7 @@
   (throw '') + (1 + 2);
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 27, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 27, 1),
     ]);
 
     assertBinaryExpression(
diff --git a/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart
index 25c414f..3b40aec 100644
--- a/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart
@@ -35,6 +35,20 @@
 ''');
   }
 
+  test_constRedirector_constRedirectee_generic() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  const A(T value) : this._(value);
+  const A._(T value) : value = value;
+  final T value;
+}
+
+void main(){
+  const A<int>(1);
+}
+''');
+  }
+
   test_constRedirector_constRedirectee_viaInitializer() async {
     await assertNoErrorsInCode(r'''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
index 74f3305..cc19734 100644
--- a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
@@ -24,7 +24,7 @@
   return () => "hello";
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 53, 7),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 53, 7),
     ]);
   }
 
@@ -35,7 +35,7 @@
 }
 ''', [
       error(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 33, 1),
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 33, 1),
     ]);
   }
 
@@ -46,7 +46,7 @@
 }
 ''', [
       error(
-          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 27, 1),
+          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 27, 1),
     ]);
   }
 
@@ -68,7 +68,7 @@
   return a;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 54, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 54, 1),
     ]);
   }
 
@@ -85,7 +85,7 @@
   return 5;
 }
 ''', [
-      error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
+      error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
     ]);
   }
 
@@ -111,7 +111,7 @@
   return 5;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
     ]);
   }
 
@@ -121,7 +121,7 @@
   return 5;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
     ]);
   }
 
@@ -139,7 +139,7 @@
   return a;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 39, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 39, 1),
     ]);
   }
 
@@ -189,13 +189,13 @@
   return 42;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 20, 2),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 20, 2),
     ]);
   }
 
   test_function_sync_block_num__to_int() async {
     var expectedErrors = expectedErrorsByNullability(nullable: [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 24, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 24, 1),
     ], legacy: []);
     await assertErrorsInCode(r'''
 int f(num a) {
@@ -210,7 +210,7 @@
   return '0';
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 19, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 19, 3),
     ]);
   }
 
@@ -246,13 +246,13 @@
   return a;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 25, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 25, 1),
     ]);
   }
 
   test_function_sync_block_void__to_Null() async {
     var expectedErrors = expectedErrorsByNullability(nullable: [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
     ], legacy: []);
     await assertErrorsInCode('''
 Null f(void a) {
@@ -279,7 +279,7 @@
     await assertErrorsInCode('''
 int f() => '0';
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 11, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 11, 3),
     ]);
   }
 
@@ -289,7 +289,7 @@
   return '0';
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 21, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 21, 3),
     ]);
   }
 
@@ -297,7 +297,7 @@
     await assertErrorsInCode('''
 int get g => '0';
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 13, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 13, 3),
     ]);
   }
 
@@ -310,7 +310,7 @@
   g();
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 3),
     ]);
   }
 
@@ -323,7 +323,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 38, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 38, 3),
     ]);
   }
 
@@ -354,7 +354,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 33, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 33, 3),
     ]);
   }
 
@@ -376,7 +376,7 @@
   int f() => '0';
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 23, 3),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 23, 3),
     ]);
   }
 }
@@ -390,7 +390,7 @@
   return 0;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 1),
     ]);
   }
 
@@ -400,7 +400,7 @@
   return a;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 40, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 40, 1),
     ]);
   }
 
@@ -412,7 +412,7 @@
   return a;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 67, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 67, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
index 4c2223d..f535a32 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
@@ -30,7 +30,7 @@
     await verifyVersion('2.5.0', '''
 const a = 42 >>> 3;
 ''', expectedErrors: [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 13, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 13, 3),
     ]);
   }
 
@@ -41,7 +41,7 @@
 const a = 42 >>> 3;
 ''', expectedErrors: [
       error(HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, 13, 3),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 13, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 13, 3),
     ]);
   }
 
@@ -69,7 +69,7 @@
     await verifyVersion('2.5.0', '''
 var a = 42 >>> 3;
 ''', expectedErrors: [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 11, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 11, 3),
     ]);
   }
 
@@ -80,7 +80,7 @@
 var a = 42 >>> 3;
 ''', expectedErrors: [
       error(HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, 11, 3),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 11, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 11, 3),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index f5f1ba7..cc08fbb 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -71,9 +71,12 @@
     as const_constructor_with_non_final_field;
 import 'const_deferred_class_test.dart' as const_deferred_class;
 import 'const_eval_throws_exception_test.dart' as const_eval_throws_exception;
+import 'const_eval_throws_idbze_test.dart' as const_eval_throws_idbze;
+import 'const_eval_type_bool_int_test.dart' as const_eval_type_bool_int;
 import 'const_eval_type_bool_num_string_test.dart'
     as const_eval_type_bool_num_string;
 import 'const_eval_type_bool_test.dart' as const_eval_type_bool;
+import 'const_eval_type_num_test.dart' as const_eval_type_num;
 import 'const_formal_parameter_test.dart' as const_formal_parameter;
 import 'const_initialized_with_non_constant_value_from_deferred_library_test.dart'
     as const_initialized_with_non_constant_value_from_deferred_library;
@@ -89,10 +92,13 @@
     as const_spread_expected_list_or_set;
 import 'const_spread_expected_map_test.dart' as const_spread_expected_map;
 import 'const_with_non_const_test.dart' as const_with_non_const;
+import 'const_with_non_constant_argument_test.dart'
+    as const_with_non_constant_argument;
 import 'const_with_non_type_test.dart' as const_with_non_type;
 import 'const_with_type_parameters_test.dart' as const_with_type_parameters;
 import 'const_with_undefined_constructor_test.dart'
     as const_with_undefined_constructor;
+import 'could_not_infer_test.dart' as could_not_infer;
 import 'dead_code_test.dart' as dead_code;
 import 'dead_null_aware_expression_test.dart' as dead_null_aware_expression;
 import 'default_list_constructor_test.dart' as default_list_constructor;
@@ -374,12 +380,18 @@
     as no_annotation_constructor_arguments;
 import 'no_combined_super_signature_test.dart' as no_combined_super_signature;
 import 'no_default_super_constructor_test.dart' as no_default_super_constructor;
+import 'no_generative_constructors_in_superclass_test.dart'
+    as no_generative_constructors_in_superclass;
 import 'non_abstract_class_inherits_abstract_member_test.dart'
     as non_abstract_class_inherits_abstract_member;
 import 'non_bool_condition_test.dart' as non_bool_condition;
 import 'non_bool_expression_test.dart' as non_bool_expression;
 import 'non_bool_negation_expression_test.dart' as non_bool_negation_expression;
 import 'non_bool_operand_test.dart' as non_bool_operand;
+import 'non_const_call_to_literal_constructor_test.dart'
+    as non_const_call_to_literal_constructor;
+import 'non_const_map_as_expression_statement_test.dart'
+    as non_const_map_as_expression_statement;
 import 'non_constant_annotation_constructor_test.dart'
     as non_constant_annotation_constructor;
 import 'non_constant_case_expression_from_deferred_library_test.dart'
@@ -401,6 +413,8 @@
 import 'non_constant_set_element_test.dart' as non_constant_set_element;
 import 'non_constant_type_argument_test.dart' as non_constant_type_argument;
 import 'non_generative_constructor_test.dart' as non_generative_constructor;
+import 'non_generative_implicit_constructor_test.dart'
+    as non_generative_implicit_constructor;
 import 'non_native_function_type_argument_to_pointer_test.dart'
     as non_native_function_type_argument_to_pointer;
 import 'non_null_opt_out_test.dart' as non_null_opt_out;
@@ -655,8 +669,11 @@
     const_constructor_with_non_final_field.main();
     const_deferred_class.main();
     const_eval_throws_exception.main();
+    const_eval_throws_idbze.main();
+    const_eval_type_bool_int.main();
     const_eval_type_bool_num_string.main();
     const_eval_type_bool.main();
+    const_eval_type_num.main();
     const_formal_parameter.main();
     const_initialized_with_non_constant_value_from_deferred_library.main();
     const_initialized_with_non_constant_value.main();
@@ -667,9 +684,11 @@
     const_spread_expected_list_or_set.main();
     const_spread_expected_map.main();
     const_with_non_const.main();
+    const_with_non_constant_argument.main();
     const_with_non_type.main();
     const_with_type_parameters.main();
     const_with_undefined_constructor.main();
+    could_not_infer.main();
     dead_code.main();
     dead_null_aware_expression.main();
     default_list_constructor.main();
@@ -857,6 +876,7 @@
     no_annotation_constructor_arguments.main();
     no_combined_super_signature.main();
     no_default_super_constructor.main();
+    no_generative_constructors_in_superclass.main();
     non_abstract_class_inherits_abstract_member.main();
     non_bool_condition.main();
     non_bool_expression.main();
@@ -877,6 +897,7 @@
     non_constant_set_element.main();
     non_constant_type_argument.main();
     non_generative_constructor.main();
+    non_generative_implicit_constructor.main();
     non_native_function_type_argument_to_pointer.main();
     non_null_opt_out.main();
     non_type_as_type_argument.main();
@@ -885,6 +906,8 @@
     non_void_return_for_setter.main();
     not_a_type.main();
     not_assigned_potentially_non_nullable_local_variable.main();
+    non_const_call_to_literal_constructor.main();
+    non_const_map_as_expression_statement.main();
     not_enough_positional_arguments.main();
     not_initialized_non_nullable_instance_field.main();
     not_initialized_non_nullable_variable.main();
diff --git a/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart b/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart
index a1993f5..873b884 100644
--- a/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart
@@ -33,7 +33,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 37),
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 101, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 101, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
index bf4c60e..80d33b8 100644
--- a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
@@ -22,7 +22,7 @@
 class A<T extends T> {
 }
 ''', [
-      error(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
     ]);
   }
 
@@ -34,7 +34,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
     ]);
   }
 
@@ -43,9 +43,9 @@
 class A<T1 extends T3, T2, T3 extends T1> {
 }
 ''', [
-      error(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 13),
+      error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 13),
       error(
-          StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 13),
+          CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 13),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart
index 1d6ca2b..866d3ce 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart
@@ -31,7 +31,7 @@
   return E.TWO;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT, 34, 3),
+      error(CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT, 34, 3),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index 61d9896..4ba550f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -25,7 +25,7 @@
   c.foo += 1;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 46, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 46, 3),
     ]);
   }
 
@@ -39,7 +39,7 @@
   C.foo += 1;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 50, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 50, 3),
     ]);
   }
 
@@ -57,7 +57,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 95, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 95, 3),
     ]);
   }
 
@@ -70,7 +70,7 @@
   0.foo;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 58, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 58, 3),
     ]);
   }
 
@@ -79,7 +79,7 @@
 extension E on int {}
 var a = 3.v;
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 32, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 32, 1),
     ]);
   }
 
@@ -93,7 +93,7 @@
   c.a;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 46, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 46, 1),
     ]);
   }
 
@@ -111,7 +111,7 @@
   c.foo;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 93, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 93, 3),
     ]);
   }
 
@@ -132,7 +132,7 @@
   return [if (x is String) x.length];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 6),
     ]);
   }
 
@@ -150,7 +150,7 @@
   return {if (x is String) x : x.length};
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
     ]);
   }
 
@@ -168,7 +168,7 @@
   return {if (x is String) x.length};
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 6),
     ]);
   }
 
@@ -188,7 +188,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 38, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 38, 6),
     ]);
   }
 
@@ -207,7 +207,7 @@
 class T {}
 f(T e) { return e.m; }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 29, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 29, 1),
     ]);
   }
 
@@ -217,7 +217,7 @@
   f() { return this.m; }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 30, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 30, 1),
     ]);
   }
 
@@ -228,7 +228,7 @@
   _null.foo;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 28, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 28, 3),
     ]);
   }
 
@@ -238,7 +238,7 @@
   return o.call;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 25, 4),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 25, 4),
     ]);
   }
 
@@ -250,7 +250,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 66, 6),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 66, 6),
     ]);
   }
 
@@ -266,7 +266,7 @@
   new PrefixProxy().foo;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 127, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 127, 3),
     ]);
   }
 
@@ -290,7 +290,7 @@
 f(var p) {
   f(C.g);
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 75, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 75, 1),
     ]);
   }
 
@@ -300,7 +300,7 @@
 f(var p) {
   f(C.m);
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 28, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 28, 1),
     ]);
   }
 
@@ -313,7 +313,7 @@
   T..foo;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 54, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 54, 3),
     ]);
   }
 
@@ -324,7 +324,7 @@
 class A {}
 f() => A?.hashCode;
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 21, 8),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 21, 8),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index e8f620e..26a8915 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -169,7 +169,7 @@
 }
 ''', [
       error(ParserErrorCode.MISSING_IDENTIFIER, 30, 1),
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 30, 1),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 30, 1),
       error(ParserErrorCode.MISSING_IDENTIFIER, 31, 1),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
index 20615c6..c99c251 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
@@ -39,7 +39,7 @@
   b.a();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 33, 1),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 33, 1),
     ]);
   }
 
@@ -58,7 +58,7 @@
   c.a();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 33, 1),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 33, 1),
     ]);
   }
 
@@ -91,7 +91,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 85, 1),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 85, 1),
     ]);
   }
 
@@ -99,7 +99,7 @@
     await assertErrorsInCode('''
 f(bool b, int i) => (b ? null : i).foo();
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 35, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 35, 3),
     ]);
   }
 
@@ -111,7 +111,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 22, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 22, 3),
     ]);
   }
 
@@ -122,7 +122,7 @@
   c..abs();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
     ]);
   }
 
@@ -131,7 +131,7 @@
 enum E { A }
 f() => E.abs();
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 22, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 22, 3),
     ]);
   }
 
@@ -142,7 +142,7 @@
   m.abs();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 24, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 24, 3),
     ]);
   }
 
@@ -153,7 +153,7 @@
   m..abs();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
     ]);
   }
 
@@ -164,7 +164,7 @@
   f(42).abs();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 40, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 40, 3),
     ]);
   }
 
@@ -194,7 +194,7 @@
   B.named();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 96, 5),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 96, 5),
     ]);
   }
 
@@ -210,7 +210,7 @@
   c.c();
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 61, 1),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 61, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
index 8f1ee9f..b52b9dd 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
@@ -25,7 +25,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 58, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 58, 2),
     ]);
   }
 
@@ -38,7 +38,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 44, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 44, 1),
     ]);
   }
 
@@ -47,7 +47,7 @@
 enum E { A }
 f(E e) => e + 1;
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 1),
     ]);
   }
 
@@ -63,7 +63,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 87, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 87, 1),
     ]);
   }
 
@@ -72,7 +72,7 @@
 mixin M {}
 f(M m) => m + 1;
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 1),
     ]);
   }
 
@@ -84,8 +84,8 @@
   a[0]++;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
     ]);
   }
 
@@ -109,7 +109,7 @@
   e[0];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
     ]);
   }
 
@@ -141,7 +141,7 @@
   a[0];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 125, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 125, 3),
     ]);
   }
 
@@ -153,7 +153,7 @@
   a[0];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
     ]);
   }
 
@@ -164,7 +164,7 @@
   m[0];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
     ]);
   }
 
@@ -174,7 +174,7 @@
   x[0];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 15, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 15, 3),
     ]);
   }
 
@@ -192,7 +192,7 @@
   a[0] = 1;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 125, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 125, 3),
     ]);
   }
 
@@ -218,7 +218,7 @@
   a[0] = 1;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
     ]);
   }
 
@@ -229,8 +229,8 @@
   a[0]++;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
     ]);
   }
 
@@ -241,7 +241,7 @@
   a[0];
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
     ]);
   }
 
@@ -252,7 +252,7 @@
   a[0] = 1;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
     ]);
   }
 
@@ -263,7 +263,7 @@
   x - 3;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 1),
     ]);
   }
 
@@ -275,7 +275,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 2),
     ]);
   }
 
@@ -286,7 +286,7 @@
   x + 3;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 1),
     ]);
   }
 
@@ -297,7 +297,7 @@
   a + 1;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 1),
     ]);
   }
 
@@ -309,7 +309,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 2),
     ]);
   }
 
@@ -321,7 +321,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 19, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 19, 2),
     ]);
   }
 
@@ -357,7 +357,7 @@
   m++;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 2),
     ]);
   }
 
@@ -368,7 +368,7 @@
   a++;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 2),
     ]);
   }
 
@@ -380,7 +380,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 19, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 19, 2),
     ]);
   }
 
@@ -392,7 +392,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 18, 2),
     ]);
   }
 
@@ -428,7 +428,7 @@
   -m;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 22, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 22, 1),
     ]);
   }
 
@@ -439,7 +439,7 @@
   ++a;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 22, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 22, 2),
     ]);
   }
 
@@ -451,7 +451,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 2),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 18, 2),
     ]);
   }
 
@@ -470,7 +470,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 18, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
index 3485b60..0dbe857 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
@@ -21,7 +21,7 @@
 import 'lib.dart' as p;
 f() => p.c;
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME, 33, 1),
+      error(CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME, 33, 1),
     ]);
   }
 
@@ -33,7 +33,7 @@
   p.c = 0;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME, 34, 1),
+      error(CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME, 34, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
index b845ece..72afe6f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
@@ -32,7 +32,7 @@
 class T {}
 f(T e1) { e1.m = 0; }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 24, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 24, 1),
     ]);
   }
 
@@ -42,7 +42,7 @@
   f() { this.m = 0; }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 23, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 23, 1),
     ]);
   }
 
@@ -58,7 +58,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 80, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 80, 1),
     ]);
   }
 
@@ -71,7 +71,7 @@
   }
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 43, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 43, 1),
     ]);
   }
 
@@ -95,7 +95,7 @@
 f(var p) {
   f(C.s = 1);
 }''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 75, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 75, 1),
     ]);
   }
 
@@ -104,7 +104,7 @@
 class A {}
 f() { A.B = 0;}
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 19, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 19, 1),
     ]);
   }
 
@@ -117,7 +117,7 @@
   T..foo = 42;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 54, 3),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 54, 3),
     ]);
   }
 
@@ -131,7 +131,7 @@
   c.a = 1;
 }
 ''', [
-      error(StaticTypeWarningCode.UNDEFINED_SETTER, 46, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 46, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
index 52ed3ad..f142a15 100644
--- a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
@@ -28,8 +28,7 @@
 }
 ''', [
       error(
-          StaticTypeWarningCode
-              .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
           80,
           1),
     ]);
@@ -48,8 +47,7 @@
 }
 ''', [
       error(
-          StaticTypeWarningCode
-              .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
           72,
           3),
     ]);
@@ -67,8 +65,7 @@
 }
 ''', [
       error(
-          StaticTypeWarningCode
-              .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
           66,
           1),
     ]);
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 096a963..13e3cd2 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -625,7 +625,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 58, 1),
-      error(StaticTypeWarningCode.UNDEFINED_GETTER, 60, 3),
+      error(CompileTimeErrorCode.UNDEFINED_GETTER, 60, 3),
     ]);
   }
 
@@ -876,7 +876,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 54, 1),
-      error(StaticTypeWarningCode.UNDEFINED_METHOD, 56, 3),
+      error(CompileTimeErrorCode.UNDEFINED_METHOD, 56, 3),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
index e2fbe45..f5b79b4 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
@@ -232,7 +232,7 @@
 ''', [
       // TODO(mfairhurst) suppress UNDEFINED_OPERATOR
       error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 26, 1),
+      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 26, 1),
       error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 27, 1),
     ]);
   }
@@ -582,7 +582,7 @@
   return x;
 }
 ''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart
index 83954f2..3d53d64 100644
--- a/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart
@@ -20,7 +20,7 @@
 class A<E, F> {}
 A<A> a = null;
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 17, 4),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 17, 4),
     ]);
   }
 
@@ -29,7 +29,7 @@
 class A<E> {}
 A<A, A> a = null;
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 14, 7),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 14, 7),
     ]);
   }
 
@@ -39,7 +39,7 @@
 class M {}
 class B<F extends num> = A<F> with M;
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 4),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 4),
     ]);
   }
 
@@ -53,7 +53,7 @@
   return const C<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 6),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 6),
     ]);
   }
 
@@ -67,7 +67,7 @@
   return const C<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 53, 6),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 53, 6),
     ]);
   }
 
@@ -81,7 +81,7 @@
   return const C<int, int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 50, 11),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 50, 11),
     ]);
   }
 
@@ -89,7 +89,7 @@
     await assertErrorsInCode(r'''
 dynamic<int> v;
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 0, 12),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 0, 12),
     ]);
   }
 
@@ -101,7 +101,7 @@
   return new C<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 31, 6),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 31, 6),
     ]);
   }
 
@@ -113,7 +113,7 @@
   return new C<int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 37, 6),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 37, 6),
     ]);
   }
 
@@ -125,7 +125,7 @@
   return new C<int, int>();
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 34, 11),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 34, 11),
     ]);
   }
 
@@ -138,7 +138,7 @@
   a.element.anyGetterExistsInDynamic;
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 36, 6),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 36, 6),
     ]);
   }
 
@@ -151,7 +151,7 @@
   a.element.anyGetterExistsInDynamic;
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 33, 10),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 33, 10),
     ]);
   }
 
@@ -161,7 +161,7 @@
   T<int> f;
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 15, 6),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 15, 6),
     ]);
   }
 
@@ -173,7 +173,7 @@
   return p is C<A>;
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 49, 4),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 49, 4),
     ]);
   }
 
@@ -185,7 +185,7 @@
   return p is C<A, A>;
 }
 ''', [
-      error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 46, 7),
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 46, 7),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
index ba8cc06..53b3bfe 100644
--- a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
@@ -28,7 +28,7 @@
 }
 ''',
         expectedErrorsByNullability(nullable: [
-          error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 72, 1),
+          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 72, 1),
         ], legacy: []));
   }
 
@@ -39,7 +39,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 3),
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 25, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 25, 1),
     ]);
   }
 
@@ -58,7 +58,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 13),
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 35, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 1),
     ]);
   }
 
@@ -90,7 +90,7 @@
   yield 0;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 58, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 58, 1),
     ]);
   }
 
@@ -111,7 +111,7 @@
 }
 ''',
         expectedErrorsByNullability(nullable: [
-          error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 51, 1),
+          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 51, 1),
         ], legacy: []));
   }
 
@@ -122,7 +122,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 0, 3),
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 24, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 24, 1),
     ]);
   }
 
@@ -156,7 +156,7 @@
   yield 0;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 37, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 37, 1),
     ]);
   }
 
@@ -169,7 +169,7 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 22, 11),
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 54, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 54, 1),
     ]);
   }
 
@@ -221,7 +221,7 @@
   yield* 0;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 22, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 22, 1),
     ]);
   }
 
@@ -232,7 +232,7 @@
   yield* a;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 41, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
     ]);
   }
 
@@ -245,7 +245,7 @@
   yield* a;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 75, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 75, 1),
     ]);
   }
 
@@ -258,7 +258,7 @@
   yield* a;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 78, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 78, 1),
     ]);
   }
 
@@ -286,7 +286,7 @@
 Stream g() => throw 0;
 ''',
         expectedErrorsByNullability(nullable: [
-          error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 56, 3),
+          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 56, 3),
         ], legacy: []));
   }
 
@@ -324,7 +324,7 @@
 
 Stream<String> g() => throw 0;
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 56, 3),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 56, 3),
     ]);
   }
 
@@ -364,7 +364,7 @@
   yield* 0;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 21, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 21, 1),
     ]);
   }
 
@@ -377,7 +377,7 @@
   f;
 }
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 41, 1),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
     ]);
   }
 
@@ -401,7 +401,7 @@
 Iterable g() => throw 0;
 ''',
         expectedErrorsByNullability(nullable: [
-          error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 35, 3),
+          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
         ], legacy: []));
   }
 
@@ -433,7 +433,7 @@
 
 Iterable<String> g() => throw 0;
 ''', [
-      error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 35, 3),
+      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index ff939fc..9188c8c 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -80,7 +80,7 @@
       ['x']
     ]);
     var invalid_assignment = AnalysisError(
-        TestSource(), 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
+        TestSource(), 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
       ['x'],
       ['y']
     ]);
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index fe60337..cc8ae522 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -1110,7 +1110,7 @@
 
     // missing_return: error
     var undefined_function = AnalysisError(
-        TestSource(), 0, 1, StaticTypeWarningCode.UNDEFINED_FUNCTION, [
+        TestSource(), 0, 1, CompileTimeErrorCode.UNDEFINED_FUNCTION, [
       ['x']
     ]);
     expect(processorFor(undefined_function).severity, ErrorSeverity.WARNING);
diff --git a/pkg/compiler/lib/src/elements/entities.dart b/pkg/compiler/lib/src/elements/entities.dart
index e863b5b..ccd058d 100644
--- a/pkg/compiler/lib/src/elements/entities.dart
+++ b/pkg/compiler/lib/src/elements/entities.dart
@@ -33,6 +33,9 @@
 abstract class LibraryEntity extends Entity {
   /// Return the canonical uri that identifies this library.
   Uri get canonicalUri;
+
+  /// Returns whether or not this library has opted into null safety.
+  bool get isNonNullableByDefault;
 }
 
 /// Stripped down super interface for import entities.
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 5d6d6ac..4aa804c 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -1239,26 +1239,24 @@
   /// library code.
   TypeInformation handleIntrisifiedSelector(
       Selector selector, AbstractValue mask, InferrerEngine inferrer) {
-    JClosedWorld closedWorld = inferrer.closedWorld;
+    AbstractValueDomain abstractValueDomain = inferrer.abstractValueDomain;
     if (mask == null) return null;
-    if (inferrer.abstractValueDomain.isIntegerOrNull(mask).isPotentiallyFalse) {
+    if (abstractValueDomain.isIntegerOrNull(mask).isPotentiallyFalse) {
       return null;
     }
     if (!selector.isCall && !selector.isOperator) return null;
     if (!arguments.named.isEmpty) return null;
     if (arguments.positional.length > 1) return null;
 
-    ClassEntity uint31Implementation = closedWorld.commonElements.jsUInt31Class;
-    bool isInt(info) => info.type.containsOnlyInt(closedWorld);
-    bool isEmpty(info) => info.type.isEmpty;
-    bool isUInt31(info) {
-      return info.type.satisfies(uint31Implementation, closedWorld);
-    }
-
-    bool isPositiveInt(info) {
-      return info.type.satisfies(
-          closedWorld.commonElements.jsPositiveIntClass, closedWorld);
-    }
+    bool isInt(info) =>
+        abstractValueDomain.isIntegerOrNull(info.type).isDefinitelyTrue;
+    bool isEmpty(info) =>
+        abstractValueDomain.isEmpty(info.type).isDefinitelyTrue;
+    bool isUInt31(info) => abstractValueDomain
+        .isUInt31(abstractValueDomain.excludeNull(info.type))
+        .isDefinitelyTrue;
+    bool isPositiveInt(info) =>
+        abstractValueDomain.isPositiveIntegerOrNull(info.type).isDefinitelyTrue;
 
     TypeInformation tryLater() => inferrer.types.nonNullEmptyType;
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
index f2fda3d..5c6b9ef 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
@@ -88,14 +88,14 @@
   }
 
   @override
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+  TypeMask intersection(TypeMask other, CommonMasks domain) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, domain);
     if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable ? nullable() : nonNullable();
   }
 
   @override
-  TypeMask union(dynamic other, JClosedWorld closedWorld) {
+  TypeMask union(dynamic other, CommonMasks domain) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -105,10 +105,9 @@
     } else if (other.isContainer &&
         elementType != null &&
         other.elementType != null) {
-      TypeMask newElementType =
-          elementType.union(other.elementType, closedWorld);
+      TypeMask newElementType = elementType.union(other.elementType, domain);
       int newLength = (length == other.length) ? length : null;
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
       return new ContainerTypeMask(
           newForwardTo,
           allocationNode == other.allocationNode ? allocationNode : null,
@@ -118,7 +117,7 @@
           newElementType,
           newLength);
     } else {
-      return forwardTo.union(other, closedWorld);
+      return forwardTo.union(other, domain);
     }
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
index ef15561..2431ba8 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
@@ -97,14 +97,14 @@
   }
 
   @override
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+  TypeMask intersection(TypeMask other, CommonMasks domain) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, domain);
     if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable ? nullable() : nonNullable();
   }
 
   @override
-  TypeMask union(dynamic other, JClosedWorld closedWorld) {
+  TypeMask union(dynamic other, CommonMasks domain) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -112,9 +112,9 @@
     } else if (other.isEmptyOrNull) {
       return other.isNullable ? this.nullable() : this;
     } else if (other.isDictionary) {
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
-      TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
-      TypeMask newValueType = valueType.union(other.valueType, closedWorld);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
+      TypeMask newKeyType = keyType.union(other.keyType, domain);
+      TypeMask newValueType = valueType.union(other.valueType, domain);
       Map<String, TypeMask> mappings = <String, TypeMask>{};
       _typeMap.forEach((k, dynamic v) {
         if (!other._typeMap.containsKey(k)) {
@@ -123,7 +123,7 @@
       });
       other._typeMap.forEach((k, v) {
         if (_typeMap.containsKey(k)) {
-          mappings[k] = v.union(_typeMap[k], closedWorld);
+          mappings[k] = v.union(_typeMap[k], domain);
         } else {
           mappings[k] = v.nullable();
         }
@@ -133,13 +133,13 @@
     } else if (other.isMap &&
         (other.keyType != null) &&
         (other.valueType != null)) {
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
-      TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
-      TypeMask newValueType = valueType.union(other.valueType, closedWorld);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
+      TypeMask newKeyType = keyType.union(other.keyType, domain);
+      TypeMask newValueType = valueType.union(other.valueType, domain);
       return new MapTypeMask(
           newForwardTo, null, null, newKeyType, newValueType);
     } else {
-      return forwardTo.union(other, closedWorld);
+      return forwardTo.union(other, domain);
     }
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 175bac3..482bdc4 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -53,25 +53,24 @@
   /// Ensures that the generated mask is normalized, i.e., a call to
   /// [TypeMask.assertIsNormalized] with the factory's result returns `true`.
   factory FlatTypeMask.normalized(
-      ClassEntity base, int flags, JClosedWorld world) {
-    if (base == world.commonElements.nullClass) {
+      ClassEntity base, int flags, CommonMasks domain) {
+    if (base == domain.commonElements.nullClass) {
       return FlatTypeMask.empty();
     }
     if ((flags >> 1) == EMPTY || ((flags >> 1) == EXACT)) {
       return new FlatTypeMask._(base, flags);
     }
     if ((flags >> 1) == SUBTYPE) {
-      if (!world.classHierarchy.hasAnyStrictSubtype(base) ||
-          world.classHierarchy.hasOnlySubclasses(base)) {
+      if (!domain._closedWorld.classHierarchy.hasAnyStrictSubtype(base) ||
+          domain._closedWorld.classHierarchy.hasOnlySubclasses(base)) {
         flags = (flags & 0x1) | (SUBCLASS << 1);
       }
     }
     if (((flags >> 1) == SUBCLASS) &&
-        !world.classHierarchy.hasAnyStrictSubclass(base)) {
+        !domain._closedWorld.classHierarchy.hasAnyStrictSubclass(base)) {
       flags = (flags & 0x1) | (EXACT << 1);
     }
-    CommonMasks commonMasks = world.abstractValueDomain;
-    return commonMasks.getCachedMask(
+    return domain.getCachedMask(
         base, flags, () => new FlatTypeMask._(base, flags));
   }
 
@@ -298,26 +297,27 @@
   }
 
   @override
-  TypeMask union(TypeMask other, JClosedWorld closedWorld) {
+  TypeMask union(TypeMask other, CommonMasks domain) {
+    JClosedWorld closedWorld = domain._closedWorld;
     assert(other != null);
     assert(TypeMask.assertIsNormalized(this, closedWorld));
     assert(TypeMask.assertIsNormalized(other, closedWorld));
-    if (other is! FlatTypeMask) return other.union(this, closedWorld);
+    if (other is! FlatTypeMask) return other.union(this, domain);
     FlatTypeMask flatOther = other;
     if (isEmptyOrNull) {
       return isNullable ? flatOther.nullable() : flatOther;
     } else if (flatOther.isEmptyOrNull) {
       return flatOther.isNullable ? nullable() : this;
     } else if (base == flatOther.base) {
-      return unionSame(flatOther, closedWorld);
+      return unionSame(flatOther, domain);
     } else if (closedWorld.classHierarchy.isSubclassOf(flatOther.base, base)) {
-      return unionStrictSubclass(flatOther, closedWorld);
+      return unionStrictSubclass(flatOther, domain);
     } else if (closedWorld.classHierarchy.isSubclassOf(base, flatOther.base)) {
-      return flatOther.unionStrictSubclass(this, closedWorld);
+      return flatOther.unionStrictSubclass(this, domain);
     } else if (closedWorld.classHierarchy.isSubtypeOf(flatOther.base, base)) {
-      return unionStrictSubtype(flatOther, closedWorld);
+      return unionStrictSubtype(flatOther, domain);
     } else if (closedWorld.classHierarchy.isSubtypeOf(base, flatOther.base)) {
-      return flatOther.unionStrictSubtype(this, closedWorld);
+      return flatOther.unionStrictSubtype(this, domain);
     } else {
       return new UnionTypeMask._internal(
           <FlatTypeMask>[this.nonNullable(), flatOther.nonNullable()],
@@ -325,10 +325,10 @@
     }
   }
 
-  TypeMask unionSame(FlatTypeMask other, JClosedWorld closedWorld) {
+  TypeMask unionSame(FlatTypeMask other, CommonMasks domain) {
     assert(base == other.base);
-    assert(TypeMask.assertIsNormalized(this, closedWorld));
-    assert(TypeMask.assertIsNormalized(other, closedWorld));
+    assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+    assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
     // The two masks share the base type, so we must chose the least
     // constraining kind (the highest) of the two. If either one of
     // the masks are nullable the result should be nullable too.
@@ -341,18 +341,18 @@
     } else if (other.flags == combined) {
       return other;
     } else {
-      return new FlatTypeMask.normalized(base, combined, closedWorld);
+      return new FlatTypeMask.normalized(base, combined, domain);
     }
   }
 
-  TypeMask unionStrictSubclass(FlatTypeMask other, JClosedWorld closedWorld) {
+  TypeMask unionStrictSubclass(FlatTypeMask other, CommonMasks domain) {
     assert(base != other.base);
-    assert(closedWorld.classHierarchy.isSubclassOf(other.base, base));
-    assert(TypeMask.assertIsNormalized(this, closedWorld));
-    assert(TypeMask.assertIsNormalized(other, closedWorld));
+    assert(domain._closedWorld.classHierarchy.isSubclassOf(other.base, base));
+    assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+    assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
     int combined;
     if ((isExact && other.isExact) ||
-        base == closedWorld.commonElements.objectClass) {
+        base == domain.commonElements.objectClass) {
       // Since the other mask is a subclass of this mask, we need the
       // resulting union to be a subclass too. If either one of the
       // masks are nullable the result should be nullable too.
@@ -368,16 +368,16 @@
     // If we weaken the constraint on this type, we have to make sure that
     // the result is normalized.
     return (flags != combined)
-        ? new FlatTypeMask.normalized(base, combined, closedWorld)
+        ? new FlatTypeMask.normalized(base, combined, domain)
         : this;
   }
 
-  TypeMask unionStrictSubtype(FlatTypeMask other, JClosedWorld closedWorld) {
+  TypeMask unionStrictSubtype(FlatTypeMask other, CommonMasks domain) {
     assert(base != other.base);
-    assert(!closedWorld.classHierarchy.isSubclassOf(other.base, base));
-    assert(closedWorld.classHierarchy.isSubtypeOf(other.base, base));
-    assert(TypeMask.assertIsNormalized(this, closedWorld));
-    assert(TypeMask.assertIsNormalized(other, closedWorld));
+    assert(!domain._closedWorld.classHierarchy.isSubclassOf(other.base, base));
+    assert(domain._closedWorld.classHierarchy.isSubtypeOf(other.base, base));
+    assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+    assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
     // Since the other mask is a subtype of this mask, we need the
     // resulting union to be a subtype too. If either one of the masks
     // are nullable the result should be nullable too.
@@ -385,16 +385,16 @@
     // We know there is at least one subtype, [other.base], so no need
     // to normalize.
     return (flags != combined)
-        ? new FlatTypeMask.normalized(base, combined, closedWorld)
+        ? new FlatTypeMask.normalized(base, combined, domain)
         : this;
   }
 
   @override
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
+  TypeMask intersection(TypeMask other, CommonMasks domain) {
     assert(other != null);
-    if (other is! FlatTypeMask) return other.intersection(this, closedWorld);
-    assert(TypeMask.assertIsNormalized(this, closedWorld));
-    assert(TypeMask.assertIsNormalized(other, closedWorld));
+    if (other is! FlatTypeMask) return other.intersection(this, domain);
+    assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+    assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
     FlatTypeMask flatOther = other;
 
     ClassEntity otherBase = flatOther.base;
@@ -407,14 +407,12 @@
       return includeNull ? other : other.nonNullable();
     }
 
-    SubclassResult result = closedWorld.classHierarchy
+    SubclassResult result = domain._closedWorld.classHierarchy
         .commonSubclasses(base, _classQuery, otherBase, flatOther._classQuery);
 
     switch (result.kind) {
       case SubclassResultKind.EMPTY:
-        return includeNull
-            ? closedWorld.abstractValueDomain.nullType
-            : closedWorld.abstractValueDomain.emptyType;
+        return includeNull ? domain.nullType : domain.emptyType;
       case SubclassResultKind.EXACT1:
         assert(isExact);
         return includeNull ? this : nonNullable();
@@ -436,20 +434,19 @@
       case SubclassResultKind.SET:
       default:
         if (result.classes.isEmpty) {
-          return includeNull
-              ? closedWorld.abstractValueDomain.nullType
-              : closedWorld.abstractValueDomain.emptyType;
+          return includeNull ? domain.nullType : domain.emptyType;
         } else if (result.classes.length == 1) {
           ClassEntity cls = result.classes.first;
           return includeNull
-              ? new TypeMask.subclass(cls, closedWorld)
-              : new TypeMask.nonNullSubclass(cls, closedWorld);
+              ? new TypeMask.subclass(cls, domain._closedWorld)
+              : new TypeMask.nonNullSubclass(cls, domain._closedWorld);
         }
 
         List<FlatTypeMask> masks = List.from(result.classes.map(
-            (ClassEntity cls) => TypeMask.nonNullSubclass(cls, closedWorld)));
+            (ClassEntity cls) =>
+                TypeMask.nonNullSubclass(cls, domain._closedWorld)));
         if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
-          return UnionTypeMask.flatten(masks, includeNull, closedWorld);
+          return UnionTypeMask.flatten(masks, includeNull, domain);
         }
         return new UnionTypeMask._internal(masks, includeNull);
     }
@@ -501,7 +498,7 @@
     return true;
   }
 
-  TypeMask intersectionSame(FlatTypeMask other, JClosedWorld closedWorld) {
+  TypeMask intersectionSame(FlatTypeMask other, CommonMasks domain) {
     assert(base == other.base);
     // The two masks share the base type, so we must chose the most
     // constraining kind (the lowest) of the two. Only if both masks
@@ -515,14 +512,13 @@
     } else if (other.flags == combined) {
       return other;
     } else {
-      return new FlatTypeMask.normalized(base, combined, closedWorld);
+      return new FlatTypeMask.normalized(base, combined, domain);
     }
   }
 
-  TypeMask intersectionStrictSubclass(
-      FlatTypeMask other, JClosedWorld closedWorld) {
+  TypeMask intersectionStrictSubclass(FlatTypeMask other, CommonMasks domain) {
     assert(base != other.base);
-    assert(closedWorld.classHierarchy.isSubclassOf(other.base, base));
+    assert(domain._closedWorld.classHierarchy.isSubclassOf(other.base, base));
     // If this mask isn't at least a subclass mask, then the
     // intersection with the other mask is empty.
     if (isExact) return intersectionEmpty(other);
@@ -535,7 +531,7 @@
     if (other.flags == combined) {
       return other;
     } else {
-      return new FlatTypeMask.normalized(other.base, combined, closedWorld);
+      return new FlatTypeMask.normalized(other.base, combined, domain);
     }
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
index 8d86f0c..ee4de92 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
@@ -98,7 +98,7 @@
   }
 
   @override
-  TypeMask union(other, JClosedWorld closedWorld) {
+  TypeMask union(other, CommonMasks domain) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -106,7 +106,7 @@
     } else if (other.isEmptyOrNull) {
       return other.isNullable ? this.nullable() : this;
     }
-    return forwardTo.union(other, closedWorld);
+    return forwardTo.union(other, domain);
   }
 
   @override
@@ -115,8 +115,8 @@
   }
 
   @override
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
-    return forwardTo.intersection(other, closedWorld);
+  TypeMask intersection(TypeMask other, CommonMasks domain) {
+    return forwardTo.intersection(other, domain);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
index 3b4d729..f6e6dc8 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
@@ -90,14 +90,14 @@
   }
 
   @override
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+  TypeMask intersection(TypeMask other, CommonMasks domain) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, domain);
     if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable ? nullable() : nonNullable();
   }
 
   @override
-  TypeMask union(dynamic other, JClosedWorld closedWorld) {
+  TypeMask union(dynamic other, CommonMasks domain) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -109,9 +109,9 @@
         other.keyType != null &&
         valueType != null &&
         other.valueType != null) {
-      TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
-      TypeMask newValueType = valueType.union(other.valueType, closedWorld);
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+      TypeMask newKeyType = keyType.union(other.keyType, domain);
+      TypeMask newValueType = valueType.union(other.valueType, domain);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
       return new MapTypeMask(
           newForwardTo, null, null, newKeyType, newValueType);
     } else if (other.isDictionary) {
@@ -119,11 +119,11 @@
       // doesn't need the compiler.
       assert(other.keyType ==
           new TypeMask.nonNullExact(
-              closedWorld.commonElements.jsStringClass, closedWorld));
-      TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
+              domain.commonElements.jsStringClass, domain._closedWorld));
+      TypeMask newKeyType = keyType.union(other.keyType, domain);
       TypeMask newValueType =
-          other.typeMap.values.fold(keyType, (p, n) => p.union(n, closedWorld));
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+          other.typeMap.values.fold(keyType, (p, n) => p.union(n, domain));
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
       MapTypeMask newMapTypeMask = new MapTypeMask(
           newForwardTo,
           allocationNode == other.allocationNode ? allocationNode : null,
@@ -134,7 +134,7 @@
           newValueType);
       return newMapTypeMask;
     } else {
-      return forwardTo.union(other, closedWorld);
+      return forwardTo.union(other, domain);
     }
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index b6944b1..0d0bada 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -225,7 +225,7 @@
   @override
   AbstractBool couldBeTypedArray(TypeMask mask) {
     bool intersects(TypeMask type1, TypeMask type2) =>
-        !type1.intersection(type2, _closedWorld).isEmpty;
+        !type1.intersection(type2, this).isEmpty;
     // TODO(herhut): Maybe cache the TypeMask for typedDataClass and
     //               jsIndexingBehaviourInterface.
     ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
@@ -428,7 +428,7 @@
     AbstractValue typeMask = (cls == commonElements.nullClass)
         ? createNullableSubtype(cls)
         : createNonNullSubtype(cls);
-    if (expressionMask.union(typeMask, _closedWorld) == typeMask) {
+    if (expressionMask.union(typeMask, this) == typeMask) {
       return AbstractBool.True;
     } else if (expressionMask.isDisjoint(typeMask, _closedWorld)) {
       return AbstractBool.False;
@@ -674,11 +674,10 @@
   }
 
   @override
-  TypeMask union(TypeMask a, TypeMask b) => a.union(b, _closedWorld);
+  TypeMask union(TypeMask a, TypeMask b) => a.union(b, this);
 
   @override
-  TypeMask intersection(TypeMask a, TypeMask b) =>
-      a.intersection(b, _closedWorld);
+  TypeMask intersection(TypeMask a, TypeMask b) => a.intersection(b, this);
 
   @override
   AbstractBool areDisjoint(TypeMask a, TypeMask b) =>
@@ -738,7 +737,7 @@
   AbstractValue unionOfMany(Iterable<AbstractValue> values) {
     TypeMask result = const TypeMask.nonNullEmpty();
     for (TypeMask value in values) {
-      result = result.union(value, _closedWorld);
+      result = result.union(value, this);
     }
     return result;
   }
@@ -761,7 +760,7 @@
             return const TypeMask.empty();
           }
         }),
-        _closedWorld);
+        this);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
index 0b1ffb6e..c62db3e 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
@@ -79,14 +79,14 @@
   }
 
   @override
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+  TypeMask intersection(TypeMask other, CommonMasks domain) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, domain);
     if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable ? nullable() : nonNullable();
   }
 
   @override
-  TypeMask union(dynamic other, JClosedWorld closedWorld) {
+  TypeMask union(dynamic other, CommonMasks domain) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -96,12 +96,11 @@
     } else if (other.isSet &&
         elementType != null &&
         other.elementType != null) {
-      TypeMask newElementType =
-          elementType.union(other.elementType, closedWorld);
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+      TypeMask newElementType = elementType.union(other.elementType, domain);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
       return new SetTypeMask(newForwardTo, null, null, newElementType);
     } else {
-      return forwardTo.union(other, closedWorld);
+      return forwardTo.union(other, domain);
     }
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
index 7490ada..19d3e76 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
@@ -110,9 +110,9 @@
 /// yield conservative answers that contain too many classes.
 abstract class TypeMask implements AbstractValue {
   factory TypeMask(
-      ClassEntity base, int kind, bool isNullable, JClosedWorld closedWorld) {
+      ClassEntity base, int kind, bool isNullable, CommonMasks domain) {
     return new FlatTypeMask.normalized(
-        base, (kind << 1) | (isNullable ? 1 : 0), closedWorld);
+        base, (kind << 1) | (isNullable ? 1 : 0), domain);
   }
 
   const factory TypeMask.empty() = FlatTypeMask.empty;
@@ -217,8 +217,8 @@
     }
   }
 
-  factory TypeMask.unionOf(Iterable<TypeMask> masks, JClosedWorld closedWorld) {
-    return UnionTypeMask.unionOf(masks, closedWorld);
+  factory TypeMask.unionOf(Iterable<TypeMask> masks, CommonMasks domain) {
+    return UnionTypeMask.unionOf(masks, domain);
   }
 
   /// Deserializes a [TypeMask] object from [source].
@@ -394,13 +394,13 @@
   ClassEntity singleClass(JClosedWorld closedWorld);
 
   /// Returns a type mask representing the union of [this] and [other].
-  TypeMask union(TypeMask other, JClosedWorld closedWorld);
+  TypeMask union(TypeMask other, CommonMasks domain);
 
   /// Returns whether the intersection of this and [other] is empty.
   bool isDisjoint(TypeMask other, JClosedWorld closedWorld);
 
   /// Returns a type mask representing the intersection of [this] and [other].
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld);
+  TypeMask intersection(TypeMask other, CommonMasks domain);
 
   /// Returns whether [element] is a potential target when being invoked on this
   /// type mask.
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index e8cd0d1..762dfc4 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -50,33 +50,33 @@
     sink.end(tag);
   }
 
-  static TypeMask unionOf(Iterable<TypeMask> masks, JClosedWorld closedWorld) {
-    assert(
-        masks.every((mask) => TypeMask.assertIsNormalized(mask, closedWorld)));
+  static TypeMask unionOf(Iterable<TypeMask> masks, CommonMasks domain) {
+    assert(masks.every(
+        (mask) => TypeMask.assertIsNormalized(mask, domain._closedWorld)));
     List<FlatTypeMask> disjoint = <FlatTypeMask>[];
     bool isNullable = masks.any((TypeMask mask) => mask.isNullable);
-    unionOfHelper(masks, disjoint, closedWorld);
+    unionOfHelper(masks, disjoint, domain);
     if (disjoint.isEmpty)
       return isNullable ? TypeMask.empty() : TypeMask.nonNullEmpty();
     if (disjoint.length > MAX_UNION_LENGTH) {
-      return flatten(disjoint, isNullable, closedWorld);
+      return flatten(disjoint, isNullable, domain);
     }
     if (disjoint.length == 1)
       return isNullable ? disjoint[0].nullable() : disjoint[0];
     UnionTypeMask union = new UnionTypeMask._internal(disjoint, isNullable);
-    assert(TypeMask.assertIsNormalized(union, closedWorld));
+    assert(TypeMask.assertIsNormalized(union, domain._closedWorld));
     return union;
   }
 
   static void unionOfHelper(Iterable<TypeMask> masks,
-      List<FlatTypeMask> disjoint, JClosedWorld closedWorld) {
+      List<FlatTypeMask> disjoint, CommonMasks domain) {
     // TODO(johnniwinther): Impose an order on the mask to ensure subclass masks
     // are preferred to subtype masks.
     for (TypeMask mask in masks) {
       mask = TypeMask.nonForwardingMask(mask).nonNullable();
       if (mask.isUnion) {
         UnionTypeMask union = mask;
-        unionOfHelper(union.disjointMasks, disjoint, closedWorld);
+        unionOfHelper(union.disjointMasks, disjoint, domain);
       } else if (mask.isEmpty) {
         continue;
       } else {
@@ -89,7 +89,7 @@
         for (int i = 0; i < disjoint.length; i++) {
           FlatTypeMask current = disjoint[i];
           if (current == null) continue;
-          TypeMask newMask = flatMask.union(current, closedWorld);
+          TypeMask newMask = flatMask.union(current, domain);
           // If we have found a disjoint union, continue iterating.
           if (newMask.isUnion) continue;
           covered = true;
@@ -122,7 +122,7 @@
   }
 
   static TypeMask flatten(
-      List<FlatTypeMask> masks, bool includeNull, JClosedWorld closedWorld) {
+      List<FlatTypeMask> masks, bool includeNull, CommonMasks domain) {
     // TODO(johnniwinther): Move this computation to [ClosedWorld] and use the
     // class set structures.
     if (masks.isEmpty) throw ArgumentError.value(masks, 'masks');
@@ -132,7 +132,7 @@
 
     List<ClassEntity> masksBases = masks.map((mask) => mask.base).toList();
     Iterable<ClassEntity> candidates =
-        closedWorld.commonSupertypesOf(masksBases);
+        domain._closedWorld.commonSupertypesOf(masksBases);
 
     // Compute the best candidate and its kind.
     ClassEntity bestElement;
@@ -141,8 +141,8 @@
     for (ClassEntity candidate in candidates) {
       bool isInstantiatedStrictSubclass(cls) =>
           cls != candidate &&
-          closedWorld.classHierarchy.isExplicitlyInstantiated(cls) &&
-          closedWorld.classHierarchy.isSubclassOf(cls, candidate);
+          domain._closedWorld.classHierarchy.isExplicitlyInstantiated(cls) &&
+          domain._closedWorld.classHierarchy.isSubclassOf(cls, candidate);
 
       int size;
       int kind;
@@ -155,12 +155,13 @@
         // TODO(sigmund, johnniwinther): computing length here (and below) is
         // expensive. If we can't prevent `flatten` from being called a lot, it
         // might be worth caching results.
-        size = closedWorld.classHierarchy.strictSubclassCount(candidate);
-        assert(
-            size <= closedWorld.classHierarchy.strictSubtypeCount(candidate));
+        size =
+            domain._closedWorld.classHierarchy.strictSubclassCount(candidate);
+        assert(size <=
+            domain._closedWorld.classHierarchy.strictSubtypeCount(candidate));
       } else {
         kind = FlatTypeMask.SUBTYPE;
-        size = closedWorld.classHierarchy.strictSubtypeCount(candidate);
+        size = domain._closedWorld.classHierarchy.strictSubtypeCount(candidate);
       }
       // Update the best candidate if the new one is better.
       if (bestElement == null || size < bestSize) {
@@ -169,11 +170,11 @@
         bestKind = kind;
       }
     }
-    return new TypeMask(bestElement, bestKind, includeNull, closedWorld);
+    return new TypeMask(bestElement, bestKind, includeNull, domain);
   }
 
   @override
-  TypeMask union(dynamic other, JClosedWorld closedWorld) {
+  TypeMask union(dynamic other, CommonMasks domain) {
     other = TypeMask.nonForwardingMask(other);
     if (other is UnionTypeMask) {
       if (_containsNonNullableUnion(other)) {
@@ -195,12 +196,12 @@
       assert(other is UnionTypeMask);
       newList.addAll(other.disjointMasks);
     }
-    TypeMask newMask = new TypeMask.unionOf(newList, closedWorld);
+    TypeMask newMask = new TypeMask.unionOf(newList, domain);
     return isNullable || other.isNullable ? newMask.nullable() : newMask;
   }
 
   @override
-  TypeMask intersection(dynamic other, JClosedWorld closedWorld) {
+  TypeMask intersection(dynamic other, CommonMasks domain) {
     other = TypeMask.nonForwardingMask(other);
     if (other is UnionTypeMask) {
       if (_containsNonNullableUnion(other)) {
@@ -223,14 +224,14 @@
           intersections.add(current);
         } else {
           for (FlatTypeMask flatOther in other.disjointMasks) {
-            intersections.add(current.intersection(flatOther, closedWorld));
+            intersections.add(current.intersection(flatOther, domain));
           }
         }
       } else {
-        intersections.add(current.intersection(other, closedWorld));
+        intersections.add(current.intersection(other, domain));
       }
     }
-    TypeMask newMask = TypeMask.unionOf(intersections, closedWorld);
+    TypeMask newMask = TypeMask.unionOf(intersections, domain);
     return isNullable && other.isNullable ? newMask.nullable() : newMask;
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
index fb475be..94e0284 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
@@ -57,8 +57,8 @@
   }
 
   @override
-  TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+  TypeMask intersection(TypeMask other, CommonMasks domain) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, domain);
     if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
     return forwardIntersection.isNullable ? nullable() : nonNullable();
   }
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 2d25175..33079f9 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -350,9 +350,9 @@
     ir.DartType receiverType = visitNode(node.receiver);
     ArgumentTypes argumentTypes = _visitArguments(node.arguments);
     ir.DartType returnType;
-    if (typeEnvironment.isOverloadedArithmeticOperator(node.target)) {
+    if (typeEnvironment.isSpecialCasedBinaryOperator(node.target)) {
       ir.DartType argumentType = argumentTypes.positional[0];
-      returnType = typeEnvironment.getTypeOfOverloadedArithmetic(
+      returnType = typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
           receiverType, argumentType);
     } else {
       ir.Class superclass = node.target.enclosingClass;
@@ -386,7 +386,7 @@
   /// target as to avoid visiting the argument twice.
   bool isSpecialCasedBinaryOperator(ir.Member interfaceTarget) {
     return interfaceTarget is ir.Procedure &&
-        typeEnvironment.isOverloadedArithmeticOperator(interfaceTarget);
+        typeEnvironment.isSpecialCasedBinaryOperator(interfaceTarget);
   }
 
   ir.Member _getMember(ir.Class cls, String name) {
@@ -639,7 +639,7 @@
           node, argumentTypes, getterType, interfaceTarget);
       if (isSpecialCasedBinaryOperator(interfaceTarget)) {
         ir.DartType argumentType = argumentTypes.positional[0];
-        return typeEnvironment.getTypeOfOverloadedArithmetic(
+        return typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
             receiverType, argumentType);
       } else if (getterType is ir.FunctionType) {
         return getterType.returnType;
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 5008ebd..4e04562 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -225,9 +225,13 @@
   final bool isFinal;
   final bool isLazy;
   final bool isInitializedByConstant;
+  final bool usesNonNullableInitialization;
 
   StaticField(this.element, this.name, this.getterName, this.holder, this.code,
-      {this.isFinal, this.isLazy, this.isInitializedByConstant: false});
+      {this.isFinal,
+      this.isLazy,
+      this.isInitializedByConstant: false,
+      this.usesNonNullableInitialization: false});
 
   @override
   String toString() {
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index e4508fe..04d085e 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -434,7 +434,8 @@
         element, name, null, _registerStaticStateHolder(), code,
         isFinal: false,
         isLazy: false,
-        isInitializedByConstant: initialValue != null);
+        isInitializedByConstant: initialValue != null,
+        usesNonNullableInitialization: element.library.isNonNullableByDefault);
   }
 
   List<StaticField> _buildStaticLazilyInitializedFields(
@@ -463,7 +464,9 @@
     // the holder-instance.
     return new StaticField(
         element, name, getterName, _registerStaticStateHolder(), code,
-        isFinal: !element.isAssignable, isLazy: true);
+        isFinal: !element.isAssignable,
+        isLazy: true,
+        usesNonNullableInitialization: element.library.isNonNullableByDefault);
   }
 
   List<Library> _buildLibraries(LibrariesMap librariesMap) {
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 8ae8d3a3..5bd1eab 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -118,7 +118,7 @@
 // A lazy field has a storage entry, [name], which holds the value, and a
 // getter ([getterName]) to access the field. If the field wasn't set before
 // the first access, it is initialized with the [initializer].
-function lazy(holder, name, getterName, initializer) {
+function lazyOld(holder, name, getterName, initializer) {
   var uninitializedSentinel = holder;
   holder[name] = uninitializedSentinel;
   holder[getterName] = function() {
@@ -149,6 +149,32 @@
   };
 }
 
+// Creates a lazy field that uses non-nullable initialization semantics.
+//
+// A lazy field has a storage entry, [name], which holds the value, and a
+// getter ([getterName]) to access the field. If the field wasn't set before
+// the first access, it is initialized with the [initializer].
+function lazy(holder, name, getterName, initializer) {
+  var uninitializedSentinel = holder;
+  holder[name] = uninitializedSentinel;
+  holder[getterName] = function() {
+    var result;
+    try {
+      if (holder[name] === uninitializedSentinel) {
+        result = holder[name] = initializer();
+      } else {
+        result = holder[name];
+      }
+    } finally {
+      // Use try-finally, not try-catch/throw as it destroys the stack trace.
+      // TODO(floitsch): for performance reasons the function should probably
+      // be unique for each static.
+      holder[getterName] = function() { return this[name]; };
+    }
+    return result;
+  };
+}
+
 // Given a list, marks it as constant.
 //
 // The runtime ensures that const-lists cannot be modified.
@@ -350,6 +376,7 @@
 
     makeConstList: makeConstList,
     lazy: lazy,
+    lazyOld: lazyOld,
     updateHolder: updateHolder,
     convertToFastObject: convertToFastObject,
     setFunctionNamesIfNecessary: setFunctionNamesIfNecessary,
@@ -1732,7 +1759,9 @@
     for (StaticField field in fields) {
       assert(field.holder.isStaticStateHolder);
       js.Statement statement = js.js.statement("#(#, #, #, #);", [
-        locals.find('_lazy', 'hunkHelpers.lazy'),
+        field.usesNonNullableInitialization
+            ? locals.find('_lazy', 'hunkHelpers.lazy')
+            : locals.find('_lazyOld', 'hunkHelpers.lazyOld'),
         field.holder.name,
         js.quoteName(field.name),
         js.quoteName(field.getterName),
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index c4437cd..2db2f31 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -148,8 +148,8 @@
       IndexedLibrary oldLibrary = _elementMap.libraries.getEntity(libraryIndex);
       KLibraryEnv oldEnv = _elementMap.libraries.getEnv(oldLibrary);
       KLibraryData data = _elementMap.libraries.getData(oldLibrary);
-      IndexedLibrary newLibrary =
-          new JLibrary(oldLibrary.name, oldLibrary.canonicalUri);
+      IndexedLibrary newLibrary = new JLibrary(oldLibrary.name,
+          oldLibrary.canonicalUri, oldLibrary.isNonNullableByDefault);
       JLibraryEnv newEnv = oldEnv.convert(_elementMap, liveMemberUsage);
       libraryMap[oldEnv.library] =
           libraries.register<IndexedLibrary, JLibraryData, JLibraryEnv>(
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 4929d21..05a965f 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -24,16 +24,19 @@
   final String name;
   @override
   final Uri canonicalUri;
+  @override
+  final bool isNonNullableByDefault;
 
-  JLibrary(this.name, this.canonicalUri);
+  JLibrary(this.name, this.canonicalUri, this.isNonNullableByDefault);
 
   /// Deserializes a [JLibrary] object from [source].
   factory JLibrary.readFromDataSource(DataSource source) {
     source.begin(tag);
     String name = source.readString();
     Uri canonicalUri = source.readUri();
+    bool isNonNullableByDefault = source.readBool();
     source.end(tag);
-    return new JLibrary(name, canonicalUri);
+    return new JLibrary(name, canonicalUri, isNonNullableByDefault);
   }
 
   /// Serializes this [JLibrary] to [sink].
@@ -41,6 +44,7 @@
     sink.begin(tag);
     sink.writeString(name);
     sink.writeUri(canonicalUri);
+    sink.writeBool(isNonNullableByDefault);
     sink.end(tag);
   }
 
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index c6aa102..891c462 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -127,7 +127,7 @@
       name = name.substring(4);
     } else if (name.startsWith('set:')) {
       kind = invocationMirrorSetterKind;
-      name = name.substring(4) + '=';
+      name = name.substring(4);
     } else {
       kind = invocationMirrorMethodKind;
     }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 0c1c106..5977113 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1191,7 +1191,8 @@
       String path = canonicalUri.path;
       name = path.substring(path.lastIndexOf('/') + 1);
     }
-    IndexedLibrary library = createLibrary(name, canonicalUri);
+    IndexedLibrary library =
+        createLibrary(name, canonicalUri, node.isNonNullableByDefault);
     return libraries.register(library, new KLibraryData(node),
         libraryEnv ?? env.lookupLibrary(canonicalUri));
   }
@@ -1597,8 +1598,9 @@
         isJsInterop: isJsInterop);
   }
 
-  IndexedLibrary createLibrary(String name, Uri canonicalUri) {
-    return new KLibrary(name, canonicalUri);
+  IndexedLibrary createLibrary(
+      String name, Uri canonicalUri, bool isNonNullableByDefault) {
+    return new KLibrary(name, canonicalUri, isNonNullableByDefault);
   }
 
   IndexedClass createClass(LibraryEntity library, String name,
diff --git a/pkg/compiler/lib/src/kernel/kelements.dart b/pkg/compiler/lib/src/kernel/kelements.dart
index 0257c08..8356cb5 100644
--- a/pkg/compiler/lib/src/kernel/kelements.dart
+++ b/pkg/compiler/lib/src/kernel/kelements.dart
@@ -17,8 +17,10 @@
   final String name;
   @override
   final Uri canonicalUri;
+  @override
+  final bool isNonNullableByDefault;
 
-  KLibrary(this.name, this.canonicalUri);
+  KLibrary(this.name, this.canonicalUri, this.isNonNullableByDefault);
 
   @override
   String toString() => '${kElementPrefix}library($name)';
diff --git a/pkg/compiler/test/analyses/dart2js_allowed.json b/pkg/compiler/test/analyses/dart2js_allowed.json
index c916d07..1096f17 100644
--- a/pkg/compiler/test/analyses/dart2js_allowed.json
+++ b/pkg/compiler/test/analyses/dart2js_allowed.json
@@ -219,10 +219,7 @@
   "pkg/compiler/lib/src/inferrer/type_graph_nodes.dart": {
     "Dynamic invocation of 'add'.": 1,
     "Dynamic invocation of 'remove'.": 1,
-    "Dynamic access of 'type'.": 4,
-    "Dynamic invocation of 'containsOnlyInt'.": 1,
-    "Dynamic access of 'isEmpty'.": 1,
-    "Dynamic invocation of 'satisfies'.": 2
+    "Dynamic access of 'type'.": 4
   },
   "pkg/compiler/lib/src/inferrer/locals_handler.dart": {
     "Dynamic access of 'isEmpty'.": 1,
diff --git a/pkg/compiler/test/codegen/expect_annotations_test.dart b/pkg/compiler/test/codegen/expect_annotations_test.dart
index f25bec8..5fc56d7 100644
--- a/pkg/compiler/test/codegen/expect_annotations_test.dart
+++ b/pkg/compiler/test/codegen/expect_annotations_test.dart
@@ -9,6 +9,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/inferrer/types.dart';
 import 'package:compiler/src/world.dart' show JClosedWorld;
@@ -46,6 +47,7 @@
       memorySourceFiles: MEMORY_SOURCE_FILES, options: [Flags.testMode]);
   Compiler compiler = result.compiler;
   JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+  AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
   Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
 
   void testTypeMatch(FunctionEntity function, TypeMask expectedParameterType,
@@ -54,12 +56,12 @@
         closedWorld.globalLocalsMap, function, (Local parameter) {
       TypeMask type = results.resultOfParameter(parameter);
       Expect.equals(
-          expectedParameterType, simplify(type, closedWorld), "$parameter");
+          expectedParameterType, simplify(type, commonMasks), "$parameter");
     });
     if (expectedReturnType != null) {
       TypeMask type = results.resultOfMember(function).returnType;
       Expect.equals(
-          expectedReturnType, simplify(type, closedWorld), "$function");
+          expectedReturnType, simplify(type, commonMasks), "$function");
     }
   }
 
diff --git a/pkg/compiler/test/inference/list_tracer_test.dart b/pkg/compiler/test/inference/list_tracer_test.dart
index f63d8c1..9658374 100644
--- a/pkg/compiler/test/inference/list_tracer_test.dart
+++ b/pkg/compiler/test/inference/list_tracer_test.dart
@@ -220,7 +220,7 @@
     var element = findMember(closedWorld, name);
     ContainerTypeMask mask = results.resultOfMember(element).type;
     if (nullify) type = type.nullable();
-    Expect.equals(type, simplify(mask.elementType, closedWorld), name);
+    Expect.equals(type, simplify(mask.elementType, commonMasks), name);
   }
 
   checkType('listInField', commonMasks.numType);
diff --git a/pkg/compiler/test/inference/map_tracer_test.dart b/pkg/compiler/test/inference/map_tracer_test.dart
index 77f899e..4cb4c1e 100644
--- a/pkg/compiler/test/inference/map_tracer_test.dart
+++ b/pkg/compiler/test/inference/map_tracer_test.dart
@@ -252,13 +252,13 @@
   checkType(String name, keyType, valueType) {
     MemberEntity element = findMember(closedWorld, name);
     MapTypeMask mask = results.resultOfMember(element).type;
-    Expect.equals(keyType, simplify(mask.keyType, closedWorld), name);
-    Expect.equals(valueType, simplify(mask.valueType, closedWorld), name);
+    Expect.equals(keyType, simplify(mask.keyType, commonMasks), name);
+    Expect.equals(valueType, simplify(mask.valueType, commonMasks), name);
   }
 
-  K(TypeMask other) => simplify(keyType.union(other, closedWorld), closedWorld);
+  K(TypeMask other) => simplify(keyType.union(other, commonMasks), commonMasks);
   V(TypeMask other) =>
-      simplify(valueType.union(other, closedWorld), closedWorld).nullable();
+      simplify(valueType.union(other, commonMasks), commonMasks).nullable();
 
   checkType('mapInField', K(aKeyType), V(commonMasks.numType));
   checkType('mapPassedToMethod', K(aKeyType), V(commonMasks.numType));
diff --git a/pkg/compiler/test/inference/type_combination_test.dart b/pkg/compiler/test/inference/type_combination_test.dart
index e7f96a5..b949eba 100644
--- a/pkg/compiler/test/inference/type_combination_test.dart
+++ b/pkg/compiler/test/inference/type_combination_test.dart
@@ -9,6 +9,7 @@
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/world.dart';
 import 'type_mask_test_helper.dart';
@@ -109,8 +110,9 @@
 }
 
 void testUnion(JClosedWorld closedWorld) {
+  AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
   RuleSet ruleSet = new RuleSet(
-      'union', (t1, t2) => simplify(t1.union(t2, closedWorld), closedWorld));
+      'union', (t1, t2) => simplify(t1.union(t2, commonMasks), commonMasks));
   rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
   check(type1, type2, predicate) => ruleSet.check(type1, type2, predicate);
 
@@ -420,8 +422,8 @@
 }
 
 void testIntersection(JClosedWorld closedWorld) {
-  RuleSet ruleSet =
-      new RuleSet('intersection', (t1, t2) => t1.intersection(t2, closedWorld));
+  RuleSet ruleSet = new RuleSet('intersection',
+      (t1, t2) => t1.intersection(t2, closedWorld.abstractValueDomain));
   rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
 
   rule(emptyType, emptyType, emptyType);
@@ -737,8 +739,10 @@
 void testRegressions(JClosedWorld closedWorld) {
   TypeMask nonNullPotentialString =
       new TypeMask.nonNullSubtype(patternClass, closedWorld);
-  Expect.equals(potentialString,
-      jsStringOrNull.union(nonNullPotentialString, closedWorld));
+  Expect.equals(
+      potentialString,
+      jsStringOrNull.union(
+          nonNullPotentialString, closedWorld.abstractValueDomain));
 }
 
 void main() {
diff --git a/pkg/compiler/test/inference/type_mask2_test.dart b/pkg/compiler/test/inference/type_mask2_test.dart
index c4d5bef..e5056f8 100644
--- a/pkg/compiler/test/inference/type_mask2_test.dart
+++ b/pkg/compiler/test/inference/type_mask2_test.dart
@@ -10,6 +10,7 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/world.dart' show JClosedWorld;
 import '../helpers/type_test_helper.dart';
@@ -32,26 +33,27 @@
     List<FlatTypeMask> disjointMasks,
     FlatTypeMask flattened,
     List<ClassEntity> containedClasses}) {
+  AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
   bool isNullable = masks.any((FlatTypeMask mask) => mask.isNullable);
   List<FlatTypeMask> disjoint = <FlatTypeMask>[];
-  UnionTypeMask.unionOfHelper(masks, disjoint, closedWorld);
+  UnionTypeMask.unionOfHelper(masks, disjoint, commonMasks);
   Expect.listEquals(disjointMasks, disjoint,
       'Unexpected disjoint masks: $disjoint, expected $disjointMasks.');
   if (flattened == null) {
     Expect.throws(
-        () => UnionTypeMask.flatten(disjoint, isNullable, closedWorld),
+        () => UnionTypeMask.flatten(disjoint, isNullable, commonMasks),
         (e) => e is ArgumentError,
         'Expect argument error on flattening of $disjoint.');
   } else {
     TypeMask flattenResult =
-        UnionTypeMask.flatten(disjoint, isNullable, closedWorld);
+        UnionTypeMask.flatten(disjoint, isNullable, commonMasks);
     Expect.equals(
         flattened,
         flattenResult,
         'Unexpected flattening of $disjoint: '
         '$flattenResult, expected $flattened.');
   }
-  dynamic union = UnionTypeMask.unionOf(masks, closedWorld);
+  dynamic union = UnionTypeMask.unionOf(masks, commonMasks);
   if (result == null) {
     Expect.isTrue(union is UnionTypeMask,
         'Expected union of $masks to be a union-type: $union.');
diff --git a/pkg/compiler/test/inference/type_mask_disjoint_test.dart b/pkg/compiler/test/inference/type_mask_disjoint_test.dart
index 13732c5..519770c 100644
--- a/pkg/compiler/test/inference/type_mask_disjoint_test.dart
+++ b/pkg/compiler/test/inference/type_mask_disjoint_test.dart
@@ -9,6 +9,7 @@
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/world.dart';
 
@@ -48,6 +49,7 @@
     Compiler compiler = result.compiler;
     JClosedWorld world = compiler.backendClosedWorldForTesting;
     ElementEnvironment elementEnvironment = world.elementEnvironment;
+    AbstractValueDomain commonMasks = world.abstractValueDomain;
 
     /// Checks the expectation of `isDisjoint` for two mask. Also checks that
     /// the result is consistent with an equivalent (but slower) implementation
@@ -56,9 +58,9 @@
       print('masks: $m1 $m2');
       Expect.equals(areDisjoint, m1.isDisjoint(m2, world));
       Expect.equals(areDisjoint, m2.isDisjoint(m1, world));
-      var i1 = m1.intersection(m2, world);
+      var i1 = m1.intersection(m2, commonMasks);
       Expect.equals(areDisjoint, i1.isEmpty && !i1.isNullable);
-      var i2 = m2.intersection(m1, world);
+      var i2 = m2.intersection(m1, commonMasks);
       Expect.equals(areDisjoint, i2.isEmpty && !i2.isNullable);
     }
 
@@ -123,8 +125,10 @@
     checkUnions(List<String> descriptors1, List<String> descriptors2,
         {areDisjoint: true}) {
       print('[$descriptors1] & [$descriptors2]');
-      var m1 = new TypeMask.unionOf(descriptors1.map(maskOf).toList(), world);
-      var m2 = new TypeMask.unionOf(descriptors2.map(maskOf).toList(), world);
+      var m1 =
+          new TypeMask.unionOf(descriptors1.map(maskOf).toList(), commonMasks);
+      var m2 =
+          new TypeMask.unionOf(descriptors2.map(maskOf).toList(), commonMasks);
       checkMask(m1, m2, areDisjoint: areDisjoint);
     }
 
diff --git a/pkg/compiler/test/inference/type_mask_test.dart b/pkg/compiler/test/inference/type_mask_test.dart
index d11d26d..ea40214 100644
--- a/pkg/compiler/test/inference/type_mask_test.dart
+++ b/pkg/compiler/test/inference/type_mask_test.dart
@@ -8,6 +8,7 @@
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/world.dart';
 import 'package:expect/expect.dart';
@@ -32,6 +33,7 @@
     Expect.isTrue(result.isSuccess);
     Compiler compiler = result.compiler;
     JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
     ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
 
     dynamic classA =
@@ -54,16 +56,16 @@
     var subclassObject = new TypeMask.nonNullSubclass(
         closedWorld.commonElements.objectClass, closedWorld);
 
-    var unionABC = UnionTypeMask.unionOf([exactA, exactB, exactC], closedWorld);
+    var unionABC = UnionTypeMask.unionOf([exactA, exactB, exactC], commonMasks);
     var unionABnC =
-        UnionTypeMask.unionOf([exactA, exactB.nullable(), exactC], closedWorld);
-    var unionAB = UnionTypeMask.unionOf([exactA, exactB], closedWorld);
-    var unionSubtypeAC = UnionTypeMask.unionOf([subtypeA, exactC], closedWorld);
+        UnionTypeMask.unionOf([exactA, exactB.nullable(), exactC], commonMasks);
+    var unionAB = UnionTypeMask.unionOf([exactA, exactB], commonMasks);
+    var unionSubtypeAC = UnionTypeMask.unionOf([subtypeA, exactC], commonMasks);
     var unionSubclassAC =
-        UnionTypeMask.unionOf([subclassA, exactC], closedWorld);
-    var unionBCD = UnionTypeMask.unionOf([exactB, exactC, exactD], closedWorld);
+        UnionTypeMask.unionOf([subclassA, exactC], commonMasks);
+    var unionBCD = UnionTypeMask.unionOf([exactB, exactC, exactD], commonMasks);
     var unionBCDn =
-        UnionTypeMask.unionOf([exactB, exactC, exactD.nullable()], closedWorld);
+        UnionTypeMask.unionOf([exactB, exactC, exactD.nullable()], commonMasks);
 
     Expect.isFalse(unionABC.isNullable);
     Expect.isTrue(unionABnC.isNullable);
diff --git a/pkg/compiler/test/inference/type_mask_test_helper.dart b/pkg/compiler/test/inference/type_mask_test_helper.dart
index 3225032..9e5d665 100644
--- a/pkg/compiler/test/inference/type_mask_test_helper.dart
+++ b/pkg/compiler/test/inference/type_mask_test_helper.dart
@@ -11,12 +11,12 @@
 
 export 'package:compiler/src/inferrer/types.dart';
 
-TypeMask simplify(TypeMask mask, JClosedWorld closedWorld) {
+TypeMask simplify(TypeMask mask, CommonMasks commonMasks) {
   if (mask is ForwardingTypeMask) {
-    return simplify(mask.forwardTo, closedWorld);
+    return simplify(mask.forwardTo, commonMasks);
   } else if (mask is UnionTypeMask) {
     return UnionTypeMask.flatten(
-        mask.disjointMasks, mask.isNullable, closedWorld);
+        mask.disjointMasks, mask.isNullable, commonMasks);
   } else {
     return mask;
   }
diff --git a/pkg/compiler/test/inference/union_type_test.dart b/pkg/compiler/test/inference/union_type_test.dart
index 710264a..62b8bd4 100644
--- a/pkg/compiler/test/inference/union_type_test.dart
+++ b/pkg/compiler/test/inference/union_type_test.dart
@@ -6,6 +6,7 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import "package:compiler/src/world.dart";
 import '../helpers/type_test_helper.dart';
@@ -22,10 +23,11 @@
       }
       """, testBackendWorld: true);
     JClosedWorld world = env.jClosedWorld;
+    AbstractValueDomain commonMasks = world.abstractValueDomain;
     FlatTypeMask mask1 = new FlatTypeMask.exact(env.getClass('A'), world);
     FlatTypeMask mask2 = new FlatTypeMask.exact(env.getClass('B'), world);
-    UnionTypeMask union1 = mask1.nonNullable().union(mask2, world);
-    UnionTypeMask union2 = mask2.nonNullable().union(mask1, world);
+    UnionTypeMask union1 = mask1.nonNullable().union(mask2, commonMasks);
+    UnionTypeMask union2 = mask2.nonNullable().union(mask1, commonMasks);
     Expect.equals(union1, union2);
   }
 
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index 16c322e..7b922fd 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dart_internal
-version: 0.1.9
+version: 0.1.10
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
@@ -16,4 +16,4 @@
 environment:
   # Restrict the upper bound so that we can remove support for this in a later
   # version of the SDK without it being a breaking change.
-  sdk: ">=2.0.0-dev.12.0 <2.9.0"
+  sdk: ">=2.0.0-dev.12.0 <2.10.0"
diff --git a/pkg/dartdev/README.md b/pkg/dartdev/README.md
index 6be1917..f2662cc 100644
--- a/pkg/dartdev/README.md
+++ b/pkg/dartdev/README.md
@@ -24,8 +24,17 @@
 Run "dart help <command>" for more information about a command.
 ```
 
+## Contributing
+
+If you'd like to contribute to the Dart CLI tool, please start by reading the
+[contribution guidelines][contributing] for the Dart project. Then familiarize
+yourself with the [design principles][design] that guide this tool's UX.
+
 ## Features and bugs
 
-Please file feature requests and bugs in the Dart SDK [issue tracker][tracker] with label `area-dart-cli`.
+Please file feature requests and bugs in the Dart SDK [issue tracker][tracker]
+with label `area-dart-cli`.
 
+[contributing]: https://github.com/dart-lang/sdk/blob/master/CONTRIBUTING.md
+[design] https://github.com/dart-lang/sdk/blob/master/pkg/dartdev/doc/design.md
 [tracker]: https://github.com/dart-lang/sdk/labels/area-dart-cli
diff --git a/pkg/dartdev/doc/design.md b/pkg/dartdev/doc/design.md
new file mode 100644
index 0000000..328ead6
--- /dev/null
+++ b/pkg/dartdev/doc/design.md
@@ -0,0 +1,20 @@
+# Design Principles
+
+The purpose of this document is to capture the design principles that should be
+followed when designing new commands or updating existing ones. The goal is to
+ensure that the dartdev tool provides a consistent UX.
+
+## Status
+
+This is a work in progress. At the moment we are just capturing the ideas that
+are coming out of discussions. They will need to be organized and more fully
+documented at some point.
+
+## Command Arguments
+
+### Default Target
+
+If the command cannot have side effects (such as analyze) then the argument for
+what to operate on should default to the CWD, but if the command can have side
+effects (such as format or fix) then the argument for what to operate on should
+be required.
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index b21d5ab..0b4e5f9 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -189,6 +189,8 @@
     addCommand(AnalyzeCommand());
     addCommand(CreateCommand(verbose: verbose));
     addCommand(CompileCommand());
+// Enable experimental `fix` command
+//    addCommand(FixCommand());
     addCommand(FormatCommand());
     addCommand(MigrateCommand(verbose: verbose));
     addCommand(PubCommand());
diff --git a/pkg/dartdev/lib/src/commands/analyze_impl.dart b/pkg/dartdev/lib/src/commands/analyze_impl.dart
index 0918864..bc3a7bd 100644
--- a/pkg/dartdev/lib/src/commands/analyze_impl.dart
+++ b/pkg/dartdev/lib/src/commands/analyze_impl.dart
@@ -6,6 +6,8 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:analysis_server_client/protocol.dart'
+    show EditBulkFixesResult, ResponseDecoder;
 import 'package:path/path.dart' as path;
 
 import '../core.dart';
@@ -22,18 +24,24 @@
   Process _process;
   final StreamController<bool> _analyzingController =
       StreamController<bool>.broadcast();
+  final StreamController<EditBulkFixesResult> _bulkFixesController =
+      StreamController<EditBulkFixesResult>.broadcast();
   final StreamController<FileAnalysisErrors> _errorsController =
       StreamController<FileAnalysisErrors>.broadcast();
   bool _didServerErrorOccur = false;
 
   int _id = 0;
 
+  String _fixRequestId;
+
   bool get didServerErrorOccur => _didServerErrorOccur;
 
   Stream<bool> get onAnalyzing => _analyzingController.stream;
 
   Stream<FileAnalysisErrors> get onErrors => _errorsController.stream;
 
+  Stream<EditBulkFixesResult> get onBulkFixes => _bulkFixesController.stream;
+
   Future<int> get onExit => _process.exitCode;
 
   Future<void> start() async {
@@ -81,6 +89,13 @@
     });
   }
 
+  void requestBulkFixes(String filePath) {
+    _sendCommand('edit.bulkFixes', <String, dynamic>{
+      'included': [path.canonicalize(filePath)],
+    });
+    _fixRequestId = _id.toString();
+  }
+
   void _sendCommand(String method, Map<String, dynamic> params) {
     final String message = json.encode(<String, dynamic>{
       'id': (++_id).toString(),
@@ -123,6 +138,11 @@
         }
         // Dispose of the process at this point so the process doesn't hang.
         dispose();
+      } else if (response['id'] == _fixRequestId) {
+        var decoder = ResponseDecoder(null);
+        var result =
+            EditBulkFixesResult.fromJson(decoder, 'result', response['result']);
+        _bulkFixesController.add(result);
       }
     }
   }
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 87f9480..1a804bd 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -11,6 +11,7 @@
 
 import '../core.dart';
 import '../sdk.dart';
+import '../vm_interop_handler.dart';
 
 const int compileErrorExitCode = 64;
 
@@ -65,6 +66,19 @@
 
   @override
   FutureOr<int> run() async {
+    if (!Sdk.checkArtifactExists(sdk.dart2js)) {
+      return 255;
+    }
+    final String librariesPath = path.absolute(
+      sdk.sdkPath,
+      'lib',
+      'libraries.json',
+    );
+
+    if (!Sdk.checkArtifactExists(librariesPath)) {
+      return 255;
+    }
+
     // We expect a single rest argument; the dart entry point.
     if (argResults.rest.length != 1) {
       log.stderr('Missing Dart entry point.');
@@ -76,9 +90,11 @@
       return -1;
     }
 
-    final process = await startProcess(sdk.dart2js, argResults.arguments);
-    routeToStdout(process);
-    return process.exitCode;
+    VmInteropHandler.run(sdk.dart2js, [
+      '--libraries-spec=$librariesPath',
+      ...argResults.arguments,
+    ]);
+    return 0;
   }
 }
 
@@ -135,6 +151,7 @@
     args.add(path.canonicalize(sourcePath));
 
     log.stdout('Compiling $sourcePath to $commandName file $outputFile.');
+    // TODO(bkonyi): perform compilation in same process.
     final process = await startProcess(sdk.dart, args);
     routeToStdout(process);
     return process.exitCode;
@@ -176,6 +193,10 @@
 
   @override
   FutureOr<int> run() async {
+    if (!Sdk.checkArtifactExists(genKernel) ||
+        !Sdk.checkArtifactExists(genSnapshot)) {
+      return 255;
+    }
     // We expect a single rest argument; the dart entry point.
     if (argResults.rest.length != 1) {
       log.stderr('Missing Dart entry point.');
diff --git a/pkg/dartdev/lib/src/commands/create.dart b/pkg/dartdev/lib/src/commands/create.dart
index 55d53d8..2a2d424 100644
--- a/pkg/dartdev/lib/src/commands/create.dart
+++ b/pkg/dartdev/lib/src/commands/create.dart
@@ -96,6 +96,9 @@
     );
 
     if (argResults['pub']) {
+      if (!Sdk.checkArtifactExists(sdk.pub)) {
+        return 255;
+      }
       log.stdout('');
       var progress = log.progress('Running pub get');
       var process = await startProcess(
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
new file mode 100644
index 0000000..b0c09b0
--- /dev/null
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server_client/protocol.dart' hide AnalysisError;
+import 'package:path/path.dart' as path;
+
+import '../core.dart';
+import '../sdk.dart';
+import '../utils.dart';
+import 'analyze_impl.dart';
+
+class FixCommand extends DartdevCommand {
+  FixCommand()
+      : super(
+          'fix', 'Fix Dart source code.',
+          // Experimental.
+          hidden: true,
+        );
+
+  @override
+  FutureOr<int> run() async {
+    log.stdout('\n*** The `fix` command is provisional and subject to change '
+        'or removal in future releases. ***\n');
+
+    if (argResults.rest.length > 1) {
+      usageException('Only one file or directory is expected.');
+    }
+
+    var dir = argResults.rest.isEmpty
+        ? Directory.current
+        : Directory(argResults.rest.single);
+    if (!dir.existsSync()) {
+      usageException("Directory doesn't exist: ${dir.path}");
+    }
+
+    var bulkFixCompleter = Completer<void>();
+    var progress =
+        log.progress('Computing fixes in ${path.basename(dir.path)}');
+
+    var server = AnalysisServer(
+      Directory(sdk.sdkPath),
+      [dir],
+    );
+
+    await server.start();
+    //ignore: unawaited_futures
+    server.onExit.then((int exitCode) {
+      if (!bulkFixCompleter.isCompleted) {
+        bulkFixCompleter.completeError('analysis server exited: $exitCode');
+      }
+    });
+
+    List<SourceFileEdit> edits;
+    server.onBulkFixes.listen((EditBulkFixesResult fixes) {
+      edits = fixes.edits;
+      bulkFixCompleter.complete();
+    });
+    server.requestBulkFixes(dir.absolute.path);
+
+    await bulkFixCompleter.future;
+    await server.dispose();
+    progress.finish(showTiming: true);
+
+    if (edits.isEmpty) {
+      log.stdout('Nothing to fix!');
+    } else {
+      // todo (pq): consider a summary if more than `n` fixes are applied
+      //  (look at `dartfmt`)
+      log.stdout('Applying fixes to:');
+      for (var edit in edits) {
+        var file = File(edit.file);
+        log.stdout('  ${relativePath(file.path, dir)}');
+        var code = file.existsSync() ? file.readAsStringSync() : '';
+        code = SourceEdit.applySequence(code, edit.edits);
+        file.writeAsStringSync(code);
+      }
+      log.stdout('Done.');
+    }
+
+    return 0;
+  }
+}
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index c062eb6..94ca988 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:args/args.dart';
 
 import '../core.dart';
 import '../experiments.dart';
 import '../sdk.dart';
+import '../vm_interop_handler.dart';
 
 class PubCommand extends DartdevCommand<int> {
   PubCommand() : super('pub', 'Work with packages.');
@@ -22,26 +22,23 @@
     // Override [printUsage] for invocations of 'dart help pub' which won't
     // execute [run] below.  Without this, the 'dart help pub' reports the
     // command pub with no commands or flags.
+    if (!Sdk.checkArtifactExists(sdk.pub)) {
+      return;
+    }
     final command = sdk.pub;
     final args = ['help'];
 
     log.trace('$command ${args.first}');
 
     // Call 'pub help'
-    // Process.runSync(..) is used since [printUsage] is not an async method,
-    // and we want to guarantee that the result (the help text for the console)
-    // is printed before command exits.
-    final result = Process.runSync(command, args);
-    if (result.stderr.isNotEmpty) {
-      stderr.write(result.stderr);
-    }
-    if (result.stdout.isNotEmpty) {
-      stdout.write(result.stdout);
-    }
+    VmInteropHandler.run(command, args);
   }
 
   @override
   FutureOr<int> run() async {
+    if (!Sdk.checkArtifactExists(sdk.pub)) {
+      return 255;
+    }
     final command = sdk.pub;
     var args = argResults.arguments;
 
@@ -65,12 +62,7 @@
     }
 
     log.trace('$command ${args.join(' ')}');
-
-    // Starting in ProcessStartMode.inheritStdio mode means the child process
-    // can detect support for ansi chars.
-    var process =
-        await Process.start(command, args, mode: ProcessStartMode.inheritStdio);
-
-    return process.exitCode;
+    VmInteropHandler.run(command, args);
+    return 0;
   }
 }
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index 9649377..d118dbc 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -119,24 +119,33 @@
     // service intermediary which implements the VM service protocol and
     // provides non-VM specific extensions (e.g., log caching, client
     // synchronization).
+    // TODO(bkonyi): Handle race condition made possible by Observatory
+    // listening message being printed to console before DDS is started.
+    // See https://github.com/dart-lang/sdk/issues/42727
+    launchDds = false;
     _DebuggingSession debugSession;
     if (launchDds) {
       debugSession = _DebuggingSession();
-      await debugSession.start();
+      if (!await debugSession.start()) {
+        return 255;
+      }
     }
-
-    final script = Directory.current.uri
-        .resolve(args.firstWhere((e) => !e.startsWith('-')))
-        .toFilePath();
+    final path = args.firstWhere((e) => !e.startsWith('-'));
     final runArgs = args.length == 1 ? <String>[] : args.sublist(1);
-    VmInteropHandler.run(script, runArgs);
+    VmInteropHandler.run(path, runArgs);
     return 0;
   }
 }
 
 class _DebuggingSession {
-  Future<void> start() async {
+  Future<bool> start() async {
     final serviceInfo = await Service.getInfo();
+    final ddsSnapshot = (dirname(sdk.dart).endsWith('bin'))
+        ? sdk.ddsSnapshot
+        : absolute(dirname(sdk.dart), 'gen', 'dds.dart.snapshot');
+    if (!Sdk.checkArtifactExists(ddsSnapshot)) {
+      return false;
+    }
     final process = await Process.start(
         sdk.dart,
         [
@@ -157,5 +166,6 @@
     });
 
     await completer.future;
+    return true;
   }
 }
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index ccc8268..cf40ee1 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:args/args.dart';
 
 import '../core.dart';
 import '../experiments.dart';
 import '../sdk.dart';
+import '../vm_interop_handler.dart';
 
 class TestCommand extends DartdevCommand<int> {
   TestCommand() : super('test', 'Runs tests in this project.');
@@ -19,29 +19,34 @@
 
   @override
   void printUsage() {
+    if (!Sdk.checkArtifactExists(sdk.pub)) {
+      return;
+    }
+    if ((project.packageConfig != null) &&
+        !project.packageConfig.hasDependency('test')) {
+      _printPackageTestInstructions();
+    }
     final command = sdk.pub;
     final args = ['run', 'test', '--help'];
 
     log.trace('$command ${args.join(' ')}');
-
-    final result = Process.runSync(command, args);
-    if (result.stderr.isNotEmpty) {
-      stderr.write(result.stderr);
-    }
-    if (result.stdout.isNotEmpty) {
-      stdout.write(result.stdout);
-    }
-
-    // "Could not find package "test". Did you forget to add a dependency?"
-    if (result.exitCode == 65 && project.hasPackageConfigFile) {
-      if (!project.packageConfig.hasDependency('test')) {
-        _printPackageTestInstructions();
-      }
-    }
+    VmInteropHandler.run(command, args);
   }
 
   @override
   FutureOr<int> run() async {
+    if (!Sdk.checkArtifactExists(sdk.pub)) {
+      return 255;
+    }
+    // "Could not find package "test". Did you forget to add a dependency?"
+    if (project.hasPackageConfigFile) {
+      if ((project.packageConfig != null) &&
+          !project.packageConfig.hasDependency('test')) {
+        _printPackageTestInstructions();
+        return 65;
+      }
+    }
+
     final command = sdk.pub;
     final testArgs = argResults.arguments.toList();
 
@@ -54,22 +59,8 @@
     ];
 
     log.trace('$command ${args.join(' ')}');
-
-    // Starting in ProcessStartMode.inheritStdio mode means the child process
-    // can detect support for ansi chars.
-    var process =
-        await Process.start(command, args, mode: ProcessStartMode.inheritStdio);
-
-    int exitCode = await process.exitCode;
-
-    // "Could not find package "test". Did you forget to add a dependency?"
-    if (exitCode == 65 && project.hasPackageConfigFile) {
-      if (!project.packageConfig.hasDependency('test')) {
-        _printPackageTestInstructions();
-      }
-    }
-
-    return exitCode;
+    VmInteropHandler.run(command, args);
+    return 0;
   }
 
   void _printPackageTestInstructions() {
diff --git a/pkg/dartdev/lib/src/sdk.dart b/pkg/dartdev/lib/src/sdk.dart
index 537089f..ec20cc8 100644
--- a/pkg/dartdev/lib/src/sdk.dart
+++ b/pkg/dartdev/lib/src/sdk.dart
@@ -6,6 +6,8 @@
 
 import 'package:path/path.dart' as path;
 
+import 'core.dart';
+
 final Sdk sdk = Sdk();
 
 String get _computeSdkPath {
@@ -46,17 +48,48 @@
   String get dart => Platform.resolvedExecutable;
 
   String get analysisServerSnapshot => path.absolute(
-      sdkPath, 'bin', 'snapshots', 'analysis_server.dart.snapshot');
+        sdkPath,
+        'bin',
+        'snapshots',
+        'analysis_server.dart.snapshot',
+      );
 
-  String get dart2js => path.absolute(sdkPath, 'bin', _binName('dart2js'));
+  String get dart2js => path.absolute(
+        sdkPath,
+        'bin',
+        'snapshots',
+        'dart2js.dart.snapshot',
+      );
 
-  String get dartfmt => path.absolute(sdkPath, 'bin', _binName('dartfmt'));
+  String get dartfmt => path.absolute(
+        sdkPath,
+        'bin',
+        _binName('dartfmt'),
+      );
 
-  String get ddsSnapshot =>
-      path.absolute(sdkPath, 'bin', 'snapshots', 'dds.dart.snapshot');
+  String get ddsSnapshot => path.absolute(
+        sdkPath,
+        'bin',
+        'snapshots',
+        'dds.dart.snapshot',
+      );
 
-  String get pub => path.absolute(sdkPath, 'bin', _binName('pub'));
+  String get pub => path.absolute(
+        sdkPath,
+        'bin',
+        'snapshots',
+        'pub.dart.snapshot',
+      );
 
   static String _binName(String base) =>
       Platform.isWindows ? '$base.bat' : base;
+
+  static bool checkArtifactExists(String path) {
+    if (!File(path).existsSync()) {
+      log.stderr('Could not find $path. Have you built the full '
+          'Dart SDK?');
+      return false;
+    }
+    return true;
+  }
 }
diff --git a/pkg/dartdev/lib/src/utils.dart b/pkg/dartdev/lib/src/utils.dart
index a4ec262..be9dcfb 100644
--- a/pkg/dartdev/lib/src/utils.dart
+++ b/pkg/dartdev/lib/src/utils.dart
@@ -8,6 +8,15 @@
 /// Emit the given word with the correct pluralization.
 String pluralize(String word, int count) => count == 1 ? word : '${word}s';
 
+/// Make an absolute [filePath] relative to [dir] (for display purposes).
+String relativePath(String filePath, Directory dir) {
+  var root = dir.absolute.path;
+  if (filePath.startsWith(root)) {
+    return filePath.substring(root.length + 1);
+  }
+  return filePath;
+}
+
 /// String utility to trim some suffix from the end of a [String].
 String trimEnd(String s, String suffix) {
   if (s != null && suffix != null && suffix.isNotEmpty && s.endsWith(suffix)) {
diff --git a/pkg/dartdev/lib/src/vm_interop_handler.dart b/pkg/dartdev/lib/src/vm_interop_handler.dart
index 3a8fea9..fcf419c 100644
--- a/pkg/dartdev/lib/src/vm_interop_handler.dart
+++ b/pkg/dartdev/lib/src/vm_interop_handler.dart
@@ -17,7 +17,8 @@
     final message = List<dynamic>.filled(3, null)
       ..[0] = _kResultRun
       ..[1] = script
-      ..[2] = args;
+      // Copy the list so it doesn't get GC'd underneath us.
+      ..[2] = args.toList();
     _port.send(message);
   }
 
diff --git a/pkg/dartdev/test/commands/fix_test.dart b/pkg/dartdev/test/commands/fix_test.dart
new file mode 100644
index 0000000..4da8ddb
--- /dev/null
+++ b/pkg/dartdev/test/commands/fix_test.dart
@@ -0,0 +1,15 @@
+// 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 '../utils.dart';
+
+void main() {
+  group('fix', defineFix, timeout: longTimeout);
+}
+
+void defineFix() {
+  // todo (pq): add tests when the `fix` command is enabled.
+}
diff --git a/pkg/dartdev/test/smoke/implicit_smoke_test.dart b/pkg/dartdev/test/smoke/implicit_smoke_test.dart
new file mode 100644
index 0000000..95053da
--- /dev/null
+++ b/pkg/dartdev/test/smoke/implicit_smoke_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+const numRuns = 10;
+final script = Platform.script.resolve('smoke.dart').toString();
+
+void main() {
+  group(
+    'implicit dartdev smoke -',
+    () {
+      test('dart smoke.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              script,
+            ],
+          );
+          expect(result.exitCode, 0);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.stderr, isEmpty);
+        }
+      });
+
+      // This test forces dartdev to run implicitly and for
+      // DDS to spawn in a separate process.
+      test('dart --enable-vm-service smoke.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              '--enable-vm-service=0',
+              script,
+            ],
+          );
+          expect(result.exitCode, 0);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.stderr, isEmpty);
+        }
+      });
+    },
+    timeout: Timeout.none,
+  );
+}
diff --git a/pkg/dartdev/test/smoke/invalid_smoke_test.dart b/pkg/dartdev/test/smoke/invalid_smoke_test.dart
new file mode 100644
index 0000000..3c2d61c
--- /dev/null
+++ b/pkg/dartdev/test/smoke/invalid_smoke_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+const numRuns = 10;
+final script = Platform.script.resolve('smoke.dart').toString();
+
+void main() {
+  group(
+    'implicit dartdev smoke -',
+    () {
+      test('dart invalid.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              'invalid.dart',
+            ],
+          );
+          expect(result.exitCode, 64);
+          expect(result.stdout, isEmpty);
+          expect(
+            result.stderr,
+            contains(
+              'Error when reading \'invalid.dart\':'
+              ' No such file or directory',
+            ),
+          );
+        }
+      });
+
+      // This test forces dartdev to run implicitly and for
+      // DDS to spawn in a separate process..
+      test('dart --enable-vm-service invalid.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              '--enable-vm-service=0',
+              'invalid.dart',
+            ],
+          );
+          expect(result.exitCode, 64);
+          expect(result.stdout, contains('Observatory listening'));
+          expect(
+            result.stderr,
+            contains(
+              'Error when reading \'invalid.dart\':'
+              ' No such file or directory',
+            ),
+          );
+        }
+      });
+
+      test('dart run invalid.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              'run',
+              'invalid.dart',
+            ],
+          );
+          expect(result.exitCode, 254);
+          expect(result.stdout, isEmpty);
+          expect(
+            result.stderr,
+            contains(
+              'Error when reading \'invalid.dart\':'
+              ' No such file or directory',
+            ),
+          );
+        }
+      });
+
+      // This test forces DDS to spawn in a separate process.
+      test('dart run --enable-vm-service invalid.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              'run',
+              '--enable-vm-service=0',
+              'invalid.dart',
+            ],
+          );
+          expect(result.exitCode, 254);
+          expect(result.stdout, contains('Observatory listening'));
+          expect(
+            result.stderr,
+            contains(
+              'Error when reading \'invalid.dart\':'
+              ' No such file or directory',
+            ),
+          );
+        }
+      });
+    },
+    timeout: Timeout.none,
+    // TODO(bkonyi): Fails consistently on bots, need to investigate.
+    skip: true,
+  );
+}
diff --git a/pkg/dartdev/test/smoke/smoke.dart b/pkg/dartdev/test/smoke/smoke.dart
new file mode 100644
index 0000000..a6a5181
--- /dev/null
+++ b/pkg/dartdev/test/smoke/smoke.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+void main() {
+  print('Smoke test!');
+}
diff --git a/pkg/dartdev/test/smoke/smoke_test.dart b/pkg/dartdev/test/smoke/smoke_test.dart
new file mode 100644
index 0000000..336db24
--- /dev/null
+++ b/pkg/dartdev/test/smoke/smoke_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+const numRuns = 10;
+final script = Platform.script.resolve('smoke.dart').toString();
+
+void main() {
+  group(
+    'explicit dartdev smoke -',
+    () {
+      test('dart run smoke.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              'run',
+              script,
+            ],
+          );
+          expect(result.exitCode, 0);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.stderr, isEmpty);
+        }
+      });
+
+      // This test forces DDS to spawn in a separate process.
+      test('dart run --enable-vm-service smoke.dart', () async {
+        for (int i = 1; i <= numRuns; ++i) {
+          if (i % 5 == 0) {
+            print('Done [$i/$numRuns]');
+          }
+          final result = await Process.run(
+            Platform.executable,
+            [
+              'run',
+              '--enable-vm-service=0',
+              script,
+            ],
+          );
+          expect(result.exitCode, 0);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.stderr, isEmpty);
+        }
+      });
+    },
+    timeout: Timeout.none,
+  );
+}
diff --git a/pkg/dartdev/test/test_all.dart b/pkg/dartdev/test/test_all.dart
index 153ebb9..0c45d45 100644
--- a/pkg/dartdev/test/test_all.dart
+++ b/pkg/dartdev/test/test_all.dart
@@ -8,6 +8,7 @@
 import 'commands/analyze_test.dart' as analyze;
 import 'commands/compile_test.dart' as compile;
 import 'commands/create_test.dart' as create;
+import 'commands/fix_test.dart' as fix;
 import 'commands/flag_test.dart' as flag;
 import 'commands/format_test.dart' as format;
 import 'commands/help_test.dart' as help;
@@ -24,6 +25,7 @@
     analytics.main();
     analyze.main();
     create.main();
+    fix.main();
     flag.main();
     format.main();
     help.main();
diff --git a/pkg/dartdev/test/utils_test.dart b/pkg/dartdev/test/utils_test.dart
index 1a579c8..199d461 100644
--- a/pkg/dartdev/test/utils_test.dart
+++ b/pkg/dartdev/test/utils_test.dart
@@ -24,6 +24,18 @@
     });
   });
 
+  group('relativePath', () {
+    test('direct', () {
+      var dir = Directory('foo');
+      expect(relativePath('path', dir), 'path');
+    });
+
+    test('nested', () {
+      var dir = Directory('foo');
+      expect(relativePath(join(dir.absolute.path, 'path'), dir), 'path');
+    });
+  });
+
   group('trimEnd', () {
     test('null string', () {
       expect(trimEnd(null, 'suffix'), null);
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 0801c1c..a040dc9 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -5300,11 +5300,11 @@
     // Generate `is` as `dart.is` or `typeof` depending on the RHS type.
     var lhs = _visitExpression(operand);
     var typeofName = _typeRep.typeFor(type).primitiveTypeOf;
-    // Inline primitives other than int (which requires a Math.floor check).
+    // Inline non-nullable primitive types other than int (which requires a
+    // Math.floor check).
     if (typeofName != null &&
-        type != _types.coreTypes.intLegacyRawType &&
-        type != _types.coreTypes.intNonNullableRawType &&
-        type != _types.coreTypes.intNullableRawType) {
+        type.nullability == Nullability.nonNullable &&
+        type != _types.coreTypes.intNonNullableRawType) {
       return js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
     } else {
       return js.call('#.is(#)', [_emitType(type), lhs]);
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 6d31716..33e19e8 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -186,10 +186,8 @@
       return createInvocation('getter', [SymbolLiteral(name.substring(4))]);
     }
     if (name.startsWith('set:')) {
-      return createInvocation('setter', [
-        SymbolLiteral(name.substring(4) + '='),
-        arguments.positional.single
-      ]);
+      return createInvocation('setter',
+          [SymbolLiteral(name.substring(4)), arguments.positional.single]);
     }
     var ctorArgs = <Expression>[
       SymbolLiteral(name),
diff --git a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
index e5b469e..1abf518 100644
--- a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
@@ -3,8 +3,8 @@
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1659|7|5|Superinterfaces don't have a valid override for '>>': JSNumber.>> (num Function(num)), int.>> (int Function(int)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1659|7|5|Superinterfaces don't have a valid override for '\|': JSNumber.\| (num Function(num)), int.\| (int Function(int)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1659|7|5|Superinterfaces don't have a valid override for '^': JSNumber.^ (num Function(num)), int.^ (int Function(int)).
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1676|28|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1678|27|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1681|17|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|18|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|44|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1676|28|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1678|27|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1681|17|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|18|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|44|1|The operator '&' isn't defined for the type 'JSInt'.
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index bc825bc..0696d1c 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -19,6 +19,7 @@
   setLiterals,
   spreadCollections,
   tripleShift,
+  valueClass,
   variance,
 }
 
@@ -32,6 +33,7 @@
 const Version enableSetLiteralsVersion = const Version(2, 2);
 const Version enableSpreadCollectionsVersion = const Version(2, 2);
 const Version enableTripleShiftVersion = const Version(2, 10);
+const Version enableValueClassVersion = const Version(2, 10);
 const Version enableVarianceVersion = const Version(2, 10);
 
 ExperimentalFlag parseExperimentalFlag(String flag) {
@@ -54,6 +56,8 @@
       return ExperimentalFlag.spreadCollections;
     case "triple-shift":
       return ExperimentalFlag.tripleShift;
+    case "value-class":
+      return ExperimentalFlag.valueClass;
     case "variance":
       return ExperimentalFlag.variance;
   }
@@ -70,6 +74,7 @@
   ExperimentalFlag.setLiterals: true,
   ExperimentalFlag.spreadCollections: true,
   ExperimentalFlag.tripleShift: false,
+  ExperimentalFlag.valueClass: false,
   ExperimentalFlag.variance: false,
 };
 
@@ -83,6 +88,7 @@
   ExperimentalFlag.setLiterals: true,
   ExperimentalFlag.spreadCollections: true,
   ExperimentalFlag.tripleShift: false,
+  ExperimentalFlag.valueClass: false,
   ExperimentalFlag.variance: false,
 };
 
@@ -108,6 +114,15 @@
   "collection": {
     ExperimentalFlag.nonNullable,
   },
+  "convert": {
+    ExperimentalFlag.nonNullable,
+  },
+  "crypto": {
+    ExperimentalFlag.nonNullable,
+  },
+  "csslib": {
+    ExperimentalFlag.nonNullable,
+  },
   "dart_internal": {
     ExperimentalFlag.nonNullable,
   },
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index a5f2286..7a7f258 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -857,10 +857,12 @@
       Member noSuchMethodInterface, KernelTarget target, Procedure procedure) {
     String prefix =
         procedure.isGetter ? 'get:' : procedure.isSetter ? 'set:' : '';
+    String invocationName = prefix + procedure.name.name;
+    if (procedure.isSetter) invocationName += '=';
     Expression invocation = target.backendTarget.instantiateInvocation(
         target.loader.coreTypes,
         new ThisExpression(),
-        prefix + procedure.name.name,
+        invocationName,
         new Arguments.forwarded(procedure.function, library.library),
         procedure.fileOffset,
         /*isSuper=*/ false);
@@ -1419,15 +1421,15 @@
     InterfaceType supertype = cls.supertype.asInterfaceType;
     Substitution substitution = Substitution.fromSupertype(cls.mixedInType);
     for (Supertype constraint in cls.mixedInClass.superclassConstraints()) {
-      InterfaceType interface =
+      InterfaceType requiredInterface =
           substitution.substituteSupertype(constraint).asInterfaceType;
-      if (hierarchy.getTypeAsInstanceOf(
-              supertype, interface.classNode, library.library, coreTypes) !=
-          interface) {
+      InterfaceType implementedInterface = hierarchy.getTypeAsInstanceOf(
+          supertype, requiredInterface.classNode, library.library, coreTypes);
+      if (implementedInterface != requiredInterface) {
         library.addProblem(
             templateMixinApplicationIncompatibleSupertype.withArguments(
                 supertype,
-                interface,
+                requiredInterface,
                 cls.mixedInType.asInterfaceType,
                 library.isNonNullableByDefault),
             cls.fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 7bb3453..6927bdd7 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -2197,6 +2197,33 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
+    templateNonNullAwareSpreadIsNull = const Template<
+            Message Function(DartType _type, bool isNonNullableByDefault)>(
+        messageTemplate: r"""Can't spread a value with static type '#type'.""",
+        withArguments: _withArgumentsNonNullAwareSpreadIsNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+    codeNonNullAwareSpreadIsNull =
+    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+  "NonNullAwareSpreadIsNull",
+  templateNonNullAwareSpreadIsNull,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonNullAwareSpreadIsNull(
+    DartType _type, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeNonNullAwareSpreadIsNull,
+      message: """Can't spread a value with static type '${type}'.""" +
+          labeler.originMessages,
+      arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index bce8e77..e6a04b2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -17,6 +17,7 @@
 import 'package:kernel/src/legacy_erasure.dart';
 import 'package:kernel/src/nnbd_top_merge.dart';
 import 'package:kernel/src/norm.dart';
+import 'package:kernel/src/standard_bounds.dart';
 import 'package:kernel/src/types.dart' show Types;
 
 import '../../testing/id_testing_utils.dart' show typeToText;
@@ -67,7 +68,7 @@
 
 import '../source/source_loader.dart' show SourceLoader;
 
-import '../type_inference/standard_bounds.dart' show StandardBounds;
+import '../type_inference/standard_bounds.dart' show TypeSchemaStandardBounds;
 
 import '../type_inference/type_constraint_gatherer.dart'
     show TypeConstraintGatherer;
@@ -512,7 +513,8 @@
     return asSupertypeOf(type, superclass)?.typeArguments;
   }
 
-  InterfaceType getKernelLegacyLeastUpperBound(
+  @override
+  InterfaceType getLegacyLeastUpperBound(
       InterfaceType type1, InterfaceType type2, Library clientLibrary) {
     if (type1 == type2) return type1;
 
@@ -2529,7 +2531,7 @@
 }
 
 class TypeBuilderConstraintGatherer extends TypeConstraintGatherer
-    with StandardBounds {
+    with StandardBounds, TypeSchemaStandardBounds {
   final ClassHierarchyBuilder hierarchy;
 
   TypeBuilderConstraintGatherer(this.hierarchy,
@@ -2587,13 +2589,6 @@
   bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
     return isSubtypeOf(s, t, mode) && isSubtypeOf(t, s, mode);
   }
-
-  @override
-  InterfaceType getLegacyLeastUpperBound(
-      InterfaceType type1, InterfaceType type2, Library clientLibrary) {
-    return hierarchy.getKernelLegacyLeastUpperBound(
-        type1, type2, clientLibrary);
-  }
 }
 
 class DelayedOverrideCheck {
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 415e851..8ed64425 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -600,11 +600,6 @@
         ..fileOffset = node.readOffset;
     }
 
-    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
-        node.binaryOffset, read, readType, node.binaryName, node.rhs);
-    Expression binary = binaryResult.expression;
-    DartType binaryType = binaryResult.inferredType;
-
     ObjectAccessTarget writeTarget = node.setter == null
         ? const ObjectAccessTarget.missing()
         : new ExtensionAccessTarget(
@@ -612,6 +607,17 @@
 
     DartType valueType = inferrer.getSetterType(writeTarget, receiverType);
 
+    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+        node.binaryOffset,
+        valueType,
+        read,
+        readType,
+        node.binaryName,
+        node.rhs);
+
+    Expression binary = binaryResult.expression;
+    DartType binaryType = binaryResult.inferredType;
+
     Expression value = inferrer.ensureAssignable(valueType, binaryType, binary,
         isVoidAllowed: true);
 
@@ -1322,21 +1328,27 @@
   }
 
   DartType getSpreadElementType(DartType spreadType, bool isNullAware) {
-    if (spreadType is InterfaceType) {
-      if (spreadType.classNode == inferrer.coreTypes.nullClass) {
-        if (inferrer.isNonNullableByDefault) {
-          return isNullAware ? const NeverType(Nullability.nonNullable) : null;
-        } else {
-          return isNullAware ? spreadType : null;
-        }
+    DartType typeBound = inferrer.resolveTypeParameter(spreadType);
+    if (inferrer.coreTypes.isNull(typeBound)) {
+      if (inferrer.isNonNullableByDefault) {
+        return isNullAware ? const NeverType(Nullability.nonNullable) : null;
+      } else {
+        return isNullAware ? inferrer.coreTypes.nullType : null;
       }
+    }
+    if (typeBound is InterfaceType) {
       List<DartType> supertypeArguments = inferrer.typeSchemaEnvironment
           .getTypeArgumentsAsInstanceOf(
-              spreadType, inferrer.coreTypes.iterableClass);
-      if (supertypeArguments == null) return null;
+              typeBound, inferrer.coreTypes.iterableClass);
+      if (supertypeArguments == null) {
+        return null;
+      }
       return supertypeArguments.single;
+    } else if (spreadType is DynamicType) {
+      return const DynamicType();
+    } else if (inferrer.coreTypes.isBottom(spreadType)) {
+      return const NeverType(Nullability.nonNullable);
     }
-    if (spreadType is DynamicType) return const DynamicType();
     return null;
   }
 
@@ -1368,11 +1380,12 @@
         DartType spreadElementType =
             getSpreadElementType(spreadType, element.isNullAware);
         if (spreadElementType == null) {
-          if (spreadType is InterfaceType &&
-              spreadType.classNode == inferrer.coreTypes.nullClass &&
+          if (inferrer.coreTypes
+                  .isNull(inferrer.resolveTypeParameter(spreadType)) &&
               !element.isNullAware) {
             replacement = inferrer.helper.buildProblem(
-                messageNonNullAwareSpreadIsNull,
+                templateNonNullAwareSpreadIsNull.withArguments(
+                    spreadType, inferrer.isNonNullableByDefault),
                 element.expression.fileOffset,
                 1);
           } else {
@@ -1728,28 +1741,28 @@
   // is a function type, the original values in output are preserved.
   void storeSpreadMapEntryElementTypes(DartType spreadMapEntryType,
       bool isNullAware, List<DartType> output, int offset) {
-    if (spreadMapEntryType is InterfaceType) {
-      if (spreadMapEntryType.classNode == inferrer.coreTypes.nullClass) {
-        if (isNullAware) {
-          if (inferrer.isNonNullableByDefault) {
-            output[offset] =
-                output[offset + 1] = const NeverType(Nullability.nonNullable);
-          } else {
-            output[offset] = output[offset + 1] = spreadMapEntryType;
-          }
-        }
-      } else {
-        List<DartType> supertypeArguments = inferrer.typeSchemaEnvironment
-            .getTypeArgumentsAsInstanceOf(
-                spreadMapEntryType, inferrer.coreTypes.mapClass);
-        if (supertypeArguments != null) {
-          output[offset] = supertypeArguments[0];
-          output[offset + 1] = supertypeArguments[1];
+    DartType typeBound = inferrer.resolveTypeParameter(spreadMapEntryType);
+    if (inferrer.coreTypes.isNull(typeBound)) {
+      if (isNullAware) {
+        if (inferrer.isNonNullableByDefault) {
+          output[offset] =
+              output[offset + 1] = const NeverType(Nullability.nonNullable);
+        } else {
+          output[offset] = output[offset + 1] = inferrer.coreTypes.nullType;
         }
       }
-    }
-    if (spreadMapEntryType is DynamicType) {
+    } else if (typeBound is InterfaceType) {
+      List<DartType> supertypeArguments = inferrer.typeSchemaEnvironment
+          .getTypeArgumentsAsInstanceOf(typeBound, inferrer.coreTypes.mapClass);
+      if (supertypeArguments != null) {
+        output[offset] = supertypeArguments[0];
+        output[offset + 1] = supertypeArguments[1];
+      }
+    } else if (spreadMapEntryType is DynamicType) {
       output[offset] = output[offset + 1] = const DynamicType();
+    } else if (inferrer.coreTypes.isBottom(spreadMapEntryType)) {
+      output[offset] =
+          output[offset + 1] = const NeverType(Nullability.nonNullable);
     }
   }
 
@@ -1794,12 +1807,15 @@
       MapEntry replacement = entry;
       if (typeChecksNeeded) {
         if (actualKeyType == null) {
-          if (spreadType is InterfaceType &&
-              spreadType.classNode == inferrer.coreTypes.nullClass &&
+          if (inferrer.coreTypes
+                  .isNull(inferrer.resolveTypeParameter(spreadType)) &&
               !entry.isNullAware) {
             replacement = new MapEntry(
-                inferrer.helper.buildProblem(messageNonNullAwareSpreadIsNull,
-                    entry.expression.fileOffset, 1),
+                inferrer.helper.buildProblem(
+                    templateNonNullAwareSpreadIsNull.withArguments(
+                        spreadType, inferrer.isNonNullableByDefault),
+                    entry.expression.fileOffset,
+                    1),
                 new NullLiteral())
               ..fileOffset = entry.fileOffset;
           } else if (actualElementType != null) {
@@ -2612,14 +2628,20 @@
     Expression read = readResult.expression;
     DartType readType = readResult.inferredType;
 
-    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
-        node.binaryOffset, read, readType, node.binaryName, node.rhs);
-    DartType binaryType = binaryResult.inferredType;
-
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, node.propertyName, node.writeOffset,
         setter: true, instrumented: true, includeExtensionMethods: true);
     DartType writeType = inferrer.getSetterType(writeTarget, receiverType);
+
+    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+        node.binaryOffset,
+        writeType,
+        read,
+        readType,
+        node.binaryName,
+        node.rhs);
+    DartType binaryType = binaryResult.inferredType;
+
     Expression binary =
         inferrer.ensureAssignableResult(writeType, binaryResult);
 
@@ -3550,8 +3572,13 @@
   /// [fileOffset] is used as the file offset for created nodes. [leftType] is
   /// the already inferred type of the [left] expression. The inferred type of
   /// [right] is computed by this method.
-  ExpressionInferenceResult _computeBinaryExpression(int fileOffset,
-      Expression left, DartType leftType, Name binaryName, Expression right) {
+  ExpressionInferenceResult _computeBinaryExpression(
+      int fileOffset,
+      DartType contextType,
+      Expression left,
+      DartType leftType,
+      Name binaryName,
+      Expression right) {
     assert(binaryName != equalsName);
 
     ObjectAccessTarget binaryTarget = inferrer.findInterfaceMember(
@@ -3566,13 +3593,21 @@
     DartType rightType =
         inferrer.getPositionalParameterTypeForTarget(binaryTarget, leftType, 0);
 
-    bool isOverloadedArithmeticOperatorAndType =
-        inferrer.isOverloadedArithmeticOperatorAndType(binaryTarget, leftType);
+    bool isSpecialCasedBinaryOperator = inferrer
+        .isSpecialCasedBinaryOperatorForReceiverType(binaryTarget, leftType);
 
-    bool typeNeeded =
-        !inferrer.isTopLevel || isOverloadedArithmeticOperatorAndType;
-    ExpressionInferenceResult rightResult = inferrer
-        .inferExpression(right, rightType, typeNeeded, isVoidAllowed: true);
+    bool typeNeeded = !inferrer.isTopLevel || isSpecialCasedBinaryOperator;
+
+    DartType rightContextType = rightType;
+    if (isSpecialCasedBinaryOperator) {
+      rightContextType = inferrer.typeSchemaEnvironment
+          .getContextTypeOfSpecialCasedBinaryOperator(
+              contextType, leftType, rightType,
+              isNonNullableByDefault: inferrer.isNonNullableByDefault);
+    }
+    ExpressionInferenceResult rightResult = inferrer.inferExpression(
+        right, rightContextType, typeNeeded,
+        isVoidAllowed: true);
     if (rightResult.inferredType == null) {
       assert(!typeNeeded,
           "Missing right type for overloaded arithmetic operator.");
@@ -3584,9 +3619,11 @@
 
     right = inferrer.ensureAssignableResult(rightType, rightResult);
 
-    if (isOverloadedArithmeticOperatorAndType) {
+    if (isSpecialCasedBinaryOperator) {
       binaryType = inferrer.typeSchemaEnvironment
-          .getTypeOfOverloadedArithmetic(leftType, rightResult.inferredType);
+          .getTypeOfSpecialCasedBinaryOperator(
+              leftType, rightResult.inferredType,
+              isNonNullableByDefault: inferrer.isNonNullableByDefault);
     }
 
     Expression binary;
@@ -4202,23 +4239,30 @@
       left = read;
     }
 
-    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
-        node.binaryOffset, left, readType, node.binaryName, node.rhs);
-    Expression binary = binaryResult.expression;
-    DartType binaryType = binaryResult.inferredType;
-
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, indexSetName, node.writeOffset,
         includeExtensionMethods: true);
 
     DartType writeIndexType =
         inferrer.getIndexKeyType(writeTarget, receiverType);
+
+    DartType valueType =
+        inferrer.getIndexSetValueType(writeTarget, receiverType);
+
+    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+        node.binaryOffset,
+        valueType,
+        left,
+        readType,
+        node.binaryName,
+        node.rhs);
+    Expression binary = binaryResult.expression;
+    DartType binaryType = binaryResult.inferredType;
+
     Expression writeIndex = createVariableGet(indexVariable);
     writeIndex = inferrer.ensureAssignable(
         writeIndexType, indexResult.inferredType, writeIndex);
 
-    DartType valueType =
-        inferrer.getIndexSetValueType(writeTarget, receiverType);
     binary = inferrer.ensureAssignable(valueType, binaryType, binary,
         fileOffset: node.fileOffset);
 
@@ -4342,17 +4386,23 @@
       left = read;
     }
 
-    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
-        node.binaryOffset, left, readType, node.binaryName, node.rhs);
-    Expression binary = binaryResult.expression;
-    DartType binaryType = binaryResult.inferredType;
-
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         nonNullReceiverType, node.propertyName, node.writeOffset,
         setter: true, includeExtensionMethods: true);
 
     DartType valueType =
         inferrer.getSetterType(writeTarget, nonNullReceiverType);
+
+    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+        node.binaryOffset,
+        valueType,
+        left,
+        readType,
+        node.binaryName,
+        node.rhs);
+    Expression binary = binaryResult.expression;
+    DartType binaryType = binaryResult.inferredType;
+
     binary = inferrer.ensureAssignable(valueType, binaryType, binary,
         fileOffset: node.fileOffset);
 
@@ -4477,12 +4527,6 @@
     } else {
       left = read;
     }
-
-    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
-        node.binaryOffset, left, readType, node.binaryName, node.rhs);
-    Expression binary = binaryResult.expression;
-    DartType binaryType = binaryResult.inferredType;
-
     ObjectAccessTarget writeTarget = node.setter != null
         ? new ObjectAccessTarget.interfaceMember(node.setter,
             isPotentiallyNullable: false)
@@ -4490,12 +4534,24 @@
 
     DartType writeIndexType =
         inferrer.getIndexKeyType(writeTarget, inferrer.thisType);
+
+    DartType valueType =
+        inferrer.getIndexSetValueType(writeTarget, inferrer.thisType);
+
+    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+        node.binaryOffset,
+        valueType,
+        left,
+        readType,
+        node.binaryName,
+        node.rhs);
+    Expression binary = binaryResult.expression;
+    DartType binaryType = binaryResult.inferredType;
+
     Expression writeIndex = createVariableGet(indexVariable);
     writeIndex = inferrer.ensureAssignable(
         writeIndexType, indexResult.inferredType, writeIndex);
 
-    DartType valueType =
-        inferrer.getIndexSetValueType(writeTarget, inferrer.thisType);
     Expression binaryReplacement = inferrer.ensureAssignable(
         valueType, binaryType, binary,
         fileOffset: node.fileOffset);
@@ -4643,11 +4699,6 @@
       left = read;
     }
 
-    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
-        node.binaryOffset, left, readType, node.binaryName, node.rhs);
-    Expression binary = binaryResult.expression;
-    DartType binaryType = binaryResult.inferredType;
-
     ObjectAccessTarget writeTarget = node.setter != null
         ? new ExtensionAccessTarget(
             node.setter, null, ProcedureKind.Operator, extensionTypeArguments)
@@ -4655,12 +4706,24 @@
 
     DartType writeIndexType =
         inferrer.getIndexKeyType(writeTarget, receiverType);
-    Expression writeIndex = createVariableGet(indexVariable);
-    writeIndex = inferrer.ensureAssignable(
-        writeIndexType, indexResult.inferredType, writeIndex);
 
     DartType valueType =
         inferrer.getIndexSetValueType(writeTarget, inferrer.thisType);
+
+    ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+        node.binaryOffset,
+        valueType,
+        left,
+        readType,
+        node.binaryName,
+        node.rhs);
+
+    Expression binary = binaryResult.expression;
+    DartType binaryType = binaryResult.inferredType;
+
+    Expression writeIndex = createVariableGet(indexVariable);
+    writeIndex = inferrer.ensureAssignable(
+        writeIndexType, indexResult.inferredType, writeIndex);
     binary = inferrer.ensureAssignable(valueType, binaryType, binary,
         fileOffset: node.fileOffset);
 
@@ -5832,8 +5895,13 @@
       BinaryExpression node, DartType typeContext) {
     ExpressionInferenceResult leftResult =
         inferrer.inferExpression(node.left, const UnknownType(), true);
-    return _computeBinaryExpression(node.fileOffset, leftResult.expression,
-        leftResult.inferredType, node.binaryName, node.right);
+    return _computeBinaryExpression(
+        node.fileOffset,
+        typeContext,
+        leftResult.expression,
+        leftResult.inferredType,
+        node.binaryName,
+        node.right);
   }
 
   ExpressionInferenceResult visitUnary(
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 76b40ba..68d00f9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -3555,6 +3555,16 @@
   String toString() {
     return "BinaryExpression(${toStringInternal()})";
   }
+
+  @override
+  int get precedence => Precedence.binaryPrecedence[binaryName.name];
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.writeExpression(left, minimumPrecedence: precedence);
+    printer.write(' ${binaryName.name} ');
+    printer.writeExpression(right, minimumPrecedence: precedence);
+  }
 }
 
 /// Internal expression for a unary expression.
@@ -3589,9 +3599,22 @@
   }
 
   @override
+  int get precedence => Precedence.PREFIX;
+
+  @override
   String toString() {
     return "UnaryExpression(${toStringInternal()})";
   }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    if (unaryName == unaryMinusName) {
+      printer.write('-');
+    } else {
+      printer.write('${unaryName.name}');
+    }
+    printer.writeExpression(expression, minimumPrecedence: precedence);
+  }
 }
 
 /// Internal expression for a parenthesized expression.
@@ -3625,9 +3648,19 @@
   }
 
   @override
+  int get precedence => Precedence.CALLEE;
+
+  @override
   String toString() {
     return "ParenthesizedExpression(${toStringInternal()})";
   }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.write('(');
+    printer.writeExpression(expression);
+    printer.write(')');
+  }
 }
 
 /// Creates a [Let] of [variable] with the given [body] using
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index d6682d4..e7f565a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -154,9 +154,8 @@
   }
 
   void visitNeverType(NeverType node) {
-    // TODO(askesc): Consider throwing internal error if NeverType appears in
-    //  diagnostics.
     result.add("Never");
+    addNullability(node.declaredNullability);
   }
 
   void visitDynamicType(DynamicType node) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 81679f7..6376960 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -81,11 +81,8 @@
 
 import '../export.dart' show Export;
 
-import '../import.dart' show Import;
-
 import '../fasta_codes.dart'
     show
-        LocatedMessage,
         Message,
         SummaryTemplate,
         Template,
@@ -100,10 +97,6 @@
         templateAmbiguousSupertypes,
         templateCantReadFile,
         templateCyclicClassHierarchy,
-        templateDuplicatedLibraryExport,
-        templateDuplicatedLibraryExportContext,
-        templateDuplicatedLibraryImport,
-        templateDuplicatedLibraryImportContext,
         templateExtendingEnum,
         templateExtendingRestricted,
         templateIllegalMixin,
@@ -916,82 +909,7 @@
 
   List<SourceClassBuilder> checkSemantics(ClassBuilder objectClass) {
     checkObjectClassHierarchy(objectClass);
-    List<SourceClassBuilder> classes = handleHierarchyCycles(objectClass);
-
-    // Check imports and exports for duplicate names.
-    // This is rather silly, e.g. it makes importing 'foo' and exporting another
-    // 'foo' ok.
-    builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library is SourceLibraryBuilder && library.loader == this) {
-        // Check exports.
-        if (library.exports.isNotEmpty) {
-          Map<String, List<Export>> nameToExports;
-          bool errorExports = false;
-          for (Export export in library.exports) {
-            String name = export.exported?.name ?? '';
-            if (name != '') {
-              nameToExports ??= new Map<String, List<Export>>();
-              List<Export> exports = nameToExports[name] ??= <Export>[];
-              exports.add(export);
-              if (exports[0].exported != export.exported) errorExports = true;
-            }
-          }
-          if (errorExports) {
-            for (String name in nameToExports.keys) {
-              List<Export> exports = nameToExports[name];
-              if (exports.length < 2) continue;
-              List<LocatedMessage> context = <LocatedMessage>[];
-              for (Export export in exports.skip(1)) {
-                context.add(templateDuplicatedLibraryExportContext
-                    .withArguments(name)
-                    .withLocation(uri, export.charOffset, noLength));
-              }
-              library.addProblem(
-                  templateDuplicatedLibraryExport.withArguments(name),
-                  exports[0].charOffset,
-                  noLength,
-                  uri,
-                  context: context);
-            }
-          }
-        }
-
-        // Check imports.
-        if (library.imports.isNotEmpty) {
-          Map<String, List<Import>> nameToImports;
-          bool errorImports;
-          for (Import import in library.imports) {
-            String name = import.imported?.name ?? '';
-            if (name != '') {
-              nameToImports ??= new Map<String, List<Import>>();
-              List<Import> imports = nameToImports[name] ??= <Import>[];
-              imports.add(import);
-              if (imports[0].imported != import.imported) errorImports = true;
-            }
-          }
-          if (errorImports != null) {
-            for (String name in nameToImports.keys) {
-              List<Import> imports = nameToImports[name];
-              if (imports.length < 2) continue;
-              List<LocatedMessage> context = <LocatedMessage>[];
-              for (Import import in imports.skip(1)) {
-                context.add(templateDuplicatedLibraryImportContext
-                    .withArguments(name)
-                    .withLocation(uri, import.charOffset, noLength));
-              }
-              library.addProblem(
-                  templateDuplicatedLibraryImport.withArguments(name),
-                  imports[0].charOffset,
-                  noLength,
-                  uri,
-                  context: context);
-            }
-          }
-        }
-      }
-    });
-    ticker.logMs("Checked imports and exports for duplicate names");
-    return classes;
+    return handleHierarchyCycles(objectClass);
   }
 
   void buildComponent() {
@@ -1286,12 +1204,6 @@
     }
   }
 
-  Expression instantiateInvocation(Expression receiver, String name,
-      Arguments arguments, int offset, bool isSuper) {
-    return target.backendTarget.instantiateInvocation(
-        coreTypes, receiver, name, arguments, offset, isSuper);
-  }
-
   Expression instantiateNoSuchMethodError(
       Expression receiver, String name, Arguments arguments, int offset,
       {bool isMethod: false,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
index d0f4ba3..2aad555 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
@@ -106,16 +106,8 @@
 class _SyncClosureContext implements ClosureContext {
   bool get isAsync => false;
 
-  /// The typing expectation for the subexpression of a `return` or `yield`
-  /// statement inside the function.
-  ///
-  /// For non-generator async functions, this will be a "FutureOr" type (since
-  /// it is permissible for such a function to return either a direct value or
-  /// a future).
-  ///
-  /// For generator functions containing a `yield*` statement, the expected type
-  /// for the subexpression of the `yield*` statement is the result of wrapping
-  /// this typing expectation in `Stream` or `Iterator`, as appropriate.
+  /// The typing expectation for the subexpression of a `return` statement
+  /// inside the function.
   final DartType _returnContext;
 
   @override
@@ -303,7 +295,15 @@
     assert(_needToInferReturnType);
     assert(hasImplicitReturn != null);
     DartType inferredType;
-    if (_returnStatements.isNotEmpty) {
+    if (inferrer.isNonNullableByDefault) {
+      if (hasImplicitReturn) {
+        // No explicit returns we have an implicit `return null`.
+        inferredType = inferrer.typeSchemaEnvironment.nullType;
+      } else {
+        // No explicit return and the function doesn't complete normally; that
+        // is, it throws.
+        inferredType = new NeverType(inferrer.library.nonNullable);
+      }
       // Use the types seen from the explicit return statements.
       for (int i = 0; i < _returnStatements.length; i++) {
         ReturnStatement statement = _returnStatements[i];
@@ -322,15 +322,32 @@
               inferredType, type, inferrer.library.library);
         }
       }
-    } else if (hasImplicitReturn) {
-      // No explicit returns we have an implicit `return null`.
-      inferredType = inferrer.typeSchemaEnvironment.nullType;
     } else {
-      // No explicit return and the function doesn't complete normally; that is,
-      // it throws.
-      if (inferrer.isNonNullableByDefault) {
-        inferredType = new NeverType(inferrer.library.nonNullable);
+      if (_returnStatements.isNotEmpty) {
+        // Use the types seen from the explicit return statements.
+        for (int i = 0; i < _returnStatements.length; i++) {
+          ReturnStatement statement = _returnStatements[i];
+          DartType type = _returnExpressionTypes[i];
+          // The return expression has to be assignable to the return type
+          // expectation from the downwards inference context.
+          if (statement.expression != null) {
+            if (!inferrer.isAssignable(_returnContext, type)) {
+              type = inferrer.computeGreatestClosure(_returnContext);
+            }
+          }
+          if (inferredType == null) {
+            inferredType = type;
+          } else {
+            inferredType = inferrer.typeSchemaEnvironment.getStandardUpperBound(
+                inferredType, type, inferrer.library.library);
+          }
+        }
+      } else if (hasImplicitReturn) {
+        // No explicit returns we have an implicit `return null`.
+        inferredType = inferrer.typeSchemaEnvironment.nullType;
       } else {
+        // No explicit return and the function doesn't complete normally; that
+        // is, it throws.
         inferredType = inferrer.typeSchemaEnvironment.nullType;
       }
     }
@@ -398,16 +415,11 @@
 class _AsyncClosureContext implements ClosureContext {
   bool get isAsync => true;
 
-  /// The typing expectation for the subexpression of a `return` or `yield`
-  /// statement inside the function.
+  /// The typing expectation for the subexpression of a `return` statement
+  /// inside the function.
   ///
-  /// For non-generator async functions, this will be a "FutureOr" type (since
-  /// it is permissible for such a function to return either a direct value or
-  /// a future).
-  ///
-  /// For generator functions containing a `yield*` statement, the expected type
-  /// for the subexpression of the `yield*` statement is the result of wrapping
-  /// this typing expectation in `Stream` or `Iterator`, as appropriate.
+  /// This will be a "FutureOr" type (since it is permissible for such a
+  /// function to return either a direct value or a future).
   final DartType _returnContext;
 
   @override
@@ -649,23 +661,20 @@
     assert(_needToInferReturnType);
     assert(hasImplicitReturn != null);
     DartType inferredType;
-    if (_returnStatements.isNotEmpty) {
+
+    if (inferrer.isNonNullableByDefault) {
+      if (hasImplicitReturn) {
+        // No explicit returns we have an implicit `return null`.
+        inferredType = inferrer.typeSchemaEnvironment.nullType;
+      } else {
+        // No explicit return and the function doesn't complete normally; that
+        // is, it throws.
+        inferredType = new NeverType(inferrer.library.nonNullable);
+      }
       // Use the types seen from the explicit return statements.
       for (int i = 0; i < _returnStatements.length; i++) {
-        ReturnStatement statement = _returnStatements[i];
         DartType type = _returnExpressionTypes[i];
 
-        // The return expression has to be assignable to the return type
-        // expectation from the downwards inference context.
-        if (!inferrer.isNonNullableByDefault) {
-          if (statement.expression != null) {
-            if (!inferrer.isAssignable(
-                computeAssignableType(inferrer, _returnContext, type), type)) {
-              // Not assignable, use the expectation.
-              type = inferrer.computeGreatestClosure(_returnContext);
-            }
-          }
-        }
         DartType unwrappedType = inferrer.typeSchemaEnvironment.flatten(type);
         if (inferredType == null) {
           inferredType = unwrappedType;
@@ -674,30 +683,60 @@
               inferredType, unwrappedType, inferrer.library.library);
         }
       }
-    } else if (hasImplicitReturn) {
-      // No explicit returns we have an implicit `return null`.
-      inferredType = inferrer.typeSchemaEnvironment.nullType;
-    } else {
-      // No explicit return and the function doesn't complete normally; that is,
-      // it throws.
-      if (inferrer.isNonNullableByDefault) {
-        inferredType = new NeverType(inferrer.library.nonNullable);
-      } else {
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
-      }
-    }
 
-    if (inferrer.isNonNullableByDefault) {
-      if (!inferrer.typeSchemaEnvironment.isSubtypeOf(
-          inferredType, _returnContext, SubtypeCheckMode.withNullabilities)) {
+      // Let `T` be the **actual returned type** of a function literal as
+      // computed above.
+
+      // Let `R` be the greatest closure of the typing context `K` as computed
+      // above. If `R` is `void`, or the function literal is marked `async` and
+      // `R` is `FutureOr<void>`, let `S` be `void`. Otherwise, if `T <: R` then
+      // let `S` be `T`.  Otherwise, let `S` be `R`.
+      DartType returnContext = inferrer.computeGreatestClosure2(_returnContext);
+      if (returnContext is VoidType ||
+          returnContext is FutureOrType &&
+              returnContext.typeArgument is VoidType) {
+        inferredType = const VoidType();
+      } else if (!inferrer.typeSchemaEnvironment.isSubtypeOf(
+          inferredType, returnContext, SubtypeCheckMode.withNullabilities)) {
         // If the inferred return type isn't a subtype of the context, we use
         // the context.
-        inferredType = inferrer.computeGreatestClosure2(_declaredReturnType);
+        inferredType = returnContext;
       }
       inferredType = inferrer.wrapFutureType(
           inferrer.typeSchemaEnvironment.flatten(inferredType),
           inferrer.library.nonNullable);
     } else {
+      if (_returnStatements.isNotEmpty) {
+        // Use the types seen from the explicit return statements.
+        for (int i = 0; i < _returnStatements.length; i++) {
+          ReturnStatement statement = _returnStatements[i];
+          DartType type = _returnExpressionTypes[i];
+
+          // The return expression has to be assignable to the return type
+          // expectation from the downwards inference context.
+          if (statement.expression != null) {
+            if (!inferrer.isAssignable(
+                computeAssignableType(inferrer, _returnContext, type), type)) {
+              // Not assignable, use the expectation.
+              type = inferrer.computeGreatestClosure(_returnContext);
+            }
+          }
+          DartType unwrappedType = inferrer.typeSchemaEnvironment.flatten(type);
+          if (inferredType == null) {
+            inferredType = unwrappedType;
+          } else {
+            inferredType = inferrer.typeSchemaEnvironment.getStandardUpperBound(
+                inferredType, unwrappedType, inferrer.library.library);
+          }
+        }
+      } else if (hasImplicitReturn) {
+        // No explicit returns we have an implicit `return null`.
+        inferredType = inferrer.typeSchemaEnvironment.nullType;
+      } else {
+        // No explicit return and the function doesn't complete normally;
+        // that is, it throws.
+        inferredType = inferrer.typeSchemaEnvironment.nullType;
+      }
       inferredType =
           inferrer.wrapFutureType(inferredType, inferrer.library.nonNullable);
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index 2f29335..4d04ad4 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -2,300 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-import 'dart:math' as math;
+import 'package:kernel/ast.dart' show DartType, Library, NeverType, Nullability;
 
-import 'package:front_end/src/fasta/fasta_codes.dart';
-import 'package:kernel/ast.dart'
-    show
-        BottomType,
-        Class,
-        DartType,
-        DynamicType,
-        FunctionType,
-        FutureOrType,
-        InterfaceType,
-        InvalidType,
-        Library,
-        NamedType,
-        NeverType,
-        Nullability,
-        TypeParameter,
-        TypeParameterType,
-        Variance,
-        VoidType;
-
-import 'package:kernel/core_types.dart';
-
-import 'package:kernel/type_algebra.dart';
-
-import 'package:kernel/type_environment.dart';
-
-import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/standard_bounds.dart';
 
 import 'type_schema.dart' show UnknownType;
 
 import 'type_schema_elimination.dart';
 
-import '../problems.dart';
-
-abstract class StandardBounds {
-  CoreTypes get coreTypes;
-
-  bool isSubtypeOf(DartType subtype, DartType supertype, SubtypeCheckMode mode);
-
-  bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode);
-
-  InterfaceType getLegacyLeastUpperBound(
-      InterfaceType type1, InterfaceType type2, Library clientLibrary);
-
-  /// Checks the value of the MORETOP predicate for [s] and [t].
-  ///
-  /// For the definition of MORETOP see the following:
-  /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
-  bool moretop(DartType s, DartType t) {
-    assert(coreTypes.isTop(s) || coreTypes.isObject(s));
-    assert(coreTypes.isTop(t) || coreTypes.isObject(t));
-
-    // MORETOP(void, T) = true.
-    if (s is VoidType) return true;
-
-    // MORETOP(S, void) = false.
-    if (t is VoidType) return false;
-
-    // MORETOP(dynamic, T) = true.
-    if (s is DynamicType) return true;
-
-    // MORETOP(S, dynamic) = false.
-    if (t is DynamicType) return false;
-
-    // MORETOP(Object, T) = true.
-    if (s is InterfaceType &&
-        s.classNode == coreTypes.objectClass &&
-        s.declaredNullability == Nullability.nonNullable) {
-      return true;
-    }
-
-    // MORETOP(S, Object) = false.
-    if (t is InterfaceType &&
-        t.classNode == coreTypes.objectClass &&
-        t.declaredNullability == Nullability.nonNullable) {
-      return false;
-    }
-
-    // MORETOP(S*, T*) = MORETOP(S, T).
-    if (s.declaredNullability == Nullability.legacy &&
-        t.declaredNullability == Nullability.legacy) {
-      DartType nonNullableS =
-          s.withDeclaredNullability(Nullability.nonNullable);
-      assert(!identical(s, nonNullableS));
-      DartType nonNullableT =
-          t.withDeclaredNullability(Nullability.nonNullable);
-      assert(!identical(t, nonNullableT));
-      return moretop(nonNullableS, nonNullableT);
-    }
-
-    // MORETOP(S, T*) = true.
-    if (s.declaredNullability == Nullability.nonNullable &&
-        t.declaredNullability == Nullability.legacy) {
-      return true;
-    }
-
-    // MORETOP(S*, T) = false.
-    if (s.declaredNullability == Nullability.legacy &&
-        t.declaredNullability == Nullability.nonNullable) {
-      return false;
-    }
-
-    // MORETOP(S?, T?) == MORETOP(S, T).
-    if (s.declaredNullability == Nullability.nullable &&
-        t.declaredNullability == Nullability.nullable) {
-      DartType nonNullableS =
-          s.withDeclaredNullability(Nullability.nonNullable);
-      assert(!identical(s, nonNullableS));
-      DartType nonNullableT =
-          t.withDeclaredNullability(Nullability.nonNullable);
-      assert(!identical(t, nonNullableT));
-      return moretop(nonNullableS, nonNullableT);
-    }
-
-    // MORETOP(S, T?) = true.
-    if (s.declaredNullability == Nullability.nonNullable &&
-        t.declaredNullability == Nullability.nullable) {
-      return true;
-    }
-
-    // MORETOP(S?, T) = false.
-    if (s.declaredNullability == Nullability.nullable &&
-        t.declaredNullability == Nullability.nonNullable) {
-      return false;
-    }
-
-    // TODO(dmitryas): Update the following after the spec is updated.
-    if (s.declaredNullability == Nullability.nullable &&
-        t.declaredNullability == Nullability.legacy) {
-      return true;
-    }
-    if (s.declaredNullability == Nullability.legacy &&
-        t.declaredNullability == Nullability.nullable) {
-      return false;
-    }
-
-    // MORETOP(FutureOr<S>, FutureOr<T>) = MORETOP(S, T).
-    if (s is FutureOrType &&
-        s.declaredNullability == Nullability.nonNullable &&
-        t is FutureOrType &&
-        t.declaredNullability == Nullability.nonNullable) {
-      return moretop(s.typeArgument, t.typeArgument);
-    }
-
-    return internalProblem(
-        templateInternalProblemUnsupported.withArguments("moretop($s, $t)"),
-        -1,
-        null);
-  }
-
-  /// Checks the value of the MOREBOTTOM predicate for [s] and [t].
-  ///
-  /// For the definition of MOREBOTTOM see the following:
-  /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
-  bool morebottom(DartType s, DartType t) {
-    assert(coreTypes.isBottom(s) || coreTypes.isNull(s));
-    assert(coreTypes.isBottom(t) || coreTypes.isNull(t));
-
-    // MOREBOTTOM(Never, T) = true.
-    if (s is NeverType && s.declaredNullability == Nullability.nonNullable) {
-      return true;
-    }
-
-    // MOREBOTTOM(S, Never) = false.
-    if (t is NeverType && t.declaredNullability == Nullability.nonNullable) {
-      return false;
-    }
-
-    // MOREBOTTOM(Null, T) = true.
-    if (s == coreTypes.nullType) {
-      return true;
-    }
-
-    // MOREBOTTOM(S, Null) = false.
-    if (t == coreTypes.nullType) {
-      return false;
-    }
-
-    // MOREBOTTOM(S?, T?) = MOREBOTTOM(S, T).
-    if (t.declaredNullability == Nullability.nullable &&
-        s.declaredNullability == Nullability.nullable) {
-      DartType nonNullableS =
-          s.withDeclaredNullability(Nullability.nonNullable);
-      assert(s != nonNullableS);
-      DartType nonNullableT =
-          t.withDeclaredNullability(Nullability.nonNullable);
-      assert(t != nonNullableT);
-      return morebottom(nonNullableS, nonNullableT);
-    }
-
-    // MOREBOTTOM(S, T?) = true.
-    if (s.declaredNullability == Nullability.nonNullable &&
-        t.declaredNullability == Nullability.nullable) {
-      return true;
-    }
-
-    // MOREBOTTOM(S?, T) = false.
-    if (s.declaredNullability == Nullability.nullable &&
-        t.declaredNullability == Nullability.nonNullable) {
-      return false;
-    }
-
-    // MOREBOTTOM(S*, T*) = MOREBOTTOM(S, T)
-    if (s.declaredNullability == Nullability.legacy &&
-        t.declaredNullability == Nullability.legacy) {
-      DartType nonNullableS =
-          s.withDeclaredNullability(Nullability.nonNullable);
-      assert(s != nonNullableS);
-      DartType nonNullableT =
-          t.withDeclaredNullability(Nullability.nonNullable);
-      assert(t != nonNullableT);
-      return morebottom(nonNullableS, nonNullableT);
-    }
-
-    // MOREBOTTOM(S, T*) = true.
-    if (s.declaredNullability == Nullability.nonNullable &&
-        t.declaredNullability == Nullability.legacy) {
-      return true;
-    }
-
-    // MOREBOTTOM(S*, T) = false.
-    if (s.declaredNullability == Nullability.legacy &&
-        t.declaredNullability == Nullability.nonNullable) {
-      return false;
-    }
-
-    // TODO(dmitryas): Update the following after the spec is updated.
-    if (s.declaredNullability == Nullability.nullable &&
-        t.declaredNullability == Nullability.legacy) {
-      return true;
-    }
-    if (s.declaredNullability == Nullability.legacy &&
-        t.declaredNullability == Nullability.nullable) {
-      return false;
-    }
-
-    // MOREBOTTOM(X&S, Y&T) = MOREBOTTOM(S, T).
-    if (s is TypeParameterType &&
-        s.promotedBound != null &&
-        t is TypeParameterType &&
-        t.promotedBound != null) {
-      return morebottom(s.promotedBound, t.promotedBound);
-    }
-
-    // MOREBOTTOM(X&S, T) = true.
-    if (s is TypeParameterType && s.promotedBound != null) {
-      return true;
-    }
-
-    // MOREBOTTOM(S, X&T) = false.
-    if (t is TypeParameterType && t.promotedBound != null) {
-      return false;
-    }
-
-    // MOREBOTTOM(X extends S, Y extends T) = MOREBOTTOM(S, T).
-    if (s is TypeParameterType && t is TypeParameterType) {
-      assert(s.promotedBound == null);
-      assert(t.promotedBound == null);
-      return morebottom(s.parameter.bound, t.parameter.bound);
-    }
-
-    return internalProblem(
-        templateInternalProblemUnsupported.withArguments("morebottom($s, $t)"),
-        -1,
-        null);
-  }
-
-  /// Computes the standard lower bound of [type1] and [type2].
-  ///
-  /// Standard lower bound is a lower bound function that imposes an
-  /// ordering on the top types `void`, `dynamic`, and `object`.  This function
-  /// additionally handles the unknown type that appears during type inference.
-  DartType getStandardLowerBound(
+mixin TypeSchemaStandardBounds on StandardBounds {
+  @override
+  DartType getNullabilityAwareStandardLowerBoundInternal(
       DartType type1, DartType type2, Library clientLibrary) {
-    if (type1 is InvalidType || type2 is InvalidType) {
-      return const InvalidType();
-    }
-    if (clientLibrary.isNonNullableByDefault) {
-      return _getNullabilityAwareStandardLowerBound(
-          type1, type2, clientLibrary);
-    }
-    return _getNullabilityObliviousStandardLowerBound(
-        legacyErasure(coreTypes, type1),
-        legacyErasure(coreTypes, type2),
-        clientLibrary);
-  }
-
-  DartType _getNullabilityAwareStandardLowerBound(
-      DartType type1, DartType type2, Library clientLibrary) {
-    // DOWN(T, T) = T.
-    if (identical(type1, type2)) return type1;
-
     //  - We add the axiom that `DOWN(T, _) == T` and the symmetric version.
     //  - We replace all uses of `T1 <: T2` in the `DOWN` algorithm by `S1 <:
     //  S2` where `Si` is the greatest closure of `Ti` with respect to `_`.
@@ -306,199 +24,13 @@
     type2 = greatestClosure(type2, coreTypes.objectNullableRawType,
         const NeverType(Nullability.nonNullable));
 
-    // DOWN(T1, T2) where TOP(T1) and TOP(T2) =
-    //   T1 if MORETOP(T2, T1)
-    //   T2 otherwise
-    // DOWN(T1, T2) = T2 if TOP(T1)
-    // DOWN(T1, T2) = T1 if TOP(T2)
-    if (coreTypes.isTop(type1)) {
-      if (coreTypes.isTop(type2)) return moretop(type2, type1) ? type1 : type2;
-      return type2;
-    } else if (coreTypes.isTop(type2)) {
-      return type1;
-    }
-
-    // DOWN(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
-    //   T1 if MOREBOTTOM(T1, T2)
-    //   T2 otherwise
-    // DOWN(T1, T2) = T2 if BOTTOM(T2)
-    // DOWN(T1, T2) = T1 if BOTTOM(T1)
-    if (coreTypes.isBottom(type1)) {
-      if (coreTypes.isBottom(type2)) {
-        return morebottom(type1, type2) ? type1 : type2;
-      }
-      return type1;
-    } else if (coreTypes.isBottom(type2)) {
-      return type2;
-    }
-
-    // DOWN(T1, T2) where NULL(T1) and NULL(T2) =
-    //   T1 if MOREBOTTOM(T1, T2)
-    //   T2 otherwise
-    // DOWN(Null, T2) =
-    //   Null if Null <: T2
-    //   Never otherwise
-    // DOWN(T1, Null) =
-    //  Null if Null <: T1
-    //  Never otherwise
-    if (coreTypes.isNull(type1)) {
-      if (coreTypes.isNull(type2)) {
-        return morebottom(type1, type2) ? type1 : type2;
-      }
-      Nullability type2Nullability = type2.declaredNullability;
-      if (type2Nullability == Nullability.legacy ||
-          type2Nullability == Nullability.nullable) {
-        return type1;
-      }
-      return const NeverType(Nullability.nonNullable);
-    } else if (coreTypes.isNull(type2)) {
-      Nullability type1Nullability = type1.declaredNullability;
-      if (type1Nullability == Nullability.legacy ||
-          type1Nullability == Nullability.nullable) {
-        return type2;
-      }
-      return const NeverType(Nullability.nonNullable);
-    }
-
-    // DOWN(T1, T2) where OBJECT(T1) and OBJECT(T2) =
-    //   T1 if MORETOP(T2, T1)
-    //   T2 otherwise
-    // DOWN(T1, T2) where OBJECT(T1) =
-    //   T2 if T2 is non-nullable
-    //   NonNull(T2) if NonNull(T2) is non-nullable
-    //   Never otherwise
-    // DOWN(T1, T2) where OBJECT(T2) =
-    //   T1 if T1 is non-nullable
-    //   NonNull(T1) if NonNull(T1) is non-nullable
-    //   Never otherwise
-    if (coreTypes.isObject(type1)) {
-      if (coreTypes.isObject(type2)) {
-        return moretop(type2, type1) ? type1 : type2;
-      }
-      if (type2.declaredNullability == Nullability.nonNullable) {
-        return type2;
-      }
-      type2 = type2.withDeclaredNullability(Nullability.nonNullable);
-      if (type2.declaredNullability == Nullability.nonNullable) {
-        return type2;
-      }
-      return const NeverType(Nullability.nonNullable);
-    } else if (coreTypes.isObject(type2)) {
-      if (type1.declaredNullability == Nullability.nonNullable) {
-        return type1;
-      }
-      type1 = type1.withDeclaredNullability(Nullability.nonNullable);
-      if (type1.declaredNullability == Nullability.nonNullable) {
-        return type1;
-      }
-      return const NeverType(Nullability.nonNullable);
-    }
-
-    // The effect of the following rules is accounted for in the code below via
-    // the invocations of intersectNullabilities.
-    // DOWN(T1*, T2*) = S* where S is DOWN(T1, T2)
-    // DOWN(T1*, T2?) = S* where S is DOWN(T1, T2)
-    // DOWN(T1?, T2*) = S* where S is DOWN(T1, T2)
-    // DOWN(T1*, T2) = S where S is DOWN(T1, T2)
-    // DOWN(T1, T2*) = S where S is DOWN(T1, T2)
-    // DOWN(T1?, T2?) = S? where S is DOWN(T1, T2)
-    // DOWN(T1?, T2) = S where S is DOWN(T1, T2)
-    // DOWN(T1, T2?) = S where S is DOWN(T1, T2)
-
-    if (type1 is FunctionType && type2 is FunctionType) {
-      return _getNullabilityAwareFunctionStandardLowerBound(
-          type1, type2, clientLibrary);
-    }
-
-    // DOWN(T1, T2) = T1 if T1 <: T2.
-    // DOWN(T1, T2) = T2 if T2 <: T1.
-
-    // We use the non-nullable variants of the two types to determine T1 <: T2
-    // without using the nullability of the outermost type. The result uses
-    // [intersectNullabilities] to compute the resulting type if the subtype
-    // relation is established.
-    DartType nonNullableType1 =
-        type1.withDeclaredNullability(Nullability.nonNullable);
-    DartType nonNullableType2 =
-        type2.withDeclaredNullability(Nullability.nonNullable);
-    if (isSubtypeOf(nonNullableType1, nonNullableType2,
-        SubtypeCheckMode.withNullabilities)) {
-      return type1.withDeclaredNullability(intersectNullabilities(
-          type1.declaredNullability, type2.declaredNullability));
-    }
-    if (isSubtypeOf(nonNullableType2, nonNullableType1,
-        SubtypeCheckMode.withNullabilities)) {
-      return type2.withDeclaredNullability(intersectNullabilities(
-          type1.declaredNullability, type2.declaredNullability));
-    }
-
-    // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
-    if (type1 is FutureOrType) {
-      if (type2 is FutureOrType) {
-        // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
-        DartType argument = getStandardLowerBound(
-            type1.typeArgument, type2.typeArgument, clientLibrary);
-        return new FutureOrType(argument, argument.declaredNullability);
-      }
-      if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
-        // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
-        return new InterfaceType(
-            coreTypes.futureClass,
-            intersectNullabilities(
-                type1.declaredNullability, type2.declaredNullability),
-            <DartType>[
-              getStandardLowerBound(
-                  type1.typeArgument, type2.typeArguments[0], clientLibrary)
-            ]);
-      }
-      // GLB(FutureOr<A>, B) == GLB(A, B)
-      return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
-    }
-    // The if-statement below handles the following rule:
-    //     GLB(A, FutureOr<B>) ==  GLB(FutureOr<B>, A)
-    // It's broken down into sub-cases instead of making a recursive call to
-    // avoid making the checks that were already made above.  Note that at this
-    // point it's not possible for type1 to be a FutureOr.
-    if (type2 is FutureOrType) {
-      if (type1 is InterfaceType && type1.classNode == coreTypes.futureClass) {
-        // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
-        return new InterfaceType(
-            coreTypes.futureClass,
-            intersectNullabilities(
-                type1.declaredNullability, type2.declaredNullability),
-            <DartType>[
-              getStandardLowerBound(
-                  type2.typeArgument, type1.typeArguments[0], clientLibrary)
-            ]);
-      }
-      // GLB(A, FutureOr<B>) == GLB(B, A)
-      return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
-    }
-
-    // DOWN(T1, T2) = Never otherwise.
-    return new NeverType(intersectNullabilities(
-        type1.declaredNullability, type2.declaredNullability));
+    return super.getNullabilityAwareStandardLowerBoundInternal(
+        type1, type2, clientLibrary);
   }
 
-  DartType _getNullabilityObliviousStandardLowerBound(
-      DartType type1, DartType type2, Library clientLibrary) {
-    // Do legacy erasure on the argument, so that the result types that are
-    // computed from arguments are legacy.
-    type1 = type1 == coreTypes.nullType
-        ? type1
-        : type1.withDeclaredNullability(Nullability.legacy);
-    type2 = type2 == coreTypes.nullType
-        ? type2
-        : type2.withDeclaredNullability(Nullability.legacy);
-
-    // For all types T, SLB(T,T) = T.  Note that we don't test for equality
-    // because we don't want to make the algorithm quadratic.  This is ok
-    // because the check is not needed for correctness; it's just a speed
-    // optimization.
-    if (identical(type1, type2)) {
-      return type1;
-    }
-
+  @override
+  DartType getNullabilityObliviousStandardLowerBoundInternal(
+      type1, type2, clientLibrary) {
     // For any type T, SLB(?, T) = SLB(T, ?) = T.
     if (type1 is UnknownType) {
       return type2;
@@ -506,125 +38,13 @@
     if (type2 is UnknownType) {
       return type1;
     }
-
-    // SLB(void, T) = SLB(T, void) = T.
-    if (type1 is VoidType) {
-      return type2;
-    }
-    if (type2 is VoidType) {
-      return type1;
-    }
-
-    // SLB(dynamic, T) = SLB(T, dynamic) = T if T is not void.
-    if (type1 is DynamicType) {
-      return type2;
-    }
-    if (type2 is DynamicType) {
-      return type1;
-    }
-
-    // SLB(Object, T) = SLB(T, Object) = T if T is not void or dynamic.
-    if (type1 == coreTypes.objectLegacyRawType) {
-      return type2;
-    }
-    if (type2 == coreTypes.objectLegacyRawType) {
-      return type1;
-    }
-
-    // SLB(bottom, T) = SLB(T, bottom) = bottom.
-    if (type1 is BottomType) return type1;
-    if (type2 is BottomType) return type2;
-    if (type1 == coreTypes.nullType) return type1;
-    if (type2 == coreTypes.nullType) return type2;
-
-    // Function types have structural lower bounds.
-    if (type1 is FunctionType && type2 is FunctionType) {
-      return _getNullabilityObliviousFunctionStandardLowerBound(
-          type1, type2, clientLibrary);
-    }
-
-    // Otherwise, the lower bounds  of two types is one of them it if it is a
-    // subtype of the other.
-    if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
-      return type1;
-    }
-
-    if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
-      return type2;
-    }
-
-    // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
-    if (type1 is FutureOrType) {
-      if (type2 is FutureOrType) {
-        // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
-        DartType argument = getStandardLowerBound(
-            type1.typeArgument, type2.typeArgument, clientLibrary);
-        return new FutureOrType(argument, argument.declaredNullability);
-      }
-      if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
-        // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
-        return new InterfaceType(
-            coreTypes.futureClass,
-            intersectNullabilities(
-                type1.declaredNullability, type2.declaredNullability),
-            <DartType>[
-              getStandardLowerBound(
-                  type1.typeArgument, type2.typeArguments[0], clientLibrary)
-            ]);
-      }
-      // GLB(FutureOr<A>, B) == GLB(A, B)
-      return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
-    }
-    // The if-statement below handles the following rule:
-    //     GLB(A, FutureOr<B>) ==  GLB(FutureOr<B>, A)
-    // It's broken down into sub-cases instead of making a recursive call to
-    // avoid making the checks that were already made above.  Note that at this
-    // point it's not possible for type1 to be a FutureOr.
-    if (type2 is FutureOrType) {
-      if (type1 is FutureOrType) {
-        // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
-        return new InterfaceType(
-            coreTypes.futureClass,
-            intersectNullabilities(
-                type1.declaredNullability, type2.declaredNullability),
-            <DartType>[
-              getStandardLowerBound(
-                  type2.typeArgument, type1.typeArgument, clientLibrary)
-            ]);
-      }
-      // GLB(A, FutureOr<B>) == GLB(B, A)
-      return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
-    }
-
-    // No subtype relation, so the lower bound is bottom.
-    return const BottomType();
+    return super.getNullabilityObliviousStandardLowerBoundInternal(
+        type1, type2, clientLibrary);
   }
 
-  /// Computes the standard upper bound of two types.
-  ///
-  /// Standard upper bound is an upper bound function that imposes an ordering
-  /// on the top types 'void', 'dynamic', and `object`.  This function
-  /// additionally handles the unknown type that appears during type inference.
-  DartType getStandardUpperBound(
+  @override
+  DartType getNullabilityAwareStandardUpperBoundInternal(
       DartType type1, DartType type2, Library clientLibrary) {
-    if (type1 is InvalidType || type2 is InvalidType) {
-      return const InvalidType();
-    }
-    if (clientLibrary.isNonNullableByDefault) {
-      return _getNullabilityAwareStandardUpperBound(
-          type1, type2, clientLibrary);
-    }
-    return _getNullabilityObliviousStandardUpperBound(
-        legacyErasure(coreTypes, type1),
-        legacyErasure(coreTypes, type2),
-        clientLibrary);
-  }
-
-  DartType _getNullabilityAwareStandardUpperBound(
-      DartType type1, DartType type2, Library clientLibrary) {
-    // UP(T, T) = T
-    if (identical(type1, type2)) return type1;
-
     //  - We add the axiom that `UP(T, _) == T` and the symmetric version.
     //  - We replace all uses of `T1 <: T2` in the `UP` algorithm by `S1 <: S2`
     //  where `Si` is the least closure of `Ti` with respect to `_`.
@@ -634,605 +54,13 @@
         const NeverType(Nullability.nonNullable));
     type2 = leastClosure(type2, coreTypes.objectNullableRawType,
         const NeverType(Nullability.nonNullable));
-
-    // UP(T1, T2) where TOP(T1) and TOP(T2) =
-    //   T1 if MORETOP(T1, T2)
-    //   T2 otherwise
-    // UP(T1, T2) = T1 if TOP(T1)
-    // UP(T1, T2) = T2 if TOP(T2)
-    if (coreTypes.isTop(type1)) {
-      if (coreTypes.isTop(type2)) return moretop(type1, type2) ? type1 : type2;
-      return type1;
-    } else if (coreTypes.isTop(type2)) {
-      return type2;
-    }
-
-    // UP(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
-    //   T2 if MOREBOTTOM(T1, T2)
-    //   T1 otherwise
-    // UP(T1, T2) = T2 if BOTTOM(T1)
-    // UP(T1, T2) = T1 if BOTTOM(T2)
-    if (coreTypes.isBottom(type1)) {
-      if (coreTypes.isBottom(type2)) {
-        return morebottom(type1, type2) ? type2 : type1;
-      }
-      return type2;
-    } else if (coreTypes.isBottom(type2)) {
-      return type1;
-    }
-
-    // UP(T1, T2) where NULL(T1) and NULL(T2) =
-    //   T2 if MOREBOTTOM(T1, T2)
-    //   T1 otherwise
-    // UP(T1, T2) where NULL(T1) =
-    //   T2 if T2 is nullable
-    //   T2? otherwise
-    // UP(T1, T2) where NULL(T2) =
-    //   T1 if T1 is nullable
-    //   T1? otherwise
-    if (coreTypes.isNull(type1)) {
-      if (coreTypes.isNull(type2)) {
-        return morebottom(type1, type2) ? type2 : type1;
-      }
-      return type2.withDeclaredNullability(Nullability.nullable);
-    } else if (coreTypes.isNull(type2)) {
-      return type1.withDeclaredNullability(Nullability.nullable);
-    }
-
-    // UP(T1, T2) where OBJECT(T1) and OBJECT(T2) =
-    //   T1 if MORETOP(T1, T2)
-    //   T2 otherwise
-    // UP(T1, T2) where OBJECT(T1) =
-    //   T1 if T2 is non-nullable
-    //   T1? otherwise
-    // UP(T1, T2) where OBJECT(T2) =
-    //   T2 if T1 is non-nullable
-    //   T2? otherwise
-    if (coreTypes.isObject(type1)) {
-      if (coreTypes.isObject(type2)) {
-        return moretop(type1, type2) ? type1 : type2;
-      }
-      if (type2.declaredNullability == Nullability.nonNullable) {
-        return type1;
-      }
-      return type1.withDeclaredNullability(Nullability.nullable);
-    } else if (coreTypes.isObject(type2)) {
-      if (type1.declaredNullability == Nullability.nonNullable) {
-        return type2;
-      }
-      return type2.withDeclaredNullability(Nullability.nullable);
-    }
-
-    // The effect of the following rules is accounted for in the code below via
-    // the invocations of uniteNullabilities.
-    // UP(T1*, T2*) = S* where S is UP(T1, T2)
-    // UP(T1*, T2?) = S? where S is UP(T1, T2)
-    // UP(T1?, T2*) = S? where S is UP(T1, T2)
-    // UP(T1*, T2) = S* where S is UP(T1, T2)
-    // UP(T1, T2*) = S* where S is UP(T1, T2)
-    // UP(T1?, T2?) = S? where S is UP(T1, T2)
-    // UP(T1?, T2) = S? where S is UP(T1, T2)
-    // UP(T1, T2?) = S? where S is UP(T1, T2)
-
-    if (type1 is TypeParameterType) {
-      return _getNullabilityAwareTypeParameterStandardUpperBound(
-          type1, type2, clientLibrary);
-    }
-
-    if (type2 is TypeParameterType) {
-      return _getNullabilityAwareTypeParameterStandardUpperBound(
-          type2, type1, clientLibrary);
-    }
-
-    if (type1 is FunctionType) {
-      if (type2 is FunctionType) {
-        return _getNullabilityAwareFunctionStandardUpperBound(
-            type1, type2, clientLibrary);
-      }
-
-      if (type2 is InterfaceType &&
-          type2.classNode == coreTypes.functionClass) {
-        // UP(T Function<...>(...), Function) = Function
-        return coreTypes.functionRawType(uniteNullabilities(
-            type1.declaredNullability, type2.declaredNullability));
-      }
-
-      // UP(T Function<...>(...), T2) = Object
-      return coreTypes.objectRawType(uniteNullabilities(
-          type1.declaredNullability, type2.declaredNullability));
-    } else if (type2 is FunctionType) {
-      if (type1 is InterfaceType &&
-          type1.classNode == coreTypes.functionClass) {
-        // UP(Function, T Function<...>(...)) = Function
-        return coreTypes.functionRawType(uniteNullabilities(
-            type1.declaredNullability, type2.declaredNullability));
-      }
-
-      // UP(T1, T Function<...>(...)) = Object
-      return coreTypes.objectRawType(uniteNullabilities(
-          type1.declaredNullability, type2.declaredNullability));
-    }
-
-    if (type1 is FutureOrType || type2 is FutureOrType) {
-      if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
-        return type2;
-      }
-      if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
-        return type1;
-      }
-      if (type1 is FutureOrType && type2 is FutureOrType) {
-        return new FutureOrType(
-            getStandardUpperBound(
-                type1.typeArgument, type2.typeArgument, clientLibrary),
-            uniteNullabilities(
-                type1.declaredNullability, type2.declaredNullability));
-      }
-    }
-
-    // UP(T1, T2) = T2 if T1 <: T2
-    //   Note that both types must be class types at this point.
-    assert(type1 is InterfaceType,
-        "Expected type1 to be an interface type, got '${type1.runtimeType}'.");
-    assert(type2 is InterfaceType,
-        "Expected type2 to be an interface type, got '${type2.runtimeType}'.");
-
-    // We use the non-nullable variants of the two interfaces types to determine
-    // T1 <: T2 without using the nullability of the outermost type. The result
-    // uses [uniteNullabilities] to compute the resulting type if the subtype
-    // relation is established.
-    InterfaceType nonNonNullableType1 =
-        type1.withDeclaredNullability(Nullability.nonNullable);
-    InterfaceType nonNonNullableType2 =
-        type2.withDeclaredNullability(Nullability.nonNullable);
-
-    if (isSubtypeOf(nonNonNullableType1, nonNonNullableType2,
-        SubtypeCheckMode.withNullabilities)) {
-      return type2.withDeclaredNullability(
-          uniteNullabilities(type1.nullability, type2.nullability));
-    }
-
-    // UP(T1, T2) = T1 if T2 <: T1
-    //   Note that both types must be class types at this point.
-    if (isSubtypeOf(nonNonNullableType2, nonNonNullableType1,
-        SubtypeCheckMode.withNullabilities)) {
-      return type1.withDeclaredNullability(uniteNullabilities(
-          type1.declaredNullability, type2.declaredNullability));
-    }
-
-    // UP(C<T0, ..., Tn>, C<S0, ..., Sn>) = C<R0,..., Rn> where Ri is UP(Ti, Si)
-    if (type1 is InterfaceType && type2 is InterfaceType) {
-      Class klass = type1.classNode;
-      if (type2.classNode == klass) {
-        int n = klass.typeParameters.length;
-        List<DartType> leftArguments = type1.typeArguments;
-        List<DartType> rightArguments = type2.typeArguments;
-        List<DartType> typeArguments = new List<DartType>(n);
-        for (int i = 0; i < n; ++i) {
-          int variance = klass.typeParameters[i].variance;
-          if (variance == Variance.contravariant) {
-            typeArguments[i] = _getNullabilityAwareStandardLowerBound(
-                leftArguments[i], rightArguments[i], clientLibrary);
-          } else if (variance == Variance.invariant) {
-            if (!areMutualSubtypes(leftArguments[i], rightArguments[i],
-                SubtypeCheckMode.withNullabilities)) {
-              return getLegacyLeastUpperBound(type1, type2, clientLibrary);
-            }
-          } else {
-            typeArguments[i] = _getNullabilityAwareStandardUpperBound(
-                leftArguments[i], rightArguments[i], clientLibrary);
-          }
-        }
-        return new InterfaceType(
-            klass,
-            uniteNullabilities(
-                type1.declaredNullability, type2.declaredNullability),
-            typeArguments);
-      }
-    }
-
-    // UP(C0<T0, ..., Tn>, C1<S0, ..., Sk>)
-    //   = least upper bound of two interfaces as in Dart 1.
-    return getLegacyLeastUpperBound(type1, type2, clientLibrary);
+    return super.getNullabilityAwareStandardUpperBoundInternal(
+        type1, type2, clientLibrary);
   }
 
-  /// Computes the nullability-aware lower bound of two function types.
-  ///
-  /// The algorithm is defined as follows:
-  /// DOWN(
-  ///   <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k) -> T0,
-  ///   <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1l) -> T1)
-  /// =
-  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
-  /// if:
-  ///   each B0i and B1i are equal types (syntactically),
-  ///   q is max(k, l),
-  ///   R0 is DOWN(T0, T1),
-  ///   B2i is B0i,
-  ///   P2i is UP(P0i, P1i) for i <= than min(k, l),
-  ///   P2i is P0i for k < i <= q,
-  ///   P2i is P1i for l < i <= q, and
-  ///   P2i is optional if P0i or P1i is optional.
-  ///
-  /// DOWN(
-  ///   <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k, Named0) -> T0,
-  ///   <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1k, Named1) -> T1)
-  /// =
-  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
-  /// if:
-  ///   each B0i and B1i are equal types (syntactically),
-  ///   R0 is DOWN(T0, T1),
-  ///   B2i is B0i,
-  ///   P2i is UP(P0i, P1i),
-  ///   Named2 contains R2i xi for each xi in both Named0 and Named1,
-  ///     where R0i xi is in Named0,
-  ///     where R1i xi is in Named1,
-  ///     and R2i is UP(R0i, R1i),
-  ///     and R2i xi is required if xi is required in both Named0 and Named1,
-  ///   Named2 contains R0i xi for each xi in Named0 and not Named1,
-  ///     where xi is optional in Named2,
-  ///   Named2 contains R1i xi for each xi in Named1 and not Named0, and
-  ///     where xi is optional in Named2.
-  /// DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
-  DartType _getNullabilityAwareFunctionStandardLowerBound(
-      FunctionType f, FunctionType g, Library clientLibrary) {
-    bool haveNamed =
-        f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
-    bool haveOptionalPositional =
-        f.requiredParameterCount < f.positionalParameters.length ||
-            g.requiredParameterCount < g.positionalParameters.length;
-
-    // The fallback result for whenever the following rule applies:
-    //     DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
-    final DartType fallbackResult = new NeverType(
-        intersectNullabilities(f.declaredNullability, g.declaredNullability));
-
-    if (haveNamed && haveOptionalPositional) return fallbackResult;
-    if (haveNamed &&
-        f.positionalParameters.length != g.positionalParameters.length) {
-      return fallbackResult;
-    }
-
-    int m = f.typeParameters.length;
-    bool boundsMatch = false;
-    Substitution substitution = Substitution.empty;
-    if (g.typeParameters.length == m) {
-      boundsMatch = true;
-      if (m != 0) {
-        Map<TypeParameter, DartType> substitutionMap =
-            <TypeParameter, DartType>{};
-        for (int i = 0; i < m; ++i) {
-          substitutionMap[g.typeParameters[i]] =
-              new TypeParameterType.forAlphaRenaming(
-                  g.typeParameters[i], f.typeParameters[i]);
-        }
-        substitution = Substitution.fromMap(substitutionMap);
-        for (int i = 0; i < m && boundsMatch; ++i) {
-          // TODO(dmitryas): Figure out if a procedure for syntactic equality
-          // should be used instead.
-          if (!areMutualSubtypes(
-              f.typeParameters[i].bound,
-              substitution.substituteType(g.typeParameters[i].bound),
-              SubtypeCheckMode.withNullabilities)) {
-            boundsMatch = false;
-          }
-        }
-      }
-    }
-    if (!boundsMatch) return fallbackResult;
-    int maxPos =
-        math.max(f.positionalParameters.length, g.positionalParameters.length);
-    int minPos =
-        math.min(f.positionalParameters.length, g.positionalParameters.length);
-
-    List<TypeParameter> typeParameters = f.typeParameters;
-
-    List<DartType> positionalParameters =
-        new List<DartType>.filled(maxPos, null);
-    for (int i = 0; i < minPos; ++i) {
-      positionalParameters[i] = _getNullabilityAwareStandardUpperBound(
-          f.positionalParameters[i],
-          substitution.substituteType(g.positionalParameters[i]),
-          clientLibrary);
-    }
-    for (int i = minPos; i < f.positionalParameters.length; ++i) {
-      positionalParameters[i] = f.positionalParameters[i];
-    }
-    for (int i = minPos; i < g.positionalParameters.length; ++i) {
-      positionalParameters[i] =
-          substitution.substituteType(g.positionalParameters[i]);
-    }
-
-    List<NamedType> namedParameters = <NamedType>[];
-    {
-      // Assuming that the named parameters of both types are sorted
-      // lexicographically.
-      int i = 0;
-      int j = 0;
-      while (i < f.namedParameters.length && j < g.namedParameters.length) {
-        NamedType named1 = f.namedParameters[i];
-        NamedType named2 = g.namedParameters[j];
-        int order = named1.name.compareTo(named2.name);
-        NamedType named;
-        if (order < 0) {
-          named = new NamedType(named1.name, named1.type, isRequired: false);
-          ++i;
-        } else if (order > 0) {
-          named = !named2.isRequired
-              ? named2
-              : new NamedType(
-                  named2.name, substitution.substituteType(named2.type),
-                  isRequired: false);
-          ++j;
-        } else {
-          named = new NamedType(
-              named1.name,
-              _getNullabilityAwareStandardUpperBound(named1.type,
-                  substitution.substituteType(named2.type), clientLibrary),
-              isRequired: named1.isRequired && named2.isRequired);
-          ++i;
-          ++j;
-        }
-        namedParameters.add(named);
-      }
-      while (i < f.namedParameters.length) {
-        NamedType named1 = f.namedParameters[i];
-        namedParameters.add(!named1.isRequired
-            ? named1
-            : new NamedType(named1.name, named1.type, isRequired: false));
-        ++i;
-      }
-      while (j < g.namedParameters.length) {
-        NamedType named2 = g.namedParameters[j];
-        namedParameters.add(new NamedType(
-            named2.name, substitution.substituteType(named2.type),
-            isRequired: false));
-        ++j;
-      }
-    }
-
-    DartType returnType = _getNullabilityAwareStandardLowerBound(
-        f.returnType, substitution.substituteType(g.returnType), clientLibrary);
-
-    return new FunctionType(positionalParameters, returnType,
-        intersectNullabilities(f.declaredNullability, g.declaredNullability),
-        namedParameters: namedParameters,
-        typeParameters: typeParameters,
-        requiredParameterCount: minPos);
-  }
-
-  /// Computes the nullability-aware lower bound of two function types.
-  ///
-  /// UP(
-  ///   <X0 extends B00, ... Xm extends B0m>(P00, ... P0k) -> T0,
-  ///   <X0 extends B10, ... Xm extends B1m>(P10, ... P1l) -> T1)
-  /// =
-  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
-  /// if:
-  ///   each B0i and B1i are equal types (syntactically)
-  ///   Both have the same number of required positional parameters
-  ///   q is min(k, l)
-  ///   R0 is UP(T0, T1)
-  ///   B2i is B0i
-  ///   P2i is DOWN(P0i, P1i)
-  /// UP(
-  ///   <X0 extends B00, ... Xm extends B0m>(P00, ... P0k, Named0) -> T0,
-  ///   <X0 extends B10, ... Xm extends B1m>(P10, ... P1k, Named1) -> T1)
-  /// =
-  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
-  /// if:
-  ///   each B0i and B1i are equal types (syntactically)
-  ///   All positional parameters are required
-  ///   R0 is UP(T0, T1)
-  ///   B2i is B0i
-  ///   P2i is DOWN(P0i, P1i)
-  ///   Named0 contains R0i xi
-  ///       if R1i xi is a required named parameter in Named1
-  ///   Named1 contains R1i xi
-  ///       if R0i xi is a required named parameter in Named0
-  ///   Named2 contains exactly R2i xi
-  ///       for each xi in both Named0 and Named1
-  ///     where R0i xi is in Named0
-  ///     where R1i xi is in Named1
-  ///     and R2i is DOWN(R0i, R1i)
-  ///     and R2i xi is required
-  ///         if xi is required in either Named0 or Named1
-  /// UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
-  DartType _getNullabilityAwareFunctionStandardUpperBound(
-      FunctionType f, FunctionType g, Library clientLibrary) {
-    bool haveNamed =
-        f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
-    bool haveOptionalPositional =
-        f.requiredParameterCount < f.positionalParameters.length ||
-            g.requiredParameterCount < g.positionalParameters.length;
-
-    // The return value for whenever the following applies:
-    //     UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
-    final DartType fallbackResult = coreTypes.functionRawType(
-        uniteNullabilities(f.declaredNullability, g.declaredNullability));
-
-    if (haveNamed && haveOptionalPositional) return fallbackResult;
-    if (!haveNamed && f.requiredParameterCount != g.requiredParameterCount) {
-      return fallbackResult;
-    }
-    // Here we perform a quick check on the function types to figure out if we
-    // can compute a non-trivial upper bound for them.  The check isn't merged
-    // with the computation of the non-trivial upper bound itself to avoid
-    // performing unnecessary computations.
-    if (haveNamed) {
-      if (f.positionalParameters.length != g.positionalParameters.length) {
-        return fallbackResult;
-      }
-      // Assuming that the named parameters are sorted lexicographically in
-      // both type1 and type2.
-      int i = 0;
-      int j = 0;
-      while (i < f.namedParameters.length && j < g.namedParameters.length) {
-        NamedType named1 = f.namedParameters[i];
-        NamedType named2 = g.namedParameters[j];
-        int order = named1.name.compareTo(named2.name);
-        if (order < 0) {
-          if (named1.isRequired) return fallbackResult;
-          ++i;
-        } else if (order > 0) {
-          if (named2.isRequired) return fallbackResult;
-          ++j;
-        } else {
-          ++i;
-          ++j;
-        }
-      }
-      while (i < f.namedParameters.length) {
-        if (f.namedParameters[i].isRequired) return fallbackResult;
-        ++i;
-      }
-      while (j < g.namedParameters.length) {
-        if (g.namedParameters[j].isRequired) return fallbackResult;
-        ++j;
-      }
-    }
-
-    int m = f.typeParameters.length;
-    bool boundsMatch = false;
-    Substitution substitution = Substitution.empty;
-    if (g.typeParameters.length == m) {
-      boundsMatch = true;
-      if (m != 0) {
-        Map<TypeParameter, DartType> substitutionMap =
-            <TypeParameter, DartType>{};
-        for (int i = 0; i < m; ++i) {
-          substitutionMap[g.typeParameters[i]] =
-              new TypeParameterType.forAlphaRenaming(
-                  g.typeParameters[i], f.typeParameters[i]);
-        }
-        substitution = Substitution.fromMap(substitutionMap);
-        for (int i = 0; i < m && boundsMatch; ++i) {
-          // TODO(dmitryas): Figure out if a procedure for syntactic
-          // equality should be used instead.
-          if (!areMutualSubtypes(
-              f.typeParameters[i].bound,
-              substitution.substituteType(g.typeParameters[i].bound),
-              SubtypeCheckMode.withNullabilities)) {
-            boundsMatch = false;
-          }
-        }
-      }
-    }
-    if (!boundsMatch) return fallbackResult;
-    int minPos =
-        math.min(f.positionalParameters.length, g.positionalParameters.length);
-
-    List<TypeParameter> typeParameters = f.typeParameters;
-
-    List<DartType> positionalParameters =
-        new List<DartType>.filled(minPos, null);
-    for (int i = 0; i < minPos; ++i) {
-      positionalParameters[i] = _getNullabilityAwareStandardLowerBound(
-          f.positionalParameters[i],
-          substitution.substituteType(g.positionalParameters[i]),
-          clientLibrary);
-    }
-
-    List<NamedType> namedParameters = <NamedType>[];
-    {
-      // Assuming that the named parameters of both types are sorted
-      // lexicographically.
-      int i = 0;
-      int j = 0;
-      while (i < f.namedParameters.length && j < g.namedParameters.length) {
-        NamedType named1 = f.namedParameters[i];
-        NamedType named2 = g.namedParameters[j];
-        int order = named1.name.compareTo(named2.name);
-        if (order < 0) {
-          ++i;
-        } else if (order > 0) {
-          ++j;
-        } else {
-          namedParameters.add(new NamedType(
-              named1.name,
-              _getNullabilityAwareStandardLowerBound(named1.type,
-                  substitution.substituteType(named2.type), clientLibrary),
-              isRequired: named1.isRequired || named2.isRequired));
-          ++i;
-          ++j;
-        }
-      }
-    }
-
-    DartType returnType = _getNullabilityAwareStandardUpperBound(
-        f.returnType, substitution.substituteType(g.returnType), clientLibrary);
-
-    return new FunctionType(positionalParameters, returnType,
-        uniteNullabilities(f.declaredNullability, g.declaredNullability),
-        namedParameters: namedParameters,
-        typeParameters: typeParameters,
-        requiredParameterCount: f.requiredParameterCount);
-  }
-
-  DartType _getNullabilityAwareTypeParameterStandardUpperBound(
-      TypeParameterType type1, DartType type2, Library clientLibrary) {
-    if (type1.promotedBound == null) {
-      // UP(X1 extends B1, T2) =
-      //   T2 if X1 <: T2
-      //   otherwise X1 if T2 <: X1
-      //   otherwise UP(B1[Object/X1], T2)
-      if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
-        return type2.withDeclaredNullability(uniteNullabilities(
-            type1.declaredNullability, type2.declaredNullability));
-      }
-      if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
-        return type1.withDeclaredNullability(uniteNullabilities(
-            type1.declaredNullability, type2.declaredNullability));
-      }
-      Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
-        type1.parameter: coreTypes.objectNonNullableRawType
-      };
-      return _getNullabilityAwareStandardUpperBound(
-              substitute(type1.parameter.bound, substitution),
-              type2,
-              clientLibrary)
-          .withDeclaredNullability(uniteNullabilities(
-              type1.declaredNullability, type2.declaredNullability));
-    } else {
-      // UP(X1 & B1, T2) =
-      //   T2 if X1 <: T2
-      //   otherwise X1 if T2 <: X1
-      //   otherwise UP(B1[Object/X1], T2)
-      DartType demoted =
-          new TypeParameterType(type1.parameter, type1.declaredNullability);
-      if (isSubtypeOf(demoted, type2, SubtypeCheckMode.withNullabilities)) {
-        return type2.withDeclaredNullability(uniteNullabilities(
-            type1.declaredNullability, type2.declaredNullability));
-      }
-      if (isSubtypeOf(type2, demoted, SubtypeCheckMode.withNullabilities)) {
-        return demoted.withDeclaredNullability(uniteNullabilities(
-            type1.declaredNullability, type2.declaredNullability));
-      }
-      Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
-        type1.parameter: coreTypes.objectNonNullableRawType
-      };
-      return _getNullabilityAwareStandardUpperBound(
-              substitute(type1.promotedBound, substitution),
-              type2,
-              clientLibrary)
-          .withDeclaredNullability(uniteNullabilities(
-              type1.declaredNullability, type2.declaredNullability));
-    }
-  }
-
-  DartType _getNullabilityObliviousStandardUpperBound(
+  @override
+  DartType getNullabilityObliviousStandardUpperBoundInternal(
       DartType type1, DartType type2, Library clientLibrary) {
-    /*assert(type1 == legacyErasure(coreTypes, type1),
-        "Non-legacy type $type1 in inference.");
-    assert(type2 == legacyErasure(coreTypes, type2),
-        "Non-legacy type $type2 in inference.");*/
-    // For all types T, SUB(T,T) = T.  Note that we don't test for equality
-    // because we don't want to make the algorithm quadratic.  This is ok
-    // because the check is not needed for correctness; it's just a speed
-    // optimization.
-    if (identical(type1, type2)) {
-      return type1;
-    }
-
     // For any type T, SUB(?, T) = SUB(T, ?) = T.
     if (type1 is UnknownType) {
       return type2;
@@ -1240,382 +68,7 @@
     if (type2 is UnknownType) {
       return type1;
     }
-
-    // SUB(void, T) = SUB(T, void) = void.
-    if (type1 is VoidType) {
-      return type1;
-    }
-    if (type2 is VoidType) {
-      return type2;
-    }
-
-    // SUB(dynamic, T) = SUB(T, dynamic) = dynamic if T is not void.
-    if (type1 is DynamicType) {
-      return type1;
-    }
-    if (type2 is DynamicType) {
-      return type2;
-    }
-
-    // SUB(Object, T) = SUB(T, Object) = Object if T is not void or dynamic.
-    if (type1 == coreTypes.objectLegacyRawType) {
-      return type1;
-    }
-    if (type2 == coreTypes.objectLegacyRawType) {
-      return type2;
-    }
-
-    // SUB(bottom, T) = SUB(T, bottom) = T.
-    if (type1 is BottomType) return type2;
-    if (type2 is BottomType) return type1;
-    if (type1 == coreTypes.nullType) return type2;
-    if (type2 == coreTypes.nullType) return type1;
-
-    if (type1 is TypeParameterType || type2 is TypeParameterType) {
-      return _getNullabilityObliviousTypeParameterStandardUpperBound(
-          type1, type2, clientLibrary);
-    }
-
-    // The standard upper bound of a function type and an interface type T is
-    // the standard upper bound of Function and T.
-    if (type1 is FunctionType &&
-        (type2 is InterfaceType || type2 is FutureOrType)) {
-      type1 = coreTypes.functionLegacyRawType;
-    }
-    if (type2 is FunctionType &&
-        (type1 is InterfaceType || type2 is FutureOrType)) {
-      type2 = coreTypes.functionLegacyRawType;
-    }
-
-    // At this point type1 and type2 should both either be interface types or
-    // function types.
-    if (type1 is InterfaceType && type2 is InterfaceType) {
-      return _getInterfaceStandardUpperBound(type1, type2, clientLibrary);
-    }
-
-    if (type1 is FunctionType && type2 is FunctionType) {
-      return _getNullabilityObliviousFunctionStandardUpperBound(
-          type1, type2, clientLibrary);
-    }
-
-    if (type1 is FutureOrType || type2 is FutureOrType) {
-      if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
-        return type2;
-      }
-      if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
-        return type1;
-      }
-      if (type1 is FutureOrType && type2 is FutureOrType) {
-        return new FutureOrType(
-            getStandardUpperBound(
-                type1.typeArgument, type2.typeArgument, clientLibrary),
-            uniteNullabilities(
-                type1.declaredNullability, type2.declaredNullability));
-      }
-    }
-
-    if (type1 is InvalidType || type2 is InvalidType) {
-      return const InvalidType();
-    }
-
-    // Should never happen. As a defensive measure, return the dynamic type.
-    assert(false, "type1 = $type1; type2 = $type2");
-    return const DynamicType();
-  }
-
-  /// Compute the standard lower bound of function types [f] and [g].
-  ///
-  /// The spec rules for SLB on function types, informally, are pretty simple:
-  ///
-  /// - If a parameter is required in both, it stays required.
-  ///
-  /// - If a positional parameter is optional or missing in one, it becomes
-  ///   optional.  (This is because we're trying to build a function type which
-  ///   is a subtype of both [f] and [g], meaning it accepts all possible inputs
-  ///   that [f] and [g] accept.)
-  ///
-  /// - Named parameters are unioned together.
-  ///
-  /// - For any parameter that exists in both functions, use the SUB of them as
-  ///   the resulting parameter type.
-  ///
-  /// - Use the SLB of their return types.
-  DartType _getNullabilityObliviousFunctionStandardLowerBound(
-      FunctionType f, FunctionType g, Library clientLibrary) {
-    // TODO(rnystrom,paulberry): Right now, this assumes f and g do not have any
-    // type parameters. Revisit that in the presence of generic methods.
-
-    // Calculate the SUB of each corresponding pair of parameters.
-    int totalPositional =
-        math.max(f.positionalParameters.length, g.positionalParameters.length);
-    List<DartType> positionalParameters = new List<DartType>(totalPositional);
-    for (int i = 0; i < totalPositional; i++) {
-      if (i < f.positionalParameters.length) {
-        DartType fType = f.positionalParameters[i];
-        if (i < g.positionalParameters.length) {
-          DartType gType = g.positionalParameters[i];
-          positionalParameters[i] =
-              getStandardUpperBound(fType, gType, clientLibrary);
-        } else {
-          positionalParameters[i] = fType;
-        }
-      } else {
-        positionalParameters[i] = g.positionalParameters[i];
-      }
-    }
-
-    // Parameters that are required in both functions are required in the
-    // result.  Parameters that are optional or missing in either end up
-    // optional.
-    int requiredParameterCount =
-        math.min(f.requiredParameterCount, g.requiredParameterCount);
-    bool hasPositional = requiredParameterCount < totalPositional;
-
-    // Union the named parameters together.
-    List<NamedType> namedParameters = [];
-    {
-      int i = 0;
-      int j = 0;
-      while (true) {
-        if (i < f.namedParameters.length) {
-          if (j < g.namedParameters.length) {
-            String fName = f.namedParameters[i].name;
-            String gName = g.namedParameters[j].name;
-            int order = fName.compareTo(gName);
-            if (order < 0) {
-              namedParameters.add(f.namedParameters[i++]);
-            } else if (order > 0) {
-              namedParameters.add(g.namedParameters[j++]);
-            } else {
-              namedParameters.add(new NamedType(
-                  fName,
-                  getStandardUpperBound(f.namedParameters[i++].type,
-                      g.namedParameters[j++].type, clientLibrary)));
-            }
-          } else {
-            namedParameters.addAll(f.namedParameters.skip(i));
-            break;
-          }
-        } else {
-          namedParameters.addAll(g.namedParameters.skip(j));
-          break;
-        }
-      }
-    }
-    bool hasNamed = namedParameters.isNotEmpty;
-
-    // Edge case. Dart does not support functions with both optional positional
-    // and named parameters. If we would synthesize that, give up.
-    if (hasPositional && hasNamed) return const BottomType();
-
-    // Calculate the SLB of the return type.
-    DartType returnType =
-        getStandardLowerBound(f.returnType, g.returnType, clientLibrary);
-    return new FunctionType(positionalParameters, returnType,
-        intersectNullabilities(f.declaredNullability, g.declaredNullability),
-        namedParameters: namedParameters,
-        requiredParameterCount: requiredParameterCount);
-  }
-
-  /// Compute the standard upper bound of function types [f] and [g].
-  ///
-  /// The rules for SUB on function types, informally, are pretty simple:
-  ///
-  /// - If the functions don't have the same number of required parameters,
-  ///   always return `Function`.
-  ///
-  /// - Discard any optional named or positional parameters the two types do not
-  ///   have in common.
-  ///
-  /// - Compute the SLB of each corresponding pair of parameter types, and the
-  ///   SUB of the return types.  Return a function type with those types.
-  DartType _getNullabilityObliviousFunctionStandardUpperBound(
-      FunctionType f, FunctionType g, Library clientLibrary) {
-    // TODO(rnystrom): Right now, this assumes f and g do not have any type
-    // parameters. Revisit that in the presence of generic methods.
-
-    // If F and G differ in their number of required parameters, then the
-    // standard upper bound of F and G is Function.
-    // TODO(paulberry): We could do better here, e.g.:
-    //   SUB(([int]) -> void, (int) -> void) = (int) -> void
-    if (f.requiredParameterCount != g.requiredParameterCount) {
-      return new InterfaceType(
-          coreTypes.functionClass,
-          uniteNullabilities(f.declaredNullability, g.declaredNullability),
-          const <DynamicType>[]);
-    }
-    int requiredParameterCount = f.requiredParameterCount;
-
-    // Calculate the SLB of each corresponding pair of parameters.
-    // Ignore any extra optional positional parameters if one has more than the
-    // other.
-    int totalPositional =
-        math.min(f.positionalParameters.length, g.positionalParameters.length);
-    List<DartType> positionalParameters = new List<DartType>(totalPositional);
-    for (int i = 0; i < totalPositional; i++) {
-      positionalParameters[i] = getStandardLowerBound(
-          f.positionalParameters[i], g.positionalParameters[i], clientLibrary);
-    }
-
-    // Intersect the named parameters.
-    List<NamedType> namedParameters = [];
-    {
-      int i = 0;
-      int j = 0;
-      while (true) {
-        if (i < f.namedParameters.length) {
-          if (j < g.namedParameters.length) {
-            String fName = f.namedParameters[i].name;
-            String gName = g.namedParameters[j].name;
-            int order = fName.compareTo(gName);
-            if (order < 0) {
-              i++;
-            } else if (order > 0) {
-              j++;
-            } else {
-              namedParameters.add(new NamedType(
-                  fName,
-                  getStandardLowerBound(f.namedParameters[i++].type,
-                      g.namedParameters[j++].type, clientLibrary)));
-            }
-          } else {
-            break;
-          }
-        } else {
-          break;
-        }
-      }
-    }
-
-    // Calculate the SUB of the return type.
-    DartType returnType =
-        getStandardUpperBound(f.returnType, g.returnType, clientLibrary);
-    return new FunctionType(positionalParameters, returnType,
-        uniteNullabilities(f.declaredNullability, g.declaredNullability),
-        namedParameters: namedParameters,
-        requiredParameterCount: requiredParameterCount);
-  }
-
-  DartType _getInterfaceStandardUpperBound(
-      InterfaceType type1, InterfaceType type2, Library clientLibrary) {
-    // This currently does not implement a very complete standard upper bound
-    // algorithm, but handles a couple of the very common cases that are
-    // causing pain in real code.  The current algorithm is:
-    // 1. If either of the types is a supertype of the other, return it.
-    //    This is in fact the best result in this case.
-    // 2. If the two types have the same class element and is implicitly or
-    //    explicitly covariant, then take the pointwise standard upper bound of
-    //    the type arguments. This is again the best result, except that the
-    //    recursive calls may not return the true standard upper bounds.  The
-    //    result is guaranteed to be a well-formed type under the assumption
-    //    that the input types were well-formed (and assuming that the
-    //    recursive calls return well-formed types).
-    //    If the variance of the type parameter is contravariant, we take the
-    //    standard lower bound of the type arguments. If the variance of the
-    //    type parameter is invariant, we verify if the type arguments satisfy
-    //    subtyping in both directions, then choose a bound.
-    // 3. Otherwise return the spec-defined standard upper bound.  This will
-    //    be an upper bound, might (or might not) be least, and might
-    //    (or might not) be a well-formed type.
-    if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
-      return type2;
-    }
-    if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
-      return type1;
-    }
-    if (identical(type1.classNode, type2.classNode)) {
-      List<DartType> tArgs1 = type1.typeArguments;
-      List<DartType> tArgs2 = type2.typeArguments;
-      List<TypeParameter> tParams = type1.classNode.typeParameters;
-
-      assert(tArgs1.length == tArgs2.length);
-      assert(tArgs1.length == tParams.length);
-      List<DartType> tArgs = new List(tArgs1.length);
-      for (int i = 0; i < tArgs1.length; i++) {
-        if (tParams[i].variance == Variance.contravariant) {
-          tArgs[i] = getStandardLowerBound(tArgs1[i], tArgs2[i], clientLibrary);
-        } else if (tParams[i].variance == Variance.invariant) {
-          if (!areMutualSubtypes(
-              tArgs1[i], tArgs2[i], SubtypeCheckMode.withNullabilities)) {
-            // No bound will be valid, find bound at the interface level.
-            return getLegacyLeastUpperBound(type1, type2, clientLibrary);
-          }
-          // TODO (kallentu) : Fix asymmetric bounds behavior for invariant type
-          //  parameters.
-          tArgs[i] = tArgs1[i];
-        } else {
-          tArgs[i] = getStandardUpperBound(tArgs1[i], tArgs2[i], clientLibrary);
-        }
-      }
-      return new InterfaceType(
-          type1.classNode,
-          uniteNullabilities(
-              type1.declaredNullability, type2.declaredNullability),
-          tArgs);
-    }
-    return getLegacyLeastUpperBound(type1, type2, clientLibrary);
-  }
-
-  DartType _getNullabilityObliviousTypeParameterStandardUpperBound(
-      DartType type1, DartType type2, Library clientLibrary) {
-    // This currently just implements a simple standard upper bound to
-    // handle some common cases.  It also avoids some termination issues
-    // with the naive spec algorithm.  The standard upper bound of two types
-    // (at least one of which is a type parameter) is computed here as:
-    // 1. If either type is a supertype of the other, return it.
-    // 2. If the first type is a type parameter, replace it with its bound,
-    //    with recursive occurrences of itself replaced with Object.
-    //    The second part of this should ensure termination.  Informally,
-    //    each type variable instantiation in one of the arguments to the
-    //    standard upper bound algorithm now strictly reduces the number
-    //    of bound variables in scope in that argument position.
-    // 3. If the second type is a type parameter, do the symmetric operation
-    //    to #2.
-    //
-    // It's not immediately obvious why this is symmetric in the case that both
-    // of them are type parameters.  For #1, symmetry holds since subtype
-    // is antisymmetric.  For #2, it's clearly not symmetric if upper bounds of
-    // bottom are allowed.  Ignoring this (for various reasons, not least
-    // of which that there's no way to write it), there's an informal
-    // argument (that might even be right) that you will always either
-    // end up expanding both of them or else returning the same result no matter
-    // which order you expand them in.  A key observation is that
-    // identical(expand(type1), type2) => subtype(type1, type2)
-    // and hence the contra-positive.
-    //
-    // TODO(leafp): Think this through and figure out what's the right
-    // definition.  Be careful about termination.
-    //
-    // I suspect in general a reasonable algorithm is to expand the innermost
-    // type variable first.  Alternatively, you could probably choose to treat
-    // it as just an instance of the interface type upper bound problem, with
-    // the "inheritance" chain extended by the bounds placed on the variables.
-    if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
-      return type2;
-    }
-    if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
-      return type1;
-    }
-    if (type1 is TypeParameterType) {
-      // TODO(paulberry): Analyzer collapses simple bounds in one step, i.e. for
-      // C<T extends U, U extends List>, T gets resolved directly to List.  Do
-      // we need to replicate that behavior?
-      return getStandardUpperBound(
-          Substitution.fromMap({type1.parameter: coreTypes.objectLegacyRawType})
-              .substituteType(type1.parameter.bound),
-          type2,
-          clientLibrary);
-    } else if (type2 is TypeParameterType) {
-      return getStandardUpperBound(
-          type1,
-          Substitution.fromMap({type2.parameter: coreTypes.objectLegacyRawType})
-              .substituteType(type2.parameter.bound),
-          clientLibrary);
-    } else {
-      // We should only be called when at least one of the types is a
-      // TypeParameterType
-      assert(false);
-      return const DynamicType();
-    }
+    return super.getNullabilityObliviousStandardUpperBoundInternal(
+        type1, type2, clientLibrary);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 8a268cb..4586a2a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1651,7 +1651,8 @@
   InvocationInferenceResult inferInvocation(DartType typeContext, int offset,
       FunctionType calleeType, Arguments arguments,
       {List<VariableDeclaration> hoistedExpressions,
-      bool isOverloadedArithmeticOperator: false,
+      bool isSpecialCasedBinaryOperator: false,
+      bool isSpecialCasedTernaryOperator: false,
       DartType returnType,
       DartType receiverType,
       bool skipTypeArgumentInference: false,
@@ -1668,7 +1669,8 @@
           "Unexpected explicit return type for extension method invocation.");
       return _inferGenericExtensionMethodInvocation(extensionTypeParameterCount,
           typeContext, offset, calleeType, arguments, hoistedExpressions,
-          isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+          isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+          isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
           receiverType: receiverType,
           skipTypeArgumentInference: skipTypeArgumentInference,
           isConst: isConst,
@@ -1676,7 +1678,8 @@
     }
     return _inferInvocation(
         typeContext, offset, calleeType, arguments, hoistedExpressions,
-        isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+        isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+        isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
         receiverType: receiverType,
         returnType: returnType,
         skipTypeArgumentInference: skipTypeArgumentInference,
@@ -1692,7 +1695,8 @@
       FunctionType calleeType,
       Arguments arguments,
       List<VariableDeclaration> hoistedExpressions,
-      {bool isOverloadedArithmeticOperator: false,
+      {bool isSpecialCasedBinaryOperator: false,
+      bool isSpecialCasedTernaryOperator: false,
       DartType receiverType,
       bool skipTypeArgumentInference: false,
       bool isConst: false,
@@ -1737,7 +1741,8 @@
         named: arguments.named, types: getExplicitTypeArguments(arguments));
     InvocationInferenceResult result = _inferInvocation(typeContext, offset,
         targetFunctionType, targetArguments, hoistedExpressions,
-        isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+        isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+        isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
         skipTypeArgumentInference: skipTypeArgumentInference,
         isConst: isConst,
         isImplicitCall: isImplicitCall);
@@ -1762,7 +1767,8 @@
       FunctionType calleeType,
       Arguments arguments,
       List<VariableDeclaration> hoistedExpressions,
-      {bool isOverloadedArithmeticOperator: false,
+      {bool isSpecialCasedBinaryOperator: false,
+      bool isSpecialCasedTernaryOperator: false,
       DartType receiverType,
       DartType returnType,
       bool skipTypeArgumentInference: false,
@@ -1854,13 +1860,25 @@
             "invocation.");
         continue;
       } else {
+        if (isSpecialCasedBinaryOperator) {
+          inferredFormalType =
+              typeSchemaEnvironment.getContextTypeOfSpecialCasedBinaryOperator(
+                  typeContext, receiverType, inferredFormalType,
+                  isNonNullableByDefault: isNonNullableByDefault);
+        } else if (isSpecialCasedTernaryOperator) {
+          inferredFormalType =
+              typeSchemaEnvironment.getContextTypeOfSpecialCasedTernaryOperator(
+                  typeContext, receiverType, inferredFormalType,
+                  isNonNullableByDefault: isNonNullableByDefault);
+        }
         ExpressionInferenceResult result = inferExpression(
             arguments.positional[position],
             isNonNullableByDefault
                 ? inferredFormalType
                 : legacyErasure(coreTypes, inferredFormalType),
             inferenceNeeded ||
-                isOverloadedArithmeticOperator ||
+                isSpecialCasedBinaryOperator ||
+                isSpecialCasedTernaryOperator ||
                 typeChecksNeeded);
         inferredType = result.inferredType == null || isNonNullableByDefault
             ? result.inferredType
@@ -1873,10 +1891,14 @@
         formalTypes.add(formalType);
         actualTypes.add(inferredType);
       }
-      if (isOverloadedArithmeticOperator) {
-        returnType = typeSchemaEnvironment.getTypeOfOverloadedArithmetic(
-            receiverType, inferredType);
-      }
+    }
+    if (isSpecialCasedBinaryOperator) {
+      returnType = typeSchemaEnvironment.getTypeOfSpecialCasedBinaryOperator(
+          receiverType, actualTypes[0],
+          isNonNullableByDefault: isNonNullableByDefault);
+    } else if (isSpecialCasedTernaryOperator) {
+      returnType = typeSchemaEnvironment.getTypeOfSpecialCasedTernaryOperator(
+          receiverType, actualTypes[0], actualTypes[1], library.library);
     }
     for (NamedExpression namedArgument in arguments.named) {
       DartType formalType =
@@ -1889,9 +1911,7 @@
           isNonNullableByDefault
               ? inferredFormalType
               : legacyErasure(coreTypes, inferredFormalType),
-          inferenceNeeded ||
-              isOverloadedArithmeticOperator ||
-              typeChecksNeeded);
+          inferenceNeeded || isSpecialCasedBinaryOperator || typeChecksNeeded);
       DartType inferredType =
           result.inferredType == null || isNonNullableByDefault
               ? result.inferredType
@@ -2134,12 +2154,15 @@
       if (formal.isImplicitlyTyped) {
         DartType inferredType;
         if (formalTypesFromContext[i] != null) {
-          if (coreTypes.isBottom(formalTypesFromContext[i]) ||
-              coreTypes.isNull(formalTypesFromContext[i])) {
+          inferredType = computeGreatestClosure2(
+              substitution.substituteType(formalTypesFromContext[i]));
+          if (typeSchemaEnvironment.isSubtypeOf(
+              inferredType,
+              coreTypes.nullType,
+              isNonNullableByDefault
+                  ? SubtypeCheckMode.withNullabilities
+                  : SubtypeCheckMode.ignoringNullabilities)) {
             inferredType = coreTypes.objectRawType(library.nullable);
-          } else {
-            inferredType = computeGreatestClosure2(
-                substitution.substituteType(formalTypesFromContext[i]));
           }
         } else {
           inferredType = const DynamicType();
@@ -2479,8 +2502,12 @@
       Arguments arguments,
       DartType typeContext,
       List<VariableDeclaration> hoistedExpressions,
-      {bool isImplicitCall}) {
+      {bool isImplicitCall,
+      bool isSpecialCasedBinaryOperator,
+      bool isSpecialCasedTernaryOperator}) {
     assert(isImplicitCall != null);
+    assert(isSpecialCasedBinaryOperator != null);
+    assert(isSpecialCasedTernaryOperator != null);
     assert(target.isInstanceMember || target.isNullableInstanceMember);
     Procedure method = target.member;
     assert(method.kind == ProcedureKind.Method,
@@ -2521,7 +2548,9 @@
         typeContext, fileOffset, functionType, arguments,
         hoistedExpressions: hoistedExpressions,
         receiverType: receiverType,
-        isImplicitCall: isImplicitCall);
+        isImplicitCall: isImplicitCall,
+        isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+        isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator);
 
     Expression replacement;
     if (contravariantCheck) {
@@ -2837,6 +2866,7 @@
     ObjectAccessTarget target = findInterfaceMember(
         receiverType, name, fileOffset,
         instrumented: true, includeExtensionMethods: true);
+
     switch (target.kind) {
       case ObjectAccessTargetKind.instanceMember:
       case ObjectAccessTargetKind.nullableInstanceMember:
@@ -2854,6 +2884,9 @@
                 hoistedExpressions,
                 isExpressionInvocation: isExpressionInvocation);
           } else {
+            bool isSpecialCasedBinaryOperator =
+                isSpecialCasedBinaryOperatorForReceiverType(
+                    target, receiverType);
             return _inferInstanceMethodInvocation(
                 fileOffset,
                 nullAwareGuards,
@@ -2863,7 +2896,10 @@
                 arguments,
                 typeContext,
                 hoistedExpressions,
-                isImplicitCall: isImplicitCall);
+                isImplicitCall: isImplicitCall,
+                isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+                isSpecialCasedTernaryOperator:
+                    isSpecialCasedTernaryOperator(target));
           }
         } else {
           return _inferInstanceFieldInvocation(
@@ -2969,12 +3005,20 @@
     }
   }
 
-  bool isOverloadedArithmeticOperatorAndType(
+  bool isSpecialCasedBinaryOperatorForReceiverType(
       ObjectAccessTarget target, DartType receiverType) {
     return (target.isInstanceMember || target.isNullableInstanceMember) &&
         target.member is Procedure &&
-        typeSchemaEnvironment.isOverloadedArithmeticOperatorAndType(
-            target.member, receiverType);
+        typeSchemaEnvironment.isSpecialCasesBinaryForReceiverType(
+            target.member, receiverType,
+            isNonNullableByDefault: isNonNullableByDefault);
+  }
+
+  bool isSpecialCasedTernaryOperator(ObjectAccessTarget target) {
+    return (target.isInstanceMember || target.isNullableInstanceMember) &&
+        target.member is Procedure &&
+        typeSchemaEnvironment.isSpecialCasedTernaryOperator(target.member,
+            isNonNullableByDefault: isNonNullableByDefault);
   }
 
   /// Performs the core type inference algorithm for super method invocations.
@@ -2987,14 +3031,22 @@
     Name methodName = expression.name;
     Arguments arguments = expression.arguments;
     DartType receiverType = thisType;
-    bool isOverloadedArithmeticOperator =
-        isOverloadedArithmeticOperatorAndType(target, receiverType);
+    bool isSpecialCasedBinaryOperator =
+        isSpecialCasedBinaryOperatorForReceiverType(target, receiverType);
     DartType calleeType = getGetterType(target, receiverType);
     FunctionType functionType = getFunctionType(target, receiverType);
-
+    if (isNonNullableByDefault &&
+        expression.name == equalsName &&
+        functionType.positionalParameters.length == 1) {
+      // operator == always allows nullable arguments.
+      functionType = new FunctionType([
+        functionType.positionalParameters.single
+            .withDeclaredNullability(library.nullable)
+      ], functionType.returnType, functionType.declaredNullability);
+    }
     InvocationInferenceResult result = inferInvocation(
         typeContext, fileOffset, functionType, arguments,
-        isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+        isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
         receiverType: receiverType,
         isImplicitExtensionMember: target.isExtensionMember);
     DartType inferredType = result.inferredType;
@@ -3175,7 +3227,7 @@
       DartType step1 = resolveOneStep(hare);
       if (step1 == null) return hare;
       DartType step2 = resolveOneStep(step1);
-      if (step2 == null) return hare;
+      if (step2 == null) return step1;
       hare = step2;
 
       // Tortoise takes one step
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index db7ce6d..e146a54 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -28,7 +28,7 @@
 import 'package:kernel/src/hierarchy_based_type_environment.dart'
     show HierarchyBasedTypeEnvironment;
 
-import 'standard_bounds.dart' show StandardBounds;
+import 'standard_bounds.dart' show TypeSchemaStandardBounds;
 
 import 'type_constraint_gatherer.dart' show TypeConstraintGatherer;
 
@@ -38,8 +38,6 @@
 
 import 'type_schema_elimination.dart' show greatestClosure, leastClosure;
 
-import '../problems.dart';
-
 // TODO(paulberry): try to push this functionality into kernel.
 FunctionType substituteTypeParams(
     FunctionType type,
@@ -101,7 +99,7 @@
 }
 
 class TypeSchemaEnvironment extends HierarchyBasedTypeEnvironment
-    with StandardBounds {
+    with TypeSchemaStandardBounds {
   final ClassHierarchy hierarchy;
 
   TypeSchemaEnvironment(CoreTypes coreTypes, this.hierarchy)
@@ -119,24 +117,6 @@
     return coreTypes.objectRawType(nullability);
   }
 
-  bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
-    IsSubtypeOf result = performNullabilityAwareMutualSubtypesCheck(s, t);
-    switch (mode) {
-      case SubtypeCheckMode.ignoringNullabilities:
-        return result.isSubtypeWhenIgnoringNullabilities();
-      case SubtypeCheckMode.withNullabilities:
-        return result.isSubtypeWhenUsingNullabilities();
-    }
-    return unhandled(
-        "$mode", "TypeSchemaEnvironment.areMutualSubtypes", -1, null);
-  }
-
-  InterfaceType getLegacyLeastUpperBound(
-      InterfaceType type1, InterfaceType type2, Library clientLibrary) {
-    return hierarchy.getLegacyLeastUpperBound(
-        type1, type2, clientLibrary, this.coreTypes);
-  }
-
   /// Modify the given [constraint]'s lower bound to include [lower].
   void addLowerBound(
       TypeConstraint constraint, DartType lower, Library clientLibrary) {
@@ -152,19 +132,103 @@
   }
 
   @override
-  DartType getTypeOfOverloadedArithmetic(DartType type1, DartType type2) {
-    // TODO(paulberry): this matches what is defined in the spec.  It would be
-    // nice if we could change kernel to match the spec and not have to
-    // override.
-    if (type1 is InterfaceType && type1.classNode == coreTypes.intClass) {
-      if (type2 is InterfaceType && type2.classNode == coreTypes.intClass) {
-        return type2.withDeclaredNullability(type1.nullability);
+  DartType getTypeOfSpecialCasedBinaryOperator(DartType type1, DartType type2,
+      {bool isNonNullableByDefault: false}) {
+    if (isNonNullableByDefault) {
+      return super.getTypeOfSpecialCasedBinaryOperator(type1, type2,
+          isNonNullableByDefault: isNonNullableByDefault);
+    } else {
+      // TODO(paulberry): this matches what is defined in the spec.  It would be
+      // nice if we could change kernel to match the spec and not have to
+      // override.
+      if (type1 is InterfaceType && type1.classNode == coreTypes.intClass) {
+        if (type2 is InterfaceType && type2.classNode == coreTypes.intClass) {
+          return type2.withDeclaredNullability(type1.nullability);
+        }
+        if (type2 is InterfaceType &&
+            type2.classNode == coreTypes.doubleClass) {
+          return type2.withDeclaredNullability(type1.nullability);
+        }
       }
-      if (type2 is InterfaceType && type2.classNode == coreTypes.doubleClass) {
-        return type2.withDeclaredNullability(type1.nullability);
+      return coreTypes.numRawType(type1.nullability);
+    }
+  }
+
+  DartType getContextTypeOfSpecialCasedBinaryOperator(
+      DartType contextType, DartType type1, DartType type2,
+      {bool isNonNullableByDefault: false}) {
+    if (isNonNullableByDefault) {
+      if (contextType is! NeverType &&
+          type1 is! NeverType &&
+          isSubtypeOf(contextType, coreTypes.numNonNullableRawType,
+              SubtypeCheckMode.withNullabilities) &&
+          isSubtypeOf(type1, coreTypes.numNonNullableRawType,
+              SubtypeCheckMode.withNullabilities)) {
+        // If e is an expression of the form e1 + e2, e1 - e2, e1 * e2, e1 % e2
+        // or e1.remainder(e2), where C is the context type of e and T is the
+        // static type of e1, and where T is a non-Never subtype of num, then:
+        if (isSubtypeOf(coreTypes.intNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            isSubtypeOf(type1, coreTypes.intNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If int <: C, not num <: C, and T <: int, then the context type of
+          // e2 is int.
+          return coreTypes.intNonNullableRawType;
+        } else if (isSubtypeOf(coreTypes.doubleNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            !isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If double <: C, not num <: C, and not T <: double, then the context
+          // type of e2 is double.
+          return coreTypes.doubleNonNullableRawType;
+        } else {
+          // Otherwise, the context type of e2 is num.
+          return coreTypes.numNonNullableRawType;
+        }
       }
     }
-    return coreTypes.numRawType(type1.nullability);
+    return type2;
+  }
+
+  DartType getContextTypeOfSpecialCasedTernaryOperator(
+      DartType contextType, DartType receiverType, DartType operandType,
+      {bool isNonNullableByDefault: false}) {
+    if (isNonNullableByDefault) {
+      if (receiverType is! NeverType &&
+          isSubtypeOf(receiverType, coreTypes.numNonNullableRawType,
+              SubtypeCheckMode.withNullabilities)) {
+        // If e is an expression of the form e1.clamp(e2, e3) where C is the
+        // context type of e and T is the static type of e1 where T is a
+        // non-Never subtype of num, then:
+        if (isSubtypeOf(coreTypes.intNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            isSubtypeOf(receiverType, coreTypes.intNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If int <: C, not num <: C, and T <: int, then the context type of
+          // e2 and e3 is int.
+          return coreTypes.intNonNullableRawType;
+        } else if (isSubtypeOf(coreTypes.doubleNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+                SubtypeCheckMode.withNullabilities) &&
+            isSubtypeOf(receiverType, coreTypes.doubleNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If double <: C, not num <: C, and T <: double, then the context
+          // type of e2 and e3 is double.
+          return coreTypes.doubleNonNullableRawType;
+        } else {
+          // Otherwise the context type of e2 an e3 is num
+          return coreTypes.numNonNullableRawType;
+        }
+      }
+    }
+    return operandType;
   }
 
   /// Infers a generic type, function, method, or list/map literal
@@ -380,17 +444,22 @@
   ///
   /// This is a case of type-based overloading, which in Dart is only supported
   /// by giving special treatment to certain arithmetic operators.
-  bool isOverloadedArithmeticOperatorAndType(
-      Procedure member, DartType receiverType) {
-    // TODO(paulberry): this matches what is defined in the spec.  It would be
-    // nice if we could change kernel to match the spec and not have to
-    // override.
-    if (member.name.name == 'remainder') return false;
-    if (!(receiverType is InterfaceType &&
-        identical(receiverType.classNode, coreTypes.intClass))) {
-      return false;
+  bool isSpecialCasesBinaryForReceiverType(
+      Procedure member, DartType receiverType,
+      {bool isNonNullableByDefault}) {
+    assert(isNonNullableByDefault != null);
+    if (!isNonNullableByDefault) {
+      // TODO(paulberry): this matches what is defined in the spec.  It would be
+      // nice if we could change kernel to match the spec and not have to
+      // override.
+      if (member.name.name == 'remainder') return false;
+      if (!(receiverType is InterfaceType &&
+          identical(receiverType.classNode, coreTypes.intClass))) {
+        return false;
+      }
     }
-    return isOverloadedArithmeticOperator(member);
+    return isSpecialCasedBinaryOperator(member,
+        isNonNullableByDefault: isNonNullableByDefault);
   }
 
   @override
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 3966bbe..ecf30d2 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1902,18 +1902,6 @@
     lib2.dart: "class A {}"
     main.dart: "export 'lib1.dart'; export 'lib2.dart';"
 
-DuplicatedLibraryExport:
-  template: "A library with name '#name' is exported more than once."
-  analyzerCode: EXPORT_DUPLICATED_LIBRARY_NAMED
-  script:
-    lib1.dart: "library foo;"
-    lib2.dart: "library foo;"
-    main.dart: "export 'lib1.dart'; export 'lib2.dart';"
-
-DuplicatedLibraryExportContext:
-  template: "'#name' is also exported here."
-  severity: CONTEXT
-
 DuplicatedExportInType:
   template: "'#name' is exported from both '#uri' and '#uri2'."
 
@@ -1921,19 +1909,6 @@
   template: "'#name' is imported from both '#uri' and '#uri2'."
   severity: IGNORED
 
-DuplicatedLibraryImport:
-  template: "A library with name '#name' is imported more than once."
-  severity: WARNING
-  analyzerCode: IMPORT_DUPLICATED_LIBRARY_NAMED
-  script:
-    lib1.dart: "library foo;"
-    lib2.dart: "library foo;"
-    main.dart: "import 'lib1.dart'; import 'lib2.dart';"
-
-DuplicatedLibraryImportContext:
-  template: "'#name' is also imported here."
-  severity: CONTEXT
-
 DuplicatedImportInType:
   template: "'#name' is imported from both '#uri' and '#uri2'."
   analyzerCode: AMBIGUOUS_IMPORT
@@ -3914,7 +3889,7 @@
   severity: CONTEXT
 
 NonNullAwareSpreadIsNull:
-  template: "Can't spread a value with static type Null."
+  template: "Can't spread a value with static type '#type'."
   script: >
     main() {
       <int>[...null];
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
index d5d26ac..885081b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
@@ -60,8 +60,8 @@
       handleType(Object, null)
       handleClassExtends(extends)
       beginTypeList(M)
-        handleNoTypeVariables(()
         beginFunctionType(M)
+          handleNoTypeVariables(()
           handleIdentifier(M, typeReference)
           beginTypeArguments(<)
             handleIdentifier(dynamic, typeReference)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
index 52766bc..bceda2e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
@@ -92,8 +92,8 @@
             parseWithClauseOpt(Object)
               parseTypeList(with)
                 listener: beginTypeList(M)
-                listener: handleNoTypeVariables(()
                 listener: beginFunctionType(M)
+                listener: handleNoTypeVariables(()
                 ensureIdentifier(with, typeReference)
                   listener: handleIdentifier(M, typeReference)
                 listener: beginTypeArguments(<)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect
index 5aa54f3..5a39839 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect
@@ -482,8 +482,8 @@
   handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'abstract'., null, {token: abstract}], abstract, abstract)
   handleIdentifier(abstract, typedefDeclaration)
   handleNoTypeVariables(=)
-  handleNoTypeVariables(()
   beginFunctionType(void)
+    handleNoTypeVariables(()
     handleVoidKeyword(void)
     beginFormalParameters((, MemberKind.GeneralizedFunctionType)
     endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -507,8 +507,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'as'., null, {token: as}], as, as)
 handleIdentifier(as, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -532,8 +532,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'assert'., null, {token: assert}], assert, assert)
 handleIdentifier(assert, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -555,8 +555,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(async, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -578,8 +578,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(await, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -603,8 +603,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'break'., null, {token: break}], break, break)
 handleIdentifier(break, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -628,8 +628,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'case'., null, {token: case}], case, case)
 handleIdentifier(case, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -653,8 +653,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'catch'., null, {token: catch}], catch, catch)
 handleIdentifier(catch, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -678,8 +678,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'class'., null, {token: class}], class, class)
 handleIdentifier(class, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -703,8 +703,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'const'., null, {token: const}], const, const)
 handleIdentifier(const, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -728,8 +728,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'continue'., null, {token: continue}], continue, continue)
 handleIdentifier(continue, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -753,8 +753,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'covariant'., null, {token: covariant}], covariant, covariant)
 handleIdentifier(covariant, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -778,8 +778,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'default'., null, {token: default}], default, default)
 handleIdentifier(default, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -803,8 +803,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'deferred'., null, {token: deferred}], deferred, deferred)
 handleIdentifier(deferred, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -828,8 +828,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'do'., null, {token: do}], do, do)
 handleIdentifier(do, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -853,8 +853,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'dynamic'., null, {token: dynamic}], dynamic, dynamic)
 handleIdentifier(dynamic, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -878,8 +878,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'else'., null, {token: else}], else, else)
 handleIdentifier(else, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -903,8 +903,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'enum'., null, {token: enum}], enum, enum)
 handleIdentifier(enum, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -928,8 +928,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'export'., null, {token: export}], export, export)
 handleIdentifier(export, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -953,8 +953,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extends'., null, {token: extends}], extends, extends)
 handleIdentifier(extends, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -978,8 +978,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extension'., null, {token: extension}], extension, extension)
 handleIdentifier(extension, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1003,8 +1003,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'external'., null, {token: external}], external, external)
 handleIdentifier(external, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1028,8 +1028,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'factory'., null, {token: factory}], factory, factory)
 handleIdentifier(factory, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1053,8 +1053,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'false'., null, {token: false}], false, false)
 handleIdentifier(false, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1078,8 +1078,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'final'., null, {token: final}], final, final)
 handleIdentifier(final, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1103,8 +1103,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'finally'., null, {token: finally}], finally, finally)
 handleIdentifier(finally, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1128,8 +1128,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'for'., null, {token: for}], for, for)
 handleIdentifier(for, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1153,8 +1153,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'Function'., null, {token: Function}], Function, Function)
 handleIdentifier(Function, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1178,8 +1178,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'get'., null, {token: get}], get, get)
 handleIdentifier(get, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1201,8 +1201,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(hide, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1226,8 +1226,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'if'., null, {token: if}], if, if)
 handleIdentifier(if, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1251,8 +1251,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'implements'., null, {token: implements}], implements, implements)
 handleIdentifier(implements, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1276,8 +1276,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'import'., null, {token: import}], import, import)
 handleIdentifier(import, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1301,8 +1301,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'in'., null, {token: in}], in, in)
 handleIdentifier(in, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1324,8 +1324,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(inout, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1349,8 +1349,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'interface'., null, {token: interface}], interface, interface)
 handleIdentifier(interface, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1374,8 +1374,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'is'., null, {token: is}], is, is)
 handleIdentifier(is, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1399,8 +1399,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'late'., null, {token: late}], late, late)
 handleIdentifier(late, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1424,8 +1424,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'library'., null, {token: library}], library, library)
 handleIdentifier(library, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1449,8 +1449,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'mixin'., null, {token: mixin}], mixin, mixin)
 handleIdentifier(mixin, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1472,8 +1472,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(native, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1497,8 +1497,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'new'., null, {token: new}], new, new)
 handleIdentifier(new, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1522,8 +1522,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'null'., null, {token: null}], null, null)
 handleIdentifier(null, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1545,8 +1545,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(of, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1568,8 +1568,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(on, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1593,8 +1593,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'operator'., null, {token: operator}], operator, operator)
 handleIdentifier(operator, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1616,8 +1616,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(out, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1641,8 +1641,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'part'., null, {token: part}], part, part)
 handleIdentifier(part, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1664,8 +1664,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(patch, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1689,8 +1689,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'required'., null, {token: required}], required, required)
 handleIdentifier(required, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1714,8 +1714,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'rethrow'., null, {token: rethrow}], rethrow, rethrow)
 handleIdentifier(rethrow, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1739,8 +1739,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'return'., null, {token: return}], return, return)
 handleIdentifier(return, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1764,8 +1764,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'set'., null, {token: set}], set, set)
 handleIdentifier(set, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1787,8 +1787,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(show, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1810,8 +1810,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(source, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1835,8 +1835,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'static'., null, {token: static}], static, static)
 handleIdentifier(static, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1860,8 +1860,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'super'., null, {token: super}], super, super)
 handleIdentifier(super, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1885,8 +1885,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'switch'., null, {token: switch}], switch, switch)
 handleIdentifier(switch, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1908,8 +1908,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(sync, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1933,8 +1933,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'this'., null, {token: this}], this, this)
 handleIdentifier(this, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1958,8 +1958,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'throw'., null, {token: throw}], throw, throw)
 handleIdentifier(throw, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1983,8 +1983,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'true'., null, {token: true}], true, true)
 handleIdentifier(true, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2008,8 +2008,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'try'., null, {token: try}], try, try)
 handleIdentifier(try, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2033,8 +2033,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'typedef'., null, {token: typedef}], typedef, typedef)
 handleIdentifier(typedef, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2058,8 +2058,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'var'., null, {token: var}], var, var)
 handleIdentifier(var, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2127,8 +2127,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'while'., null, {token: while}], while, while)
 handleIdentifier(while, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2152,8 +2152,8 @@
 handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'with'., null, {token: with}], with, with)
 handleIdentifier(with, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2175,8 +2175,8 @@
 beginFunctionTypeAlias(typedef)
 handleIdentifier(yield, typedefDeclaration)
 handleNoTypeVariables(=)
-handleNoTypeVariables(()
 beginFunctionType(void)
+handleNoTypeVariables(()
 handleVoidKeyword(void)
 beginFormalParameters((, MemberKind.GeneralizedFunctionType)
 endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
index eea917a..80fc687 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
@@ -36,8 +36,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'abstract'., null, {token: abstract}], abstract, abstract)
           listener: handleIdentifier(abstract, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -81,8 +81,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'as'., null, {token: as}], as, as)
           listener: handleIdentifier(as, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -126,8 +126,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'assert'., null, {token: assert}], assert, assert)
           listener: handleIdentifier(assert, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -167,8 +167,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(async, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -208,8 +208,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(await, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -253,8 +253,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'break'., null, {token: break}], break, break)
           listener: handleIdentifier(break, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -298,8 +298,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'case'., null, {token: case}], case, case)
           listener: handleIdentifier(case, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -343,8 +343,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'catch'., null, {token: catch}], catch, catch)
           listener: handleIdentifier(catch, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -388,8 +388,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'class'., null, {token: class}], class, class)
           listener: handleIdentifier(class, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -433,8 +433,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'const'., null, {token: const}], const, const)
           listener: handleIdentifier(const, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -478,8 +478,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'continue'., null, {token: continue}], continue, continue)
           listener: handleIdentifier(continue, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -523,8 +523,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'covariant'., null, {token: covariant}], covariant, covariant)
           listener: handleIdentifier(covariant, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -568,8 +568,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'default'., null, {token: default}], default, default)
           listener: handleIdentifier(default, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -613,8 +613,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'deferred'., null, {token: deferred}], deferred, deferred)
           listener: handleIdentifier(deferred, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -658,8 +658,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'do'., null, {token: do}], do, do)
           listener: handleIdentifier(do, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -703,8 +703,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'dynamic'., null, {token: dynamic}], dynamic, dynamic)
           listener: handleIdentifier(dynamic, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -748,8 +748,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'else'., null, {token: else}], else, else)
           listener: handleIdentifier(else, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -793,8 +793,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'enum'., null, {token: enum}], enum, enum)
           listener: handleIdentifier(enum, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -838,8 +838,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'export'., null, {token: export}], export, export)
           listener: handleIdentifier(export, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -883,8 +883,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extends'., null, {token: extends}], extends, extends)
           listener: handleIdentifier(extends, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -928,8 +928,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extension'., null, {token: extension}], extension, extension)
           listener: handleIdentifier(extension, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -973,8 +973,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'external'., null, {token: external}], external, external)
           listener: handleIdentifier(external, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1018,8 +1018,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'factory'., null, {token: factory}], factory, factory)
           listener: handleIdentifier(factory, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1063,8 +1063,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'false'., null, {token: false}], false, false)
           listener: handleIdentifier(false, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1108,8 +1108,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'final'., null, {token: final}], final, final)
           listener: handleIdentifier(final, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1153,8 +1153,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'finally'., null, {token: finally}], finally, finally)
           listener: handleIdentifier(finally, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1198,8 +1198,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'for'., null, {token: for}], for, for)
           listener: handleIdentifier(for, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1243,8 +1243,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'Function'., null, {token: Function}], Function, Function)
           listener: handleIdentifier(Function, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1288,8 +1288,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'get'., null, {token: get}], get, get)
           listener: handleIdentifier(get, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1329,8 +1329,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(hide, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1374,8 +1374,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'if'., null, {token: if}], if, if)
           listener: handleIdentifier(if, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1419,8 +1419,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'implements'., null, {token: implements}], implements, implements)
           listener: handleIdentifier(implements, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1464,8 +1464,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'import'., null, {token: import}], import, import)
           listener: handleIdentifier(import, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1509,8 +1509,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'in'., null, {token: in}], in, in)
           listener: handleIdentifier(in, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1550,8 +1550,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(inout, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1595,8 +1595,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'interface'., null, {token: interface}], interface, interface)
           listener: handleIdentifier(interface, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1640,8 +1640,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'is'., null, {token: is}], is, is)
           listener: handleIdentifier(is, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1685,8 +1685,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'late'., null, {token: late}], late, late)
           listener: handleIdentifier(late, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1730,8 +1730,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'library'., null, {token: library}], library, library)
           listener: handleIdentifier(library, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1775,8 +1775,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'mixin'., null, {token: mixin}], mixin, mixin)
           listener: handleIdentifier(mixin, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1816,8 +1816,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(native, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1861,8 +1861,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'new'., null, {token: new}], new, new)
           listener: handleIdentifier(new, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1906,8 +1906,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'null'., null, {token: null}], null, null)
           listener: handleIdentifier(null, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1947,8 +1947,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(of, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1988,8 +1988,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(on, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2033,8 +2033,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'operator'., null, {token: operator}], operator, operator)
           listener: handleIdentifier(operator, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2074,8 +2074,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(out, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2119,8 +2119,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'part'., null, {token: part}], part, part)
           listener: handleIdentifier(part, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2160,8 +2160,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(patch, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2205,8 +2205,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'required'., null, {token: required}], required, required)
           listener: handleIdentifier(required, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2250,8 +2250,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'rethrow'., null, {token: rethrow}], rethrow, rethrow)
           listener: handleIdentifier(rethrow, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2295,8 +2295,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'return'., null, {token: return}], return, return)
           listener: handleIdentifier(return, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2340,8 +2340,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'set'., null, {token: set}], set, set)
           listener: handleIdentifier(set, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2381,8 +2381,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(show, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2422,8 +2422,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(source, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2467,8 +2467,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'static'., null, {token: static}], static, static)
           listener: handleIdentifier(static, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2512,8 +2512,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'super'., null, {token: super}], super, super)
           listener: handleIdentifier(super, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2557,8 +2557,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'switch'., null, {token: switch}], switch, switch)
           listener: handleIdentifier(switch, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2598,8 +2598,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(sync, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2643,8 +2643,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'this'., null, {token: this}], this, this)
           listener: handleIdentifier(this, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2688,8 +2688,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'throw'., null, {token: throw}], throw, throw)
           listener: handleIdentifier(throw, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2733,8 +2733,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'true'., null, {token: true}], true, true)
           listener: handleIdentifier(true, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2778,8 +2778,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'try'., null, {token: try}], try, try)
           listener: handleIdentifier(try, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2823,8 +2823,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'typedef'., null, {token: typedef}], typedef, typedef)
           listener: handleIdentifier(typedef, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2868,8 +2868,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'var'., null, {token: var}], var, var)
           listener: handleIdentifier(var, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -3001,8 +3001,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'while'., null, {token: while}], while, while)
           listener: handleIdentifier(while, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -3046,8 +3046,8 @@
             listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'with'., null, {token: with}], with, with)
           listener: handleIdentifier(with, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -3087,8 +3087,8 @@
         ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
           listener: handleIdentifier(yield, typedefDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: handleNoTypeVariables(()
         listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
         listener: handleVoidKeyword(void)
         parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
           parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart
new file mode 100644
index 0000000..4cdd14e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart
@@ -0,0 +1,41 @@
+// 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.
+
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+    Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
new file mode 100644
index 0000000..e210455
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
@@ -0,0 +1,984 @@
+beginCompilationUnit(typedef)
+  beginMetadataStar(typedef)
+  endMetadataStar(0)
+  beginFunctionTypeAlias(typedef)
+    handleIdentifier(E1, typedefDeclaration)
+    beginTypeVariables(<)
+      beginMetadataStar(T)
+      endMetadataStar(0)
+      handleIdentifier(T, typeVariableDeclaration)
+      beginTypeVariable(T)
+        handleTypeVariablesDefined(T, 1)
+        handleNoType(T)
+      endTypeVariable(>, 0, null, null)
+    endTypeVariables(<, >)
+    beginFunctionType(void)
+      handleNoTypeVariables(()
+      handleVoidKeyword(void)
+      beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+      endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+    endFunctionType(Function, null)
+  endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+  handleIdentifier(E2, typedefDeclaration)
+  beginTypeVariables(<)
+    beginMetadataStar(T)
+    endMetadataStar(0)
+    handleIdentifier(T, typeVariableDeclaration)
+    beginTypeVariable(T)
+      handleTypeVariablesDefined(num, 1)
+      handleIdentifier(num, typeReference)
+      handleNoTypeArguments(>)
+      handleType(num, null)
+    endTypeVariable(>, 0, extends, null)
+  endTypeVariables(<, >)
+  beginFunctionType(void)
+    handleNoTypeVariables(()
+    handleVoidKeyword(void)
+    beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+    endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+  endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E3, typedefDeclaration)
+beginTypeVariables(<)
+  beginMetadataStar(T)
+  endMetadataStar(0)
+  handleIdentifier(T, typeVariableDeclaration)
+  beginTypeVariable(T)
+    beginMetadataStar(S)
+    endMetadataStar(0)
+    handleIdentifier(S, typeVariableDeclaration)
+    beginTypeVariable(S)
+      handleTypeVariablesDefined(S, 2)
+      handleNoType(S)
+    endTypeVariable(>, 1, null, null)
+    handleNoType(T)
+  endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+  handleNoTypeVariables(()
+  handleVoidKeyword(void)
+  beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+  endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E4, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+  beginMetadataStar(S)
+  endMetadataStar(0)
+  handleIdentifier(S, typeVariableDeclaration)
+  beginTypeVariable(S)
+    handleTypeVariablesDefined(num, 2)
+    handleIdentifier(num, typeReference)
+    handleNoTypeArguments(>)
+    handleType(num, null)
+  endTypeVariable(>, 1, extends, null)
+  handleIdentifier(num, typeReference)
+  handleNoTypeArguments(,)
+  handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E5, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+  handleTypeVariablesDefined(num, 2)
+  handleIdentifier(num, typeReference)
+  handleNoTypeArguments(>)
+  handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E6, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F1, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(T, 1)
+handleNoType(T)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F2, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F3, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(S, 2)
+handleNoType(S)
+endTypeVariable(>, 1, null, null)
+handleNoType(T)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F4, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F5, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F6, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G1, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(X, 1)
+handleNoType(X)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(X, 1)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(>)
+handleType(X, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G2, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(X, 1)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(>)
+handleType(X, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G3, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+beginMetadataStar(Y)
+endMetadataStar(0)
+handleIdentifier(Y, typeVariableDeclaration)
+beginTypeVariable(Y)
+handleTypeVariablesDefined(Y, 2)
+handleNoType(Y)
+endTypeVariable(>, 1, null, null)
+handleNoType(X)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(Y, 2)
+handleIdentifier(Y, typeReference)
+handleNoTypeArguments(>)
+handleType(Y, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(,)
+handleType(X, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G4, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+beginMetadataStar(Y)
+endMetadataStar(0)
+handleIdentifier(Y, typeVariableDeclaration)
+beginTypeVariable(Y)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(Y, 2)
+handleIdentifier(Y, typeReference)
+handleNoTypeArguments(>)
+handleType(Y, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(,)
+handleType(X, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G5, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(X, 2)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(>)
+handleType(X, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G6, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(,)
+handleType(X, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H1, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(T, 1)
+handleNoType(T)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H2, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H3, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(S, 2)
+handleNoType(S)
+endTypeVariable(>, 1, null, null)
+handleNoType(T)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H4, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H5, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H6, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(T, 1)
+handleNoType(T)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f1, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f2, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(S, 2)
+handleNoType(S)
+endTypeVariable(>, 1, null, null)
+handleNoType(T)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f3, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f4, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f5, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f6, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(main)
+beginMetadataStar(main)
+endMetadataStar(0)
+beginTopLevelMember(main)
+beginTopLevelMethod(;, null)
+handleNoType(;)
+handleIdentifier(main, topLevelFunctionDeclaration)
+handleNoTypeVariables(()
+beginFormalParameters((, MemberKind.TopLevelMethod)
+endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+handleAsyncModifier(null, null)
+beginBlockFunctionBody({)
+endBlockFunctionBody(0, {, })
+endTopLevelMethod(main, null, })
+endTopLevelDeclaration()
+endCompilationUnit(31, )
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
new file mode 100644
index 0000000..b6c6730
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
@@ -0,0 +1,1396 @@
+parseUnit(typedef)
+  skipErrorTokens(typedef)
+  listener: beginCompilationUnit(typedef)
+  syntheticPreviousToken(typedef)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(E1, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        listener: beginMetadataStar(T)
+        listener: endMetadataStar(0)
+        listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(E2, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(num, 1)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(E3, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(S, 2)
+        listener: handleNoType(S)
+        listener: endTypeVariable(>, 1, null, null)
+        listener: handleNoType(T)
+        listener: endTypeVariable(,, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(E4, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(num, 2)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(num, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(E5, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(num, 2)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(S, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(S, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(E6, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(T, 2)
+        listener: handleIdentifier(T, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(T, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(num, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F1, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        listener: beginMetadataStar(T)
+        listener: endMetadataStar(0)
+        listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F2, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(num, 1)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F3, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(S, 2)
+        listener: handleNoType(S)
+        listener: endTypeVariable(>, 1, null, null)
+        listener: handleNoType(T)
+        listener: endTypeVariable(,, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F4, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(num, 2)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(num, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F5, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(num, 2)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(S, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(S, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(F6, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(T, 2)
+        listener: handleIdentifier(T, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(T, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(num, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(G1, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        listener: beginMetadataStar(X)
+        listener: endMetadataStar(0)
+        listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleNoType(X)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleIdentifier(X, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(X, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(G2, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(X)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(num, 1)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(X, 1)
+        listener: handleIdentifier(X, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(X, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(G3, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(X)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(Y)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(Y, typeVariableDeclaration)
+        listener: beginTypeVariable(Y)
+        listener: handleTypeVariablesDefined(Y, 2)
+        listener: handleNoType(Y)
+        listener: endTypeVariable(>, 1, null, null)
+        listener: handleNoType(X)
+        listener: endTypeVariable(,, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(Y, 2)
+        listener: handleIdentifier(Y, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(Y, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(X, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(X, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(G4, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(X)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(Y)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(Y, typeVariableDeclaration)
+        listener: beginTypeVariable(Y)
+        listener: handleTypeVariablesDefined(num, 2)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(num, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(Y, 2)
+        listener: handleIdentifier(Y, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(Y, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(X, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(X, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(G5, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(X)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(num, 1)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(X, 2)
+        listener: handleIdentifier(X, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(X, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(S, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(S, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(G6, typedefDeclaration)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(X)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(X, typeVariableDeclaration)
+        listener: beginTypeVariable(X)
+        listener: handleTypeVariablesDefined(num, 1)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(T, 2)
+        listener: handleIdentifier(T, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(T, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(X, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(X, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(H1, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(void)
+                listener: endMetadataStar(0)
+              listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: beginFunctionType(void)
+              listener: beginTypeVariables(<)
+              listener: beginMetadataStar(T)
+              listener: endMetadataStar(0)
+              listener: handleIdentifier(T, typeVariableDeclaration)
+              listener: beginTypeVariable(T)
+              listener: handleTypeVariablesDefined(T, 1)
+              listener: handleNoType(T)
+              listener: endTypeVariable(>, 0, null, null)
+              listener: endTypeVariables(<, >)
+              listener: handleVoidKeyword(void)
+              parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+                parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+                  listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+                  listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+              listener: endFunctionType(Function, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(H2, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(void)
+                listener: endMetadataStar(0)
+              listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: beginFunctionType(void)
+              listener: beginTypeVariables(<)
+              parseMetadataStar(<)
+                listener: beginMetadataStar(T)
+                listener: endMetadataStar(0)
+              ensureIdentifier(<, typeVariableDeclaration)
+                listener: handleIdentifier(T, typeVariableDeclaration)
+              listener: beginTypeVariable(T)
+              listener: handleTypeVariablesDefined(num, 1)
+              listener: handleIdentifier(num, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(num, null)
+              listener: endTypeVariable(>, 0, extends, null)
+              listener: endTypeVariables(<, >)
+              listener: handleVoidKeyword(void)
+              parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+                parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+                  listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+                  listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+              listener: endFunctionType(Function, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(H3, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(void)
+                listener: endMetadataStar(0)
+              listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: beginFunctionType(void)
+              listener: beginTypeVariables(<)
+              parseMetadataStar(<)
+                listener: beginMetadataStar(T)
+                listener: endMetadataStar(0)
+              ensureIdentifier(<, typeVariableDeclaration)
+                listener: handleIdentifier(T, typeVariableDeclaration)
+              listener: beginTypeVariable(T)
+              parseMetadataStar(,)
+                listener: beginMetadataStar(S)
+                listener: endMetadataStar(0)
+              ensureIdentifier(,, typeVariableDeclaration)
+                listener: handleIdentifier(S, typeVariableDeclaration)
+              listener: beginTypeVariable(S)
+              listener: handleTypeVariablesDefined(S, 2)
+              listener: handleNoType(S)
+              listener: endTypeVariable(>, 1, null, null)
+              listener: handleNoType(T)
+              listener: endTypeVariable(,, 0, null, null)
+              listener: endTypeVariables(<, >)
+              listener: handleVoidKeyword(void)
+              parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+                parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+                  listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+                  listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+              listener: endFunctionType(Function, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(H4, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(void)
+                listener: endMetadataStar(0)
+              listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: beginFunctionType(void)
+              listener: beginTypeVariables(<)
+              parseMetadataStar(<)
+                listener: beginMetadataStar(T)
+                listener: endMetadataStar(0)
+              ensureIdentifier(<, typeVariableDeclaration)
+                listener: handleIdentifier(T, typeVariableDeclaration)
+              listener: beginTypeVariable(T)
+              parseMetadataStar(,)
+                listener: beginMetadataStar(S)
+                listener: endMetadataStar(0)
+              ensureIdentifier(,, typeVariableDeclaration)
+                listener: handleIdentifier(S, typeVariableDeclaration)
+              listener: beginTypeVariable(S)
+              listener: handleTypeVariablesDefined(num, 2)
+              listener: handleIdentifier(num, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(num, null)
+              listener: endTypeVariable(>, 1, extends, null)
+              listener: handleIdentifier(num, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(num, null)
+              listener: endTypeVariable(,, 0, extends, null)
+              listener: endTypeVariables(<, >)
+              listener: handleVoidKeyword(void)
+              parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+                parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+                  listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+                  listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+              listener: endFunctionType(Function, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(H5, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(void)
+                listener: endMetadataStar(0)
+              listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: beginFunctionType(void)
+              listener: beginTypeVariables(<)
+              parseMetadataStar(<)
+                listener: beginMetadataStar(T)
+                listener: endMetadataStar(0)
+              ensureIdentifier(<, typeVariableDeclaration)
+                listener: handleIdentifier(T, typeVariableDeclaration)
+              listener: beginTypeVariable(T)
+              parseMetadataStar(,)
+                listener: beginMetadataStar(S)
+                listener: endMetadataStar(0)
+              ensureIdentifier(,, typeVariableDeclaration)
+                listener: handleIdentifier(S, typeVariableDeclaration)
+              listener: beginTypeVariable(S)
+              listener: handleTypeVariablesDefined(num, 2)
+              listener: handleIdentifier(num, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(num, null)
+              listener: endTypeVariable(>, 1, extends, null)
+              listener: handleIdentifier(S, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(S, null)
+              listener: endTypeVariable(,, 0, extends, null)
+              listener: endTypeVariables(<, >)
+              listener: handleVoidKeyword(void)
+              parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+                parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+                  listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+                  listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+              listener: endFunctionType(Function, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(typedef)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(typedef)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(;, typedef)
+      parseTypedef(typedef)
+        listener: beginFunctionTypeAlias(typedef)
+        ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+          listener: handleIdentifier(H6, typedefDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginFunctionType(void)
+        listener: handleNoTypeVariables(()
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              parseMetadataStar(()
+                listener: beginMetadataStar(void)
+                listener: endMetadataStar(0)
+              listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+              listener: beginFunctionType(void)
+              listener: beginTypeVariables(<)
+              parseMetadataStar(<)
+                listener: beginMetadataStar(T)
+                listener: endMetadataStar(0)
+              ensureIdentifier(<, typeVariableDeclaration)
+                listener: handleIdentifier(T, typeVariableDeclaration)
+              listener: beginTypeVariable(T)
+              parseMetadataStar(,)
+                listener: beginMetadataStar(S)
+                listener: endMetadataStar(0)
+              ensureIdentifier(,, typeVariableDeclaration)
+                listener: handleIdentifier(S, typeVariableDeclaration)
+              listener: beginTypeVariable(S)
+              listener: handleTypeVariablesDefined(T, 2)
+              listener: handleIdentifier(T, typeReference)
+              listener: handleNoTypeArguments(>)
+              listener: handleType(T, null)
+              listener: endTypeVariable(>, 1, extends, null)
+              listener: handleIdentifier(num, typeReference)
+              listener: handleNoTypeArguments(,)
+              listener: handleType(num, null)
+              listener: endTypeVariable(,, 0, extends, null)
+              listener: endTypeVariables(<, >)
+              listener: handleVoidKeyword(void)
+              parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+                parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+                  listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+                  listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+              listener: endFunctionType(Function, null)
+              listener: handleNoName())
+              listener: handleFormalParameterWithoutValue())
+              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureSemicolon())
+        listener: endFunctionTypeAlias(typedef, =, ;)
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(void)
+      parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f1, DeclarationKind.TopLevel, null, false)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        listener: beginMetadataStar(T)
+        listener: endMetadataStar(0)
+        listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(T, 1)
+        listener: handleNoType(T)
+        listener: endTypeVariable(>, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+          listener: handleIdentifier(f1, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(f1, f1, null, null, null, null, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(void)
+      parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f2, DeclarationKind.TopLevel, null, false)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        listener: handleTypeVariablesDefined(num, 1)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+          listener: handleIdentifier(f2, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(f2, f2, null, null, null, null, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(void)
+      parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f3, DeclarationKind.TopLevel, null, false)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(S, 2)
+        listener: handleNoType(S)
+        listener: endTypeVariable(>, 1, null, null)
+        listener: handleNoType(T)
+        listener: endTypeVariable(,, 0, null, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+          listener: handleIdentifier(f3, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(f3, f3, null, null, null, null, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(void)
+      parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f4, DeclarationKind.TopLevel, null, false)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(num, 2)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(num, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+          listener: handleIdentifier(f4, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(f4, f4, null, null, null, null, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(void)
+      parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f5, DeclarationKind.TopLevel, null, false)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(num, 2)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(num, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(S, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(S, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+          listener: handleIdentifier(f5, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(f5, f5, null, null, null, null, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(void)
+      parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f6, DeclarationKind.TopLevel, null, false)
+        listener: beginFunctionType(void)
+        listener: beginTypeVariables(<)
+        parseMetadataStar(<)
+          listener: beginMetadataStar(T)
+          listener: endMetadataStar(0)
+        ensureIdentifier(<, typeVariableDeclaration)
+          listener: handleIdentifier(T, typeVariableDeclaration)
+        listener: beginTypeVariable(T)
+        parseMetadataStar(,)
+          listener: beginMetadataStar(S)
+          listener: endMetadataStar(0)
+        ensureIdentifier(,, typeVariableDeclaration)
+          listener: handleIdentifier(S, typeVariableDeclaration)
+        listener: beginTypeVariable(S)
+        listener: handleTypeVariablesDefined(T, 2)
+        listener: handleIdentifier(T, typeReference)
+        listener: handleNoTypeArguments(>)
+        listener: handleType(T, null)
+        listener: endTypeVariable(>, 1, extends, null)
+        listener: handleIdentifier(num, typeReference)
+        listener: handleNoTypeArguments(,)
+        listener: handleType(num, null)
+        listener: endTypeVariable(,, 0, extends, null)
+        listener: endTypeVariables(<, >)
+        listener: handleVoidKeyword(void)
+        parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+          parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+            listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+            listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+        listener: endFunctionType(Function, null)
+        ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+          listener: handleIdentifier(f6, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(f6, f6, null, null, null, null, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+  listener: endTopLevelDeclaration(main)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(main)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(main)
+      isReservedKeyword(()
+      parseTopLevelMethod(;, null, ;, Instance of 'NoType', null, main, false)
+        listener: beginTopLevelMethod(;, null)
+        listener: handleNoType(;)
+        ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(0, {, })
+        listener: endTopLevelMethod(main, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(typedef)
+  listener: endCompilationUnit(31, )
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.parser.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.parser.expect
new file mode 100644
index 0000000..ac7315e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.parser.expect
@@ -0,0 +1,77 @@
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
+
+
+typedef[KeywordToken] E1[StringToken]<[BeginToken]T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E2[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E3[StringToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E4[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E5[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E6[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] F1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] G1[StringToken]<[BeginToken]X[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G2[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G3[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G4[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] Y[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken]
+Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G5[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G6[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] H1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f1[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f2[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f3[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f4[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f5[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f6[StringToken];[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.scanner.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.scanner.expect
new file mode 100644
index 0000000..ac7315e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.scanner.expect
@@ -0,0 +1,77 @@
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
+
+
+typedef[KeywordToken] E1[StringToken]<[BeginToken]T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E2[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E3[StringToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E4[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E5[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E6[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] F1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] G1[StringToken]<[BeginToken]X[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G2[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G3[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G4[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] Y[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken]
+Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G5[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G6[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] H1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f1[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f2[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f3[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f4[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f5[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f6[StringToken];[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 5f473d7..9aeb485 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -680,14 +680,15 @@
 
   void test_computeType_gft() {
     expectComplexInfo('Function() m', expectedAfter: 'm', expectedCalls: [
-      'handleNoTypeVariables (',
       'beginFunctionType Function',
+      'handleNoTypeVariables (',
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function null',
     ]);
     expectComplexInfo('Function<T>() m', expectedAfter: 'm', expectedCalls: [
+      'beginFunctionType Function',
       'beginTypeVariables <',
       'beginMetadataStar T',
       'endMetadataStar 0',
@@ -697,15 +698,14 @@
       'handleNoType T',
       'endTypeVariable > 0 null null',
       'endTypeVariables < >',
-      'beginFunctionType Function',
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function null',
     ]);
     expectComplexInfo('Function(int) m', expectedAfter: 'm', expectedCalls: [
-      'handleNoTypeVariables (',
       'beginFunctionType Function',
+      'handleNoTypeVariables (',
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'beginMetadataStar int',
@@ -722,6 +722,7 @@
       'endFunctionType Function null',
     ]);
     expectComplexInfo('Function<T>(int) m', expectedAfter: 'm', expectedCalls: [
+      'beginFunctionType Function',
       'beginTypeVariables <',
       'beginMetadataStar T',
       'endMetadataStar 0',
@@ -731,7 +732,6 @@
       'handleNoType T',
       'endTypeVariable > 0 null null',
       'endTypeVariables < >',
-      'beginFunctionType Function',
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'beginMetadataStar int',
@@ -774,8 +774,8 @@
     expectComplexInfo('C Function(', // Scanner inserts synthetic ')'.
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C typeReference',
           'handleNoTypeArguments Function',
           'handleType C null',
@@ -787,8 +787,8 @@
 
   void test_computeType_identifierComplex_questionMark() {
     expectComplexInfo('C? Function()', required: true, expectedCalls: [
-      'handleNoTypeVariables (',
       'beginFunctionType C',
+      'handleNoTypeVariables (',
       'handleIdentifier C typeReference',
       'handleNoTypeArguments ?',
       'handleType C ?',
@@ -800,8 +800,8 @@
 
   void test_computeType_identifierComplex_questionMark2() {
     expectComplexInfo('C Function()?', required: true, expectedCalls: [
-      'handleNoTypeVariables (',
       'beginFunctionType C',
+      'handleNoTypeVariables (',
       'handleIdentifier C typeReference',
       'handleNoTypeArguments Function',
       'handleType C null',
@@ -813,8 +813,8 @@
 
   void test_computeType_identifierComplex_questionMark3() {
     expectComplexInfo('C<T>? Function()', required: true, expectedCalls: [
-      'handleNoTypeVariables (',
       'beginFunctionType C',
+      'handleNoTypeVariables (',
       'handleIdentifier C typeReference',
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
@@ -830,8 +830,8 @@
 
   void test_computeType_identifierComplex_questionMark4() {
     expectComplexInfo('C<S,T>? Function()', required: true, expectedCalls: [
-      'handleNoTypeVariables (',
       'beginFunctionType C',
+      'handleNoTypeVariables (',
       'handleIdentifier C typeReference',
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
@@ -852,10 +852,10 @@
     expectComplexInfo('C Function()? Function()',
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
           'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C typeReference',
           'handleNoTypeArguments Function',
           'handleType C null',
@@ -872,10 +872,10 @@
     expectComplexInfo('C Function() Function()?',
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
           'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C typeReference',
           'handleNoTypeArguments Function',
           'handleType C null',
@@ -892,10 +892,10 @@
     expectComplexInfo('C? Function() Function()?',
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
           'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C typeReference',
           'handleNoTypeArguments ?',
           'handleType C ?',
@@ -912,10 +912,10 @@
     expectComplexInfo('C Function()? Function()?',
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
           'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C typeReference',
           'handleNoTypeArguments Function',
           'handleType C null',
@@ -932,10 +932,10 @@
     expectComplexInfo('C? Function()? Function()?',
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
           'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C typeReference',
           'handleNoTypeArguments ?',
           'handleType C ?',
@@ -1176,8 +1176,8 @@
     expectComplexInfo('C<T> Function(', // Scanner inserts synthetic ')'.
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C typeReference',
           'beginTypeArguments <',
           'handleIdentifier T typeReference',
@@ -1289,8 +1289,8 @@
     expectComplexInfo('C.a Function(', // Scanner inserts synthetic ')'.
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C prefixedTypeReference',
           'handleIdentifier a typeReferenceContinuation',
           'handleQualified .',
@@ -1310,8 +1310,8 @@
     expectComplexInfo('C.a? Function(', // Scanner inserts synthetic ')'.
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType C',
+          'handleNoTypeVariables (',
           'handleIdentifier C prefixedTypeReference',
           'handleIdentifier a typeReferenceContinuation',
           'handleQualified .',
@@ -1370,6 +1370,7 @@
     expectComplexInfo('C.a<T> Function<T>(int x) Function<T>(int x)',
         required: true,
         expectedCalls: [
+          'beginFunctionType C',
           'beginTypeVariables <',
           'beginMetadataStar T',
           'endMetadataStar 0',
@@ -1389,7 +1390,6 @@
           'handleNoType T',
           'endTypeVariable > 0 null null',
           'endTypeVariables < >',
-          'beginFunctionType C',
           'handleIdentifier C prefixedTypeReference',
           'handleIdentifier a typeReferenceContinuation',
           'handleQualified .',
@@ -1432,8 +1432,8 @@
     expectComplexInfo('void Function(', // Scanner inserts synthetic ')'.
         required: true,
         expectedCalls: [
-          'handleNoTypeVariables (',
           'beginFunctionType void',
+          'handleNoTypeVariables (',
           'handleVoidKeyword void',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1443,8 +1443,8 @@
 
   void test_computeType_voidComplex() {
     expectComplexInfo('void Function()', required: true, expectedCalls: [
-      'handleNoTypeVariables (',
       'beginFunctionType void',
+      'handleNoTypeVariables (',
       'handleVoidKeyword void',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1700,8 +1700,8 @@
         typeArgumentCount: 1,
         expectedCalls: [
           'beginTypeArguments <',
-          'handleNoTypeVariables (',
           'beginFunctionType S',
+          'handleNoTypeVariables (',
           'handleIdentifier S typeReference',
           'handleNoTypeArguments Function',
           'handleType S null',
@@ -1714,8 +1714,8 @@
         typeArgumentCount: 1,
         expectedCalls: [
           'beginTypeArguments <',
-          'handleNoTypeVariables (',
           'beginFunctionType void',
+          'handleNoTypeVariables (',
           'handleVoidKeyword void',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1825,8 +1825,8 @@
           'beginTypeArguments <',
           'handleIdentifier S typeReference',
           'beginTypeArguments <',
-          'handleNoTypeVariables (',
           'beginFunctionType Function',
+          'handleNoTypeVariables (',
           'handleNoType <',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1842,8 +1842,8 @@
           'beginTypeArguments <',
           'handleIdentifier S typeReference',
           'beginTypeArguments <',
-          'handleNoTypeVariables (',
           'beginFunctionType Function',
+          'handleNoTypeVariables (',
           'handleNoType <',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1858,8 +1858,8 @@
           'beginTypeArguments <',
           'handleIdentifier S typeReference',
           'beginTypeArguments <',
-          'handleNoTypeVariables (',
           'beginFunctionType void', // was 'beginFunctionType Function'
+          'handleNoTypeVariables (',
           'handleVoidKeyword void', // was 'handleNoType <'
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1876,8 +1876,8 @@
           'beginTypeArguments <',
           'handleIdentifier T typeReference',
           'beginTypeArguments <',
-          'handleNoTypeVariables (',
           'beginFunctionType void', // was 'beginFunctionType Function'
+          'handleNoTypeVariables (',
           'handleVoidKeyword void', // was 'handleNoType <'
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1897,8 +1897,8 @@
           'beginTypeArguments <',
           'handleIdentifier T typeReference',
           'beginTypeArguments <',
-          'handleNoTypeVariables (',
           'beginFunctionType void', // was 'beginFunctionType Function'
+          'handleNoTypeVariables (',
           'handleVoidKeyword void', // was 'handleNoType <'
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -2075,8 +2075,8 @@
           'handleIdentifier S typeVariableDeclaration',
           'beginTypeVariable S',
           'handleTypeVariablesDefined ) 2',
-          'handleNoTypeVariables (',
           'beginFunctionType void',
+          'handleNoTypeVariables (',
           'handleVoidKeyword void',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -2329,8 +2329,8 @@
           'handleIdentifier T typeVariableDeclaration',
           'beginTypeVariable T',
           'handleTypeVariablesDefined ) 1',
-          'handleNoTypeVariables (',
           'beginFunctionType Function',
+          'handleNoTypeVariables (',
           'handleNoType extends',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'beginMetadataStar T',
diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
index ebfcd28..0f771da 100644
--- a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
@@ -4,8 +4,6 @@
 
 import "package:kernel/ast.dart" show DartType, Library;
 
-import "package:kernel/core_types.dart" show CoreTypes;
-
 import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
 
 import "package:front_end/src/api_prototype/compiler_options.dart"
@@ -55,8 +53,8 @@
 
   @override
   DartType getLegacyLeastUpperBound(
-      DartType a, DartType b, Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getKernelLegacyLeastUpperBound(a, b, clientLibrary);
+      DartType a, DartType b, Library clientLibrary) {
+    return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
   }
 }
 
diff --git a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
index 5ffe4df..152d8d6 100644
--- a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
@@ -8,8 +8,6 @@
 
 import "package:kernel/class_hierarchy.dart" show ClassHierarchy;
 
-import "package:kernel/core_types.dart" show CoreTypes;
-
 class KernelLegacyUpperBoundTest extends LegacyUpperBoundTest {
   ClassHierarchy hierarchy;
 
@@ -22,8 +20,8 @@
 
   @override
   DartType getLegacyLeastUpperBound(
-      DartType a, DartType b, Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary, coreTypes);
+      DartType a, DartType b, Library clientLibrary) {
+    return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
   }
 }
 
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
index 686768e..d316988 100644
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
@@ -50,11 +50,11 @@
   }
 
   DartType getLegacyLeastUpperBound(
-      DartType a, DartType b, Library clientLibrary, CoreTypes coreTypes);
+      DartType a, DartType b, Library clientLibrary);
 
   void checkGetLegacyLeastUpperBound(
       DartType a, DartType b, Library clientLibrary, DartType expected) {
-    DartType actual = getLegacyLeastUpperBound(a, b, clientLibrary, coreTypes);
+    DartType actual = getLegacyLeastUpperBound(a, b, clientLibrary);
     Expect.equals(expected, actual);
   }
 
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/.dart_tool/package_config.json b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/.dart_tool/package_config.json
new file mode 100644
index 0000000..8304b63
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/.dart_tool/package_config.json
@@ -0,0 +1,10 @@
+{
+    "configVersion": 2,
+    "packages": [
+        {
+            "name": "collection",
+            "rootUri": "../foo/",
+            "packageUri": "lib/"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/bin/bin_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/bin/bin_file.dart
new file mode 100644
index 0000000..80e69b3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/bin/bin_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library: 
+ languageVersion=2.8,
+ packageUri=package:collection
+*/
+
+method1() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/lib/foo.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/lib/foo.dart
new file mode 100644
index 0000000..68a5188
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/lib/foo.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: languageVersion=2.8*/
+
+method2() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/test/test_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/test/test_file.dart
new file mode 100644
index 0000000..641941e
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/test/test_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library: 
+ languageVersion=2.8,
+ packageUri=package:collection
+*/
+
+method3() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/main.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/main.dart
new file mode 100644
index 0000000..07a2598
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/main.dart
@@ -0,0 +1,15 @@
+// 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.
+
+/*library: languageVersion=2.8*/
+
+import 'foo/bin/bin_file.dart';
+import 'foo/test/test_file.dart';
+import 'package:collection/foo.dart';
+
+main() {
+  method1();
+  method2();
+  method3();
+}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/.packages b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/.packages
new file mode 100644
index 0000000..00d3dbb
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/.packages
@@ -0,0 +1 @@
+collection:foo/lib/
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/bin/bin_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/bin/bin_file.dart
new file mode 100644
index 0000000..1046332
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/bin/bin_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library: 
+ languageVersion=2.7,
+ packageUri=package:collection
+*/
+
+method1() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/lib/foo.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/lib/foo.dart
new file mode 100644
index 0000000..e72d3b0
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/lib/foo.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: languageVersion=2.7*/
+
+method2() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/test/test_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/test/test_file.dart
new file mode 100644
index 0000000..4c47d9b
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/test/test_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library: 
+ languageVersion=2.7,
+ packageUri=package:collection
+*/
+
+method3() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/main.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/main.dart
new file mode 100644
index 0000000..cb6feec
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/main.dart
@@ -0,0 +1,11 @@
+// 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.
+
+/*library: languageVersion=2.8*/
+
+import 'foo/bin/bin_file.dart';
+import 'foo/test/test_file.dart';
+import 'package:collection/foo.dart';
+
+main() {}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 229417f..341f7ce 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -168,6 +168,7 @@
 cl
 claim
 claimed
+clamp
 clarification
 clashes
 class's
@@ -1199,6 +1200,7 @@
 unreachable
 unseen
 unshadowed
+unwrapper
 unwraps
 unzip
 upcast
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index b7ba245..0850a28 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1911,6 +1911,7 @@
 nearest
 necessarily
 necessary
+necessity
 need
 needed
 needing
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 52494a6..bf40c56 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -26,6 +26,7 @@
 alt
 amortized
 analyses
+animal
 anon
 aoo
 approval
@@ -84,6 +85,7 @@
 ccc
 charcode
 charset
+checkme
 checkout
 cipd
 circular
@@ -332,6 +334,7 @@
 lc
 ld
 le
+legs
 lengths
 lightly
 likewise
@@ -389,9 +392,11 @@
 misspelled
 mistake
 mistakes
+mod
 modelled
 month
 moo
+mul
 mx
 mysdk
 naturally
@@ -451,6 +456,7 @@
 py
 python
 quot
+qux
 r"
 r"\s
 r"k
@@ -594,6 +600,7 @@
 walt
 warmup
 wherever
+whiskers
 wins
 workflow
 worlds
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index 787ad07..d449d21 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -644,11 +644,59 @@
 0 != 1''');
 }
 
-void _testBinaryExpression() {}
+void _testBinaryExpression() {
+  testExpression(
+      new BinaryExpression(new IntLiteral(0), new Name('+'), new IntLiteral(1)),
+      '''
+0 + 1''');
+  testExpression(
+      new BinaryExpression(
+          new BinaryExpression(
+              new IntLiteral(0), new Name('-'), new IntLiteral(1)),
+          new Name('+'),
+          new BinaryExpression(
+              new IntLiteral(2), new Name('-'), new IntLiteral(3))),
+      '''
+0 - 1 + 2 - 3''');
+  testExpression(
+      new BinaryExpression(
+          new BinaryExpression(
+              new IntLiteral(0), new Name('*'), new IntLiteral(1)),
+          new Name('+'),
+          new BinaryExpression(
+              new IntLiteral(2), new Name('/'), new IntLiteral(3))),
+      '''
+0 * 1 + 2 / 3''');
+  testExpression(
+      new BinaryExpression(
+          new BinaryExpression(
+              new IntLiteral(0), new Name('+'), new IntLiteral(1)),
+          new Name('*'),
+          new BinaryExpression(
+              new IntLiteral(2), new Name('-'), new IntLiteral(3))),
+      '''
+(0 + 1) * (2 - 3)''');
+}
 
-void _testUnaryExpression() {}
+void _testUnaryExpression() {
+  testExpression(new UnaryExpression(new Name('unary-'), new IntLiteral(0)), '''
+-0''');
+  testExpression(new UnaryExpression(new Name('~'), new IntLiteral(0)), '''
+~0''');
 
-void _testParenthesizedExpression() {}
+  testExpression(
+      new UnaryExpression(
+          new Name('unary-'),
+          new BinaryExpression(
+              new IntLiteral(0), new Name('+'), new IntLiteral(1))),
+      '''
+-(0 + 1)''');
+}
+
+void _testParenthesizedExpression() {
+  testExpression(new ParenthesizedExpression(new IntLiteral(0)), '''
+(0)''');
+}
 
 void _testSpreadElement() {
   testExpression(new SpreadElement(new IntLiteral(0), false), '''
diff --git a/pkg/front_end/testcases/general/cascade_context.dart b/pkg/front_end/testcases/general/cascade_context.dart
new file mode 100644
index 0000000..4242a2f
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart
@@ -0,0 +1,15 @@
+// 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.
+
+T f<T>() => null;
+
+test() {
+  int v1 = f();
+  int v2 = f()..isEven;
+  int v3 = f()
+    ..isEven
+    ..isEven;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.outline.expect b/pkg/front_end/testcases/general/cascade_context.dart.outline.expect
new file mode 100644
index 0000000..10a6773
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.strong.expect b/pkg/front_end/testcases/general/cascade_context.dart.strong.expect
new file mode 100644
index 0000000..309a682
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → dynamic {
+  core::int* v1 = self::f<core::int*>();
+  core::int* v2 = let final core::int* #t1 = self::f<core::int*>() in block {
+    #t1.{core::int::isEven};
+  } =>#t1;
+  core::int* v3 = let final core::int* #t2 = self::f<core::int*>() in block {
+    #t2.{core::int::isEven};
+    #t2.{core::int::isEven};
+  } =>#t2;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cascade_context.dart.strong.transformed.expect
new file mode 100644
index 0000000..309a682
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → dynamic {
+  core::int* v1 = self::f<core::int*>();
+  core::int* v2 = let final core::int* #t1 = self::f<core::int*>() in block {
+    #t1.{core::int::isEven};
+  } =>#t1;
+  core::int* v3 = let final core::int* #t2 = self::f<core::int*>() in block {
+    #t2.{core::int::isEven};
+    #t2.{core::int::isEven};
+  } =>#t2;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.textual_outline.expect b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline.expect
new file mode 100644
index 0000000..efa753c
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+T f<T>() => null;
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3be1b3a
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+T f<T>() => null;
+main() {}
+test() {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart b/pkg/front_end/testcases/general/generic_function_typedef.dart
new file mode 100644
index 0000000..4cdd14e
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart
@@ -0,0 +1,41 @@
+// 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.
+
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+    Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.outline.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.outline.expect
new file mode 100644
index 0000000..338c05f
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.outline.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
+typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef F1 = <T extends core::Object* = dynamic>() →* void;
+typedef F2 = <T extends core::num* = dynamic>() →* void;
+typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
+typedef F4 = <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
+typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
+typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
+typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
+typedef H4 = (<T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H5 = (<T extends S* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H6 = (<T extends core::num* = dynamic, S extends T* = dynamic>() →* void) →* void;
+static field <T extends core::Object* = dynamic>() →* void f1;
+static field <T extends core::num* = dynamic>() →* void f2;
+static field <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void f3;
+static field <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void f4;
+static field <T extends S* = dynamic, S extends core::num* = dynamic>() →* void f5;
+static field <T extends core::num* = dynamic, S extends T* = dynamic>() →* void f6;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.expect
new file mode 100644
index 0000000..adf2f0d
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
+typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef F1 = <T extends core::Object* = dynamic>() →* void;
+typedef F2 = <T extends core::num* = dynamic>() →* void;
+typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
+typedef F4 = <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
+typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
+typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
+typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
+typedef H4 = (<T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H5 = (<T extends S* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H6 = (<T extends core::num* = dynamic, S extends T* = dynamic>() →* void) →* void;
+static field <T extends core::Object* = dynamic>() →* void f1;
+static field <T extends core::num* = dynamic>() →* void f2;
+static field <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void f3;
+static field <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void f4;
+static field <T extends S* = dynamic, S extends core::num* = dynamic>() →* void f5;
+static field <T extends core::num* = dynamic, S extends T* = dynamic>() →* void f6;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.transformed.expect
new file mode 100644
index 0000000..adf2f0d
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
+typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef F1 = <T extends core::Object* = dynamic>() →* void;
+typedef F2 = <T extends core::num* = dynamic>() →* void;
+typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
+typedef F4 = <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
+typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
+typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
+typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
+typedef H4 = (<T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H5 = (<T extends S* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H6 = (<T extends core::num* = dynamic, S extends T* = dynamic>() →* void) →* void;
+static field <T extends core::Object* = dynamic>() →* void f1;
+static field <T extends core::num* = dynamic>() →* void f2;
+static field <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void f3;
+static field <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void f4;
+static field <T extends S* = dynamic, S extends core::num* = dynamic>() →* void f5;
+static field <T extends core::num* = dynamic, S extends T* = dynamic>() →* void f6;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline.expect
new file mode 100644
index 0000000..fd63028
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline.expect
@@ -0,0 +1,32 @@
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+    Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+main() {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5df2b1e
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline_modelled.expect
@@ -0,0 +1,32 @@
+main() {}
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+    Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T>() f1;
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
index 48f5952..ae46db2 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
@@ -76,15 +76,15 @@
 //   Map<String, String> map61 = <String, String>{...mapSpread};
 //                                                   ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
 //   List<int> lhs70 = <int>[...null];
 //                              ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
 //   Set<int> set70 = <int>{...null};
 //                             ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
 //     ...null,
 //        ^
 //
@@ -92,7 +92,7 @@
 //     ...null,
 //        ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
 //   Map<String, int> map70 = <String, int>{...null};
 //                                             ^
 //
@@ -302,10 +302,10 @@
   core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:129:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
   Map<String, String> map61 = <String, String>{...mapSpread};
                                                   ^"};
-  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^") in #t66;
   core::Set<dynamic>* set71ambiguous = block {
@@ -318,7 +318,7 @@
       #t68.{core::Set::add}(#t70);
     }
   } =>#t68;
-  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
index 91386ae..e42c97f 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -76,15 +76,15 @@
 //   Map<String, String> map61 = <String, String>{...mapSpread};
 //                                                   ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
 //   List<int> lhs70 = <int>[...null];
 //                              ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
 //   Set<int> set70 = <int>{...null};
 //                             ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
 //     ...null,
 //        ^
 //
@@ -92,7 +92,7 @@
 //     ...null,
 //        ^
 //
-// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
 //   Map<String, int> map70 = <String, int>{...null};
 //                                             ^
 //
@@ -431,10 +431,10 @@
   core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:129:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
   Map<String, String> map61 = <String, String>{...mapSpread};
                                                   ^"};
-  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^") in #t66;
   core::Set<dynamic>* set71ambiguous = block {
@@ -453,7 +453,7 @@
       }
     }
   } =>#t68;
-  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart b/pkg/front_end/testcases/general/type_variable_bound_access.dart
index 720e493..b25ab04 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart
@@ -22,6 +22,25 @@
   num method2() => field1 + field2.length;
 }
 
+class Class<X5 extends X4, X4 extends X3, X3 extends X2, X2 extends X1,
+    X1 extends X0, X0 extends int> {
+  X0 field0;
+  X1 field1;
+  X2 field2;
+  X3 field3;
+  X4 field4;
+  X5 field5;
+
+  method() {
+    field0.isEven;
+    field1.isEven;
+    field2.isEven;
+    field3.isEven;
+    field4.isEven;
+    field5.isEven;
+  }
+}
+
 main() {
   new DynamicClass<num, int>(0.5, 2).method();
   new NumClass<num, double>(2, 0.5).method1();
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect
index 6638397..b79b1d4 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect
@@ -40,5 +40,27 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+  generic-covariant-impl field self::Class::X0* field0;
+  generic-covariant-impl field self::Class::X1* field1;
+  generic-covariant-impl field self::Class::X2* field2;
+  generic-covariant-impl field self::Class::X3* field3;
+  generic-covariant-impl field self::Class::X4* field4;
+  generic-covariant-impl field self::Class::X5* field5;
+  synthetic constructor •() → self::Class<self::Class::X5*, self::Class::X4*, self::Class::X3*, self::Class::X2*, self::Class::X1*, self::Class::X0*>*
+    ;
+  method method() → dynamic
+    ;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect
index b39193d..e9cd064 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect
@@ -53,6 +53,35 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
   abstract member-signature get runtimeType() → core::Type*;
 }
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+  generic-covariant-impl field self::Class::X0* field0 = null;
+  generic-covariant-impl field self::Class::X1* field1 = null;
+  generic-covariant-impl field self::Class::X2* field2 = null;
+  generic-covariant-impl field self::Class::X3* field3 = null;
+  generic-covariant-impl field self::Class::X4* field4 = null;
+  generic-covariant-impl field self::Class::X5* field5 = null;
+  synthetic constructor •() → self::Class<self::Class::X5*, self::Class::X4*, self::Class::X3*, self::Class::X2*, self::Class::X1*, self::Class::X0*>*
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    this.{self::Class::field0}.{core::int::isEven};
+    this.{self::Class::field1}.{core::int::isEven};
+    this.{self::Class::field2}.{core::int::isEven};
+    this.{self::Class::field3}.{core::int::isEven};
+    this.{self::Class::field4}.{core::int::isEven};
+    this.{self::Class::field5}.{core::int::isEven};
+  }
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
 static method main() → dynamic {
   new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}();
   new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}();
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect
index d7f2e46..1b5e45c 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect
@@ -13,4 +13,15 @@
   num method2() => field1 + field2.length;
 }
 
+class Class<X5 extends X4, X4 extends X3, X3 extends X2, X2 extends X1,
+    X1 extends X0, X0 extends int> {
+  X0 field0;
+  X1 field1;
+  X2 field2;
+  X3 field3;
+  X4 field4;
+  X5 field5;
+  method() {}
+}
+
 main() {}
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect
index b92c57e..fdcee0a 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect
@@ -1,3 +1,14 @@
+class Class<X5 extends X4, X4 extends X3, X3 extends X2, X2 extends X1,
+    X1 extends X0, X0 extends int> {
+  X0 field0;
+  X1 field1;
+  X2 field2;
+  X3 field3;
+  X4 field4;
+  X5 field5;
+  method() {}
+}
+
 class DynamicClass<T extends dynamic, S extends T> {
   DynamicClass(this.field1, this.field2);
   T field1;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
index 5ff3546..977c606 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
@@ -76,15 +76,15 @@
 //   Map<String, String> map61 = <String, String>{...mapSpread};
 //                                                   ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
 //   List<int> lhs70 = <int>[...null];
 //                              ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
 //   Set<int> set70 = <int>{...null};
 //                             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type 'Null'.
 //     ...null,
 //        ^
 //
@@ -92,7 +92,7 @@
 //     ...null,
 //        ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
 //   Map<String, int> map70 = <String, int>{...null};
 //                                             ^
 //
@@ -302,10 +302,10 @@
   core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:131:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
   Map<String, String> map61 = <String, String>{...mapSpread};
                                                   ^"};
-  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^") in #t66;
   core::Set<dynamic>* set71ambiguous = block {
@@ -318,7 +318,7 @@
       #t68.{core::Set::add}(#t70);
     }
   } =>#t68;
-  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
index 69e0bad..6e97878 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
@@ -76,15 +76,15 @@
 //   Map<String, String> map61 = <String, String>{...mapSpread};
 //                                                   ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
 //   List<int> lhs70 = <int>[...null];
 //                              ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
 //   Set<int> set70 = <int>{...null};
 //                             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type 'Null'.
 //     ...null,
 //        ^
 //
@@ -92,7 +92,7 @@
 //     ...null,
 //        ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
 //   Map<String, int> map70 = <String, int>{...null};
 //                                             ^
 //
@@ -431,10 +431,10 @@
   core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:131:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
   Map<String, String> map61 = <String, String>{...mapSpread};
                                                   ^"};
-  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^") in #t66;
   core::Set<dynamic>* set71ambiguous = block {
@@ -453,7 +453,7 @@
       }
     }
   } =>#t68;
-  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart b/pkg/front_end/testcases/nnbd/duplicate_import.dart
new file mode 100644
index 0000000..1192cd9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart
@@ -0,0 +1,11 @@
+// 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 'duplicate_import_lib1.dart';
+import 'duplicate_import_lib2.dart';
+
+export 'duplicate_import_lib1.dart';
+export 'duplicate_import_lib2.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.outline.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.outline.expect
new file mode 100644
index 0000000..b60fe11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic
+  ;
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.transformed.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline.expect
new file mode 100644
index 0000000..0be0855
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+import 'duplicate_import_lib1.dart';
+import 'duplicate_import_lib2.dart';
+export 'duplicate_import_lib1.dart';
+export 'duplicate_import_lib2.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0be0855
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+import 'duplicate_import_lib1.dart';
+import 'duplicate_import_lib2.dart';
+export 'duplicate_import_lib1.dart';
+export 'duplicate_import_lib2.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import_lib1.dart b/pkg/front_end/testcases/nnbd/duplicate_import_lib1.dart
new file mode 100644
index 0000000..cb00fab
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import_lib1.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library foo;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import_lib2.dart b/pkg/front_end/testcases/nnbd/duplicate_import_lib2.dart
new file mode 100644
index 0000000..cb00fab
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import_lib2.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library foo;
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart b/pkg/front_end/testcases/nnbd/issue40954.dart
new file mode 100644
index 0000000..1f4585c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.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.
+
+class A {}
+
+class C {
+  static void test1(var v, [A a]) {}
+
+  static void test2(var v, {A a}) {}
+
+  void test11(var v, [A a]) {}
+
+  void test22(var v, {A a}) {}
+}
+
+void test1(var v, [A a]) {}
+
+void test2(var v, {A a}) {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.outline.expect
new file mode 100644
index 0000000..c6641b9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.outline.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test1(var v, [A a]) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test2(var v, {A a}) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test11(var v, [A a]) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test22(var v, {A a}) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    ;
+  static method test1(dynamic v, [self::A a]) → void
+    ;
+  static method test2(dynamic v, {self::A a}) → void
+    ;
+  method test11(dynamic v, [self::A a]) → void
+    ;
+  method test22(dynamic v, {self::A a}) → void
+    ;
+}
+static method test1(dynamic v, [self::A a]) → void
+  ;
+static method test2(dynamic v, {self::A a}) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test1(var v, [A a]) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test2(var v, {A a}) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test11(var v, [A a]) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test22(var v, {A a}) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method test1(dynamic v, [self::A a = #C1]) → void {}
+  static method test2(dynamic v, {self::A a = #C1}) → void {}
+  method test11(dynamic v, [self::A a = #C1]) → void {}
+  method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.transformed.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.transformed.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test1(var v, [A a]) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test2(var v, {A a}) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test11(var v, [A a]) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test22(var v, {A a}) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method test1(dynamic v, [self::A a = #C1]) → void {}
+  static method test2(dynamic v, {self::A a = #C1}) → void {}
+  method test11(dynamic v, [self::A a = #C1]) → void {}
+  method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline.expect
new file mode 100644
index 0000000..7998ca1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+class A {}
+
+class C {
+  static void test1(var v, [A a]) {}
+  static void test2(var v, {A a}) {}
+  void test11(var v, [A a]) {}
+  void test22(var v, {A a}) {}
+}
+
+void test1(var v, [A a]) {}
+void test2(var v, {A a}) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..53c9a4f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+class A {}
+
+class C {
+  static void test1(var v, [A a]) {}
+  static void test2(var v, {A a}) {}
+  void test11(var v, [A a]) {}
+  void test22(var v, {A a}) {}
+}
+
+main() {}
+void test1(var v, [A a]) {}
+void test2(var v, {A a}) {}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test1(var v, [A a]) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test2(var v, {A a}) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test11(var v, [A a]) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test22(var v, {A a}) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method test1(dynamic v, [self::A a = #C1]) → void {}
+  static method test2(dynamic v, {self::A a = #C1}) → void {}
+  method test11(dynamic v, [self::A a = #C1]) → void {}
+  method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.transformed.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.transformed.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test1(var v, [A a]) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   static void test2(var v, {A a}) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test11(var v, [A a]) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+//   void test22(var v, {A a}) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method test1(dynamic v, [self::A a = #C1]) → void {}
+  static method test2(dynamic v, {self::A a = #C1}) → void {}
+  method test11(dynamic v, [self::A a = #C1]) → void {}
+  method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
index 34eb654..652f6a1 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
@@ -11,7 +11,7 @@
 static final field core::List<core::int> s3;
 static final field dynamic s4;
 static field core::int? s5;
-static final field core::int? s6;
+static final field core::num s6;
 static field core::List<dynamic>? s7;
 static final field dynamic s8;
 static final field core::int s9;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
index 3daaf3e..2889d4d 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
@@ -90,7 +90,7 @@
   }
 }).call();
 static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 final s6 = s5 + 0;
               ^" in self::s5.{core::num::+}(0);
 static field core::List<dynamic>? s7;
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 673da56..d6311c9 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -90,7 +90,7 @@
   }
 }).call();
 static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 final s6 = s5 + 0;
               ^" in self::s5.{core::num::+}(0);
 static field core::List<dynamic>? s7;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
index 3daaf3e..2889d4d 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
@@ -90,7 +90,7 @@
   }
 }).call();
 static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 final s6 = s5 + 0;
               ^" in self::s5.{core::num::+}(0);
 static field core::List<dynamic>? s7;
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 673da56..d6311c9 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -90,7 +90,7 @@
   }
 }).call();
 static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 final s6 = s5 + 0;
               ^" in self::s5.{core::num::+}(0);
 static field core::List<dynamic>? s7;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart b/pkg/front_end/testcases/nnbd/issue41108.dart
new file mode 100644
index 0000000..3c86077
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+test() async {
+  List y = await l(); // should be a List?
+}
+
+Future<List>? l() => null;
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.outline.expect
new file mode 100644
index 0000000..2975c48
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.outline.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method test() → dynamic async 
+  ;
+static method l() → asy::Future<core::List<dynamic>>?
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
new file mode 100644
index 0000000..778d86e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+//  - 'List' is from 'dart:core'.
+//   List y = await l(); // should be a List?
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic async {
+  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+  List y = await l(); // should be a List?
+           ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
+}
+static method l() → asy::Future<core::List<dynamic>>?
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
new file mode 100644
index 0000000..87e1bf1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+//  - 'List' is from 'dart:core'.
+//   List y = await l(); // should be a List?
+//            ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+  List y = await l(); // should be a List?
+           ^";
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::l(), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<dynamic> y = let core::List<dynamic>? #t3 = _in::unsafeCast<core::List<dynamic>?>(:result) in #t3.==(null) ?{core::List<dynamic>} #t3 as{TypeError,ForNonNullableByDefault} core::List<dynamic> : #t3{core::List<dynamic>};
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method l() → asy::Future<core::List<dynamic>>?
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline.expect
new file mode 100644
index 0000000..da7cfbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+test() async {}
+Future<List>? l() => null;
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..933af90
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+Future<List>? l() => null;
+main() {}
+test() async {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
new file mode 100644
index 0000000..778d86e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+//  - 'List' is from 'dart:core'.
+//   List y = await l(); // should be a List?
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic async {
+  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+  List y = await l(); // should be a List?
+           ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
+}
+static method l() → asy::Future<core::List<dynamic>>?
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
new file mode 100644
index 0000000..255b564
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+//  - 'List' is from 'dart:core'.
+//   List y = await l(); // should be a List?
+//            ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+  List y = await l(); // should be a List?
+           ^";
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::l(), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<dynamic> y = _in::unsafeCast<core::List<dynamic>?>(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method l() → asy::Future<core::List<dynamic>>?
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect
index 5e2f0fe..11217a1 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect
@@ -6,7 +6,7 @@
 //   String Function(int) x2 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x3 = (int v) /* error */ {
 //                             ^
 //
@@ -14,7 +14,7 @@
 //   String Function(int) x5 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x6 = (int v) /* error */ {
 //                             ^
 //
@@ -22,7 +22,7 @@
 //   Future<String> Function(int) y2 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y3 = (int v) async /* error */ {
 //                                     ^
 //
@@ -30,7 +30,7 @@
 //   Future<String> Function(int) y5 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y6 = (int v) async /* error */ {
 //                                     ^
 //
@@ -81,13 +81,13 @@
   String Function(int) x2 = (int v) /* error */ {
                             ^" in null;
   };
-  (core::int) → core::String x3 = (core::int v) → Never {
+  (core::int) → core::String x3 = (core::int v) → core::String {
     try {
       return throw v;
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x3 = (int v) /* error */ {
                             ^" in null;
   };
@@ -101,13 +101,13 @@
   String Function(int) x5 = (int v) /* error */ {
                             ^" in null;
   };
-  (core::int) → core::String x6 = (core::int v) → Never {
+  (core::int) → core::String x6 = (core::int v) → core::String {
     try {
       return self::throwing();
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x6 = (int v) /* error */ {
                             ^" in null;
   };
@@ -121,13 +121,13 @@
   Future<String> Function(int) y2 = (int v) async /* error */ {
                                     ^" in null;
   };
-  (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> async {
+  (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> async {
     try {
       return throw v;
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y3 = (int v) async /* error */ {
                                     ^" in null;
   };
@@ -141,13 +141,13 @@
   Future<String> Function(int) y5 = (int v) async /* error */ {
                                     ^" in null;
   };
-  (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> async {
+  (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> async {
     try {
       return self::throwing();
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y6 = (int v) async /* error */ {
                                     ^" in null;
   };
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
index 96a261f..07174dc 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 //   String Function(int) x2 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x3 = (int v) /* error */ {
 //                             ^
 //
@@ -14,7 +14,7 @@
 //   String Function(int) x5 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x6 = (int v) /* error */ {
 //                             ^
 //
@@ -22,7 +22,7 @@
 //   Future<String> Function(int) y2 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y3 = (int v) async /* error */ {
 //                                     ^
 //
@@ -30,7 +30,7 @@
 //   Future<String> Function(int) y5 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y6 = (int v) async /* error */ {
 //                                     ^
 //
@@ -238,13 +238,13 @@
   String Function(int) x2 = (int v) /* error */ {
                             ^" in null;
         };
-        (core::int) → core::String x3 = (core::int v) → Never {
+        (core::int) → core::String x3 = (core::int v) → core::String {
           try {
             return throw v;
           }
           on core::Object catch(final core::Object _) {
           }
-          return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+          return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x3 = (int v) /* error */ {
                             ^" in null;
         };
@@ -258,13 +258,13 @@
   String Function(int) x5 = (int v) /* error */ {
                             ^" in null;
         };
-        (core::int) → core::String x6 = (core::int v) → Never {
+        (core::int) → core::String x6 = (core::int v) → core::String {
           try {
             return self::throwing();
           }
           on core::Object catch(final core::Object _) {
           }
-          return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+          return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x6 = (int v) /* error */ {
                             ^" in null;
         };
@@ -302,9 +302,9 @@
           :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
           return :async_completer.{asy::Completer::future};
         };
-        (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
-          FutureOr<Never>? :return_value;
+        (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -320,7 +320,7 @@
                 }
                 on core::Object catch(final core::Object _) {
                 }
-                :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+                :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y3 = (int v) async /* error */ {
                                     ^" in null;
                 break #L9;
@@ -371,9 +371,9 @@
           :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
           return :async_completer.{asy::Completer::future};
         };
-        (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
-          FutureOr<Never>? :return_value;
+        (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -389,7 +389,7 @@
                 }
                 on core::Object catch(final core::Object _) {
                 }
-                :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+                :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y6 = (int v) async /* error */ {
                                     ^" in null;
                 break #L11;
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect
index 5e2f0fe..11217a1 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect
@@ -6,7 +6,7 @@
 //   String Function(int) x2 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x3 = (int v) /* error */ {
 //                             ^
 //
@@ -14,7 +14,7 @@
 //   String Function(int) x5 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x6 = (int v) /* error */ {
 //                             ^
 //
@@ -22,7 +22,7 @@
 //   Future<String> Function(int) y2 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y3 = (int v) async /* error */ {
 //                                     ^
 //
@@ -30,7 +30,7 @@
 //   Future<String> Function(int) y5 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y6 = (int v) async /* error */ {
 //                                     ^
 //
@@ -81,13 +81,13 @@
   String Function(int) x2 = (int v) /* error */ {
                             ^" in null;
   };
-  (core::int) → core::String x3 = (core::int v) → Never {
+  (core::int) → core::String x3 = (core::int v) → core::String {
     try {
       return throw v;
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x3 = (int v) /* error */ {
                             ^" in null;
   };
@@ -101,13 +101,13 @@
   String Function(int) x5 = (int v) /* error */ {
                             ^" in null;
   };
-  (core::int) → core::String x6 = (core::int v) → Never {
+  (core::int) → core::String x6 = (core::int v) → core::String {
     try {
       return self::throwing();
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x6 = (int v) /* error */ {
                             ^" in null;
   };
@@ -121,13 +121,13 @@
   Future<String> Function(int) y2 = (int v) async /* error */ {
                                     ^" in null;
   };
-  (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> async {
+  (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> async {
     try {
       return throw v;
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y3 = (int v) async /* error */ {
                                     ^" in null;
   };
@@ -141,13 +141,13 @@
   Future<String> Function(int) y5 = (int v) async /* error */ {
                                     ^" in null;
   };
-  (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> async {
+  (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> async {
     try {
       return self::throwing();
     }
     on core::Object catch(final core::Object _) {
     }
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y6 = (int v) async /* error */ {
                                     ^" in null;
   };
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
index 96a261f..07174dc 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
 //   String Function(int) x2 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x3 = (int v) /* error */ {
 //                             ^
 //
@@ -14,7 +14,7 @@
 //   String Function(int) x5 = (int v) /* error */ {
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   String Function(int) x6 = (int v) /* error */ {
 //                             ^
 //
@@ -22,7 +22,7 @@
 //   Future<String> Function(int) y2 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y3 = (int v) async /* error */ {
 //                                     ^
 //
@@ -30,7 +30,7 @@
 //   Future<String> Function(int) y5 = (int v) async /* error */ {
 //                                     ^
 //
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 //   Future<String> Function(int) y6 = (int v) async /* error */ {
 //                                     ^
 //
@@ -238,13 +238,13 @@
   String Function(int) x2 = (int v) /* error */ {
                             ^" in null;
         };
-        (core::int) → core::String x3 = (core::int v) → Never {
+        (core::int) → core::String x3 = (core::int v) → core::String {
           try {
             return throw v;
           }
           on core::Object catch(final core::Object _) {
           }
-          return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+          return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x3 = (int v) /* error */ {
                             ^" in null;
         };
@@ -258,13 +258,13 @@
   String Function(int) x5 = (int v) /* error */ {
                             ^" in null;
         };
-        (core::int) → core::String x6 = (core::int v) → Never {
+        (core::int) → core::String x6 = (core::int v) → core::String {
           try {
             return self::throwing();
           }
           on core::Object catch(final core::Object _) {
           }
-          return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+          return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String Function(int) x6 = (int v) /* error */ {
                             ^" in null;
         };
@@ -302,9 +302,9 @@
           :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
           return :async_completer.{asy::Completer::future};
         };
-        (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
-          FutureOr<Never>? :return_value;
+        (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -320,7 +320,7 @@
                 }
                 on core::Object catch(final core::Object _) {
                 }
-                :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+                :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y3 = (int v) async /* error */ {
                                     ^" in null;
                 break #L9;
@@ -371,9 +371,9 @@
           :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
           return :async_completer.{asy::Completer::future};
         };
-        (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
-          FutureOr<Never>? :return_value;
+        (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -389,7 +389,7 @@
                 }
                 on core::Object catch(final core::Object _) {
                 }
-                :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+                :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   Future<String> Function(int) y6 = (int v) async /* error */ {
                                     ^" in null;
                 break #L11;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart b/pkg/front_end/testcases/nnbd/issue41415.dart
index 1b33195..be4be43 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart
@@ -2,14 +2,28 @@
 // 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.
 
-main() {
+main() {}
+test<X extends Null, Y extends Never?, Z extends Never>() {
   // Pre-NNBD bottom type.
   int Function(Null) f = (x) => 1; // Runtime type is int Function(Object?)
+
   // NNBD bottom type.
   int Function(Never) g = (x) => 1; // Runtime type is int Function(Object?)
-  // NNBD bottom type.
 
+  // NNBD bottom type.
   int Function(Never?) h = (x) => 1; // Runtime type is int Function(Object?)
 
   int Function(String) i = (x) => 1; // Runtime type is int Function(String)
+
+  // Pre-NNBD bottom type.
+  int Function(X) j = (x) => 1; // Runtime type is int Function(Object?)
+
+  // NNBD bottom type.
+  int Function(Y) k = (x) => 1; // Runtime type is int Function(Object?)
+
+  // NNBD bottom type.
+  int Function(Z) l = (x) => 1; // Runtime type is int Function(Object?)
+
+  // NNBD bottom type.
+  int Function(Z?) m = (x) => 1; // Runtime type is int Function(Object?)
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
index e2cba6b..0213dd7 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
@@ -1,5 +1,8 @@
 library /*isNonNullableByDefault*/;
 import self as self;
+import "dart:core" as core;
 
 static method main() → dynamic
   ;
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
@@ -2,9 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
   (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
+  (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+  (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+  (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+  (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
@@ -2,9 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
   (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
+  (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+  (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+  (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+  (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect
index bae895a..181fe21 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect
@@ -1 +1,2 @@
 main() {}
+test<X extends Null, Y extends Never?, Z extends Never>() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect
index bae895a..181fe21 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect
@@ -1 +1,2 @@
 main() {}
+test<X extends Null, Y extends Never?, Z extends Never>() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
@@ -2,9 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
   (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
+  (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+  (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+  (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+  (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
@@ -2,9 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
   (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
+  (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+  (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+  (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+  (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart b/pkg/front_end/testcases/nnbd/issue41697.dart
index 726edd9..5c4ea86 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart
@@ -4,8 +4,8 @@
 
 import 'dart:async';
 
-typedef G<T> = void Function<S extends T>(S);
-typedef H<T> = void Function<S extends FutureOr<T>>(S, FutureOr<T>);
+typedef G<T> = dynamic Function<S extends T>(S);
+typedef H<T> = dynamic Function<S extends FutureOr<T>>(S, FutureOr<T>);
 // TODO(johnniwinther): Enable and use these when #41951 is fixed to test that
 //  updating self referencing type parameters works.
 //typedef I<T> = void Function<S extends FutureOr<S>>(S, T);
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect
index f8add27..424dea6 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect
@@ -4,12 +4,12 @@
 
 import "dart:async";
 
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
 class C<T extends core::Object? = dynamic> extends core::Object {
-  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
-  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
-  constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+  constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
     ;
 }
 static method test1(self::C<core::num> c) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
index 1d85ea2..f0b15fb 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
@@ -20,12 +20,12 @@
 
 import "dart:async";
 
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
 class C<T extends core::Object? = dynamic> extends core::Object {
-  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
-  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
-  constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+  constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
     : self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
index 6179e4f..3355e4f 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
@@ -21,12 +21,12 @@
 
 import "dart:async";
 
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
 class C<T extends core::Object? = dynamic> extends core::Object {
-  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
-  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
-  constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+  constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
     : self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect
index 12ddfd2..33eaf3e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect
@@ -1,7 +1,7 @@
 import 'dart:async';
 
-typedef G<T> = void Function<S extends T>(S);
-typedef H<T> = void Function<S extends FutureOr<T>>(S, FutureOr<T>);
+typedef G<T> = dynamic Function<S extends T>(S);
+typedef H<T> = dynamic Function<S extends FutureOr<T>>(S, FutureOr<T>);
 
 class C<T> {
   G<T> field1;
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect
index 7db15d5..fccb4e7 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect
@@ -10,5 +10,5 @@
 test1(C<num> c) {}
 test2(C<num?> c) {}
 test3<S extends num?>(S s) => s + 1;
-typedef G<T> = void Function<S extends T>(S);
-typedef H<T> = void Function<S extends FutureOr<T>>(S, FutureOr<T>);
+typedef G<T> = dynamic Function<S extends T>(S);
+typedef H<T> = dynamic Function<S extends FutureOr<T>>(S, FutureOr<T>);
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
index 1d85ea2..f0b15fb 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
@@ -20,12 +20,12 @@
 
 import "dart:async";
 
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
 class C<T extends core::Object? = dynamic> extends core::Object {
-  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
-  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
-  constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+  constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
     : self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
index 6179e4f..3355e4f 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
@@ -21,12 +21,12 @@
 
 import "dart:async";
 
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
 class C<T extends core::Object? = dynamic> extends core::Object {
-  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
-  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
-  constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+  generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+  generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+  constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
     : self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
@@ -22,7 +22,7 @@
             ^" in s.{core::num::+}(1);
 }
 static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
-  core::num t = s.{core::num::+}(1);
+  core::int t = s.{core::num::+}(1);
 }
 static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
             ^" in s.{core::num::+}(1);
 }
 static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
-  core::num t = s.{core::num::+}(1);
+  core::int t = s.{core::num::+}(1);
 }
 static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
@@ -22,7 +22,7 @@
             ^" in s.{core::num::+}(1);
 }
 static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
-  core::num t = s.{core::num::+}(1);
+  core::int t = s.{core::num::+}(1);
 }
 static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
@@ -22,7 +22,7 @@
             ^" in s.{core::num::+}(1);
 }
 static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
-  core::num t = s.{core::num::+}(1);
+  core::int t = s.{core::num::+}(1);
 }
 static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart b/pkg/front_end/testcases/nnbd/issue42433.dart
new file mode 100644
index 0000000..4d3d4ed
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart
@@ -0,0 +1,12 @@
+// 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 X {}
+
+checkme<T extends X>(T? t) {}
+typedef Test<T extends X>(T? t);
+
+main() {
+  Test<X> t2 = checkme;
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.outline.expect
new file mode 100644
index 0000000..3c8de2a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.outline.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+  (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants  {
+  #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+  (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants  {
+  #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline.expect
new file mode 100644
index 0000000..b3831cf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+class X {}
+
+checkme<T extends X>(T? t) {}
+typedef Test<T extends X>(T? t);
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4c84bdf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+checkme<T extends X>(T? t) {}
+
+class X {}
+
+main() {}
+typedef Test<T extends X>(T? t);
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+  (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants  {
+  #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+  (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants  {
+  #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart b/pkg/front_end/testcases/nnbd/issue42459.dart
new file mode 100644
index 0000000..71e71e0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+test() {
+  (x) {
+    if (x) {
+      return 1;
+    } else {
+      return;
+    }
+  };
+
+  void local(x) {
+    if (x) {
+      return print('');
+    } else {
+      return;
+    }
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.outline.expect
new file mode 100644
index 0000000..64923de
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.outline.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+//       return;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  (dynamic x) → core::int? {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return 1;
+    }
+    else {
+      return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+      return;
+      ^" in null;
+    }
+  };
+  function local(dynamic x) → void {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return core::print("");
+    }
+    else {
+      return;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.transformed.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+//       return;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  (dynamic x) → core::int? {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return 1;
+    }
+    else {
+      return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+      return;
+      ^" in null;
+    }
+  };
+  function local(dynamic x) → void {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return core::print("");
+    }
+    else {
+      return;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline.expect
new file mode 100644
index 0000000..ec6b9e0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f67dbb0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+main() {}
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+//       return;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  (dynamic x) → core::int? {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return 1;
+    }
+    else {
+      return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+      return;
+      ^" in null;
+    }
+  };
+  function local(dynamic x) → void {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return core::print("");
+    }
+    else {
+      return;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.transformed.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+//       return;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  (dynamic x) → core::int? {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return 1;
+    }
+    else {
+      return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+      return;
+      ^" in null;
+    }
+  };
+  function local(dynamic x) → void {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return core::print("");
+    }
+    else {
+      return;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart b/pkg/front_end/testcases/nnbd/issue42603.dart
new file mode 100644
index 0000000..26b7215
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart
@@ -0,0 +1,33 @@
+// 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 C {
+  bool operator ==(Object other) => true;
+}
+
+class D extends C {
+  bool operator ==(Object? other) => super == other;
+
+  bool method1(dynamic o) => super == o;
+
+  bool method2(Null o) => super == o;
+}
+
+class E {
+  bool operator ==() => true;
+}
+
+class F extends E {
+  bool operator ==(Object? other) => super == other;
+}
+
+main() {
+  expect(true, D() == D());
+  expect(false, D().method1(null));
+  expect(false, D().method2(null));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
new file mode 100644
index 0000000..384e012
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
@@ -0,0 +1,57 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: Operator '==' should have exactly one parameter.
+//   bool operator ==() => true;
+//                 ^^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
+//   bool operator ==() => true;
+//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('==').
+//   bool operator ==(Object other) native "Object_equals";
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
+//   bool operator ==(Object? other) => super == other;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Context: This is the overridden method ('==').
+//   bool operator ==() => true;
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    ;
+  operator ==(core::Object other) → core::bool
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    ;
+  operator ==(core::Object? other) → core::bool
+    ;
+  method method1(dynamic o) → core::bool
+    ;
+  method method2(core::Null? o) → core::bool
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E
+    ;
+  operator ==() → core::bool
+    ;
+}
+class F extends self::E {
+  synthetic constructor •() → self::F
+    ;
+  operator ==(core::Object? other) → core::bool
+    ;
+}
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
new file mode 100644
index 0000000..91362db
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: Operator '==' should have exactly one parameter.
+//   bool operator ==() => true;
+//                 ^^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
+//   bool operator ==() => true;
+//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('==').
+//   bool operator ==(Object other) native "Object_equals";
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
+//   bool operator ==(Object? other) => super == other;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Context: This is the overridden method ('==').
+//   bool operator ==() => true;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   bool operator ==(Object? other) => super == other;
+//                                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool
+    return true;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  operator ==(core::Object? other) → core::bool
+    return super.{self::C::==}(other);
+  method method1(dynamic o) → core::bool
+    return super.{self::C::==}(o);
+  method method2(core::Null? o) → core::bool
+    return super.{self::C::==}(o);
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+  operator ==() → core::bool
+    return true;
+}
+class F extends self::E {
+  synthetic constructor •() → self::F
+    : super self::E::•()
+    ;
+  operator ==(core::Object? other) → core::bool
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  bool operator ==(Object? other) => super == other;
+                                           ^" in super.{self::E::==}(other);
+}
+static method main() → dynamic {
+  self::expect(true, new self::D::•().{self::D::==}(new self::D::•()));
+  self::expect(false, new self::D::•().{self::D::method1}(null));
+  self::expect(false, new self::D::•().{self::D::method2}(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline.expect
new file mode 100644
index 0000000..9897d454
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline.expect
@@ -0,0 +1,20 @@
+class C {
+  bool operator ==(Object other) => true;
+}
+
+class D extends C {
+  bool operator ==(Object? other) => super == other;
+  bool method1(dynamic o) => super == o;
+  bool method2(Null o) => super == o;
+}
+
+class E {
+  bool operator ==() => true;
+}
+
+class F extends E {
+  bool operator ==(Object? other) => super == other;
+}
+
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..de73fe7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline_modelled.expect
@@ -0,0 +1,20 @@
+class C {
+  bool operator ==(Object other) => true;
+}
+
+class D extends C {
+  bool method1(dynamic o) => super == o;
+  bool method2(Null o) => super == o;
+  bool operator ==(Object? other) => super == other;
+}
+
+class E {
+  bool operator ==() => true;
+}
+
+class F extends E {
+  bool operator ==(Object? other) => super == other;
+}
+
+expect(expected, actual) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
new file mode 100644
index 0000000..91362db
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: Operator '==' should have exactly one parameter.
+//   bool operator ==() => true;
+//                 ^^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
+//   bool operator ==() => true;
+//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('==').
+//   bool operator ==(Object other) native "Object_equals";
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
+//   bool operator ==(Object? other) => super == other;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Context: This is the overridden method ('==').
+//   bool operator ==() => true;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   bool operator ==(Object? other) => super == other;
+//                                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool
+    return true;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  operator ==(core::Object? other) → core::bool
+    return super.{self::C::==}(other);
+  method method1(dynamic o) → core::bool
+    return super.{self::C::==}(o);
+  method method2(core::Null? o) → core::bool
+    return super.{self::C::==}(o);
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+  operator ==() → core::bool
+    return true;
+}
+class F extends self::E {
+  synthetic constructor •() → self::F
+    : super self::E::•()
+    ;
+  operator ==(core::Object? other) → core::bool
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  bool operator ==(Object? other) => super == other;
+                                           ^" in super.{self::E::==}(other);
+}
+static method main() → dynamic {
+  self::expect(true, new self::D::•().{self::D::==}(new self::D::•()));
+  self::expect(false, new self::D::•().{self::D::method1}(null));
+  self::expect(false, new self::D::•().{self::D::method2}(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart b/pkg/front_end/testcases/nnbd/issue42743.dart
new file mode 100644
index 0000000..2ac0239
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() async {
+  bool b = true;
+  (_) {
+    if (b) return 42;
+  };
+  (_) async {
+    if (b) return 42;
+  };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.outline.expect
new file mode 100644
index 0000000..074fe5d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.outline.expect
@@ -0,0 +1,5 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method main() → dynamic async 
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.expect
new file mode 100644
index 0000000..ca71c73
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+  core::bool b = true;
+  (dynamic _) → core::int? {
+    if(b)
+      return 42;
+  };
+  (dynamic _) → asy::Future<core::int?> async {
+    if(b)
+      return 42;
+  };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect
new file mode 100644
index 0000000..454a896
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::bool b = true;
+        (dynamic _) → core::int? {
+          if(b)
+            return 42;
+        };
+        (dynamic _) → asy::Future<core::int?> /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+          FutureOr<core::int?>? :return_value;
+          dynamic :async_stack_trace;
+          (dynamic) → dynamic :async_op_then;
+          (core::Object, core::StackTrace) → dynamic :async_op_error;
+          core::int :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L2:
+              {
+                if(b) {
+                  :return_value = 42;
+                  break #L2;
+                }
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+          return :async_completer.{asy::Completer::future};
+        };
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline.expect
new file mode 100644
index 0000000..386f405
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline.expect
@@ -0,0 +1 @@
+main() async {}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..386f405
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline_modelled.expect
@@ -0,0 +1 @@
+main() async {}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.expect
new file mode 100644
index 0000000..ca71c73
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+  core::bool b = true;
+  (dynamic _) → core::int? {
+    if(b)
+      return 42;
+  };
+  (dynamic _) → asy::Future<core::int?> async {
+    if(b)
+      return 42;
+  };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect
new file mode 100644
index 0000000..454a896
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::bool b = true;
+        (dynamic _) → core::int? {
+          if(b)
+            return 42;
+        };
+        (dynamic _) → asy::Future<core::int?> /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+          FutureOr<core::int?>? :return_value;
+          dynamic :async_stack_trace;
+          (dynamic) → dynamic :async_op_then;
+          (core::Object, core::StackTrace) → dynamic :async_op_error;
+          core::int :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L2:
+              {
+                if(b) {
+                  :return_value = 42;
+                  break #L2;
+                }
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+          return :async_completer.{asy::Completer::future};
+        };
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart b/pkg/front_end/testcases/nnbd/issue42758.dart
new file mode 100644
index 0000000..38474ee
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart
@@ -0,0 +1,48 @@
+// 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.
+
+test1(Never n1, Never? n2, Null n3) {
+  var l1 = [...n1];
+  var l2 = [...?n1];
+  var l3 = [...n2];
+  var l4 = [...?n2];
+  var l5 = [...n3];
+  var l6 = [...?n3];
+  var s1 = {...n1, n1};
+  var s2 = {...?n1, n1};
+  var s3 = {...n2, n1};
+  var s4 = {...?n2, n1};
+  var s5 = {...n3, n1};
+  var s6 = {...?n3, n1};
+  var m1 = {...n1, n1: n1};
+  var m2 = {...?n1, n1: n1};
+  var m3 = {...n2, n1: n1};
+  var m4 = {...?n2, n1: n1};
+  var m5 = {...n3, n1: n1};
+  var m6 = {...?n3, n1: n1};
+}
+
+test2<N1 extends Never, N2 extends Never?, N3 extends Null>(
+    N1 n1, N2 n2, N3 n3) {
+  var l1 = [...n1];
+  var l2 = [...?n1];
+  var l3 = [...n2];
+  var l4 = [...?n2];
+  var l5 = [...n3];
+  var l6 = [...?n3];
+  var s1 = {...n1, n1};
+  var s2 = {...?n1, n1};
+  var s3 = {...n2, n1};
+  var s4 = {...?n2, n1};
+  var s5 = {...n3, n1};
+  var s6 = {...?n3, n1};
+  var m1 = {...n1, n1: n1};
+  var m2 = {...?n1, n1: n1};
+  var m3 = {...n2, n1: n1};
+  var m4 = {...?n2, n1: n1};
+  var m5 = {...n3, n1: n1};
+  var m6 = {...?n3, n1: n1};
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
new file mode 100644
index 0000000..3ada4d6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic
+  ;
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
new file mode 100644
index 0000000..6e4b63d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
@@ -0,0 +1,293 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t1 = <Never>[];
+    for (final Never #t2 in n1)
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t3 = <Never>[];
+    final core::Iterable<Never>? #t4 = n1;
+    if(!#t4.{core::Object::==}(null))
+      for (final Never #t5 in #t4{core::Iterable<Never>})
+        #t3.{core::List::add}(#t5);
+  } =>#t3;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t6 = <Never>[];
+    final core::Iterable<Never>? #t7 = n2;
+    if(!#t7.{core::Object::==}(null))
+      for (final Never #t8 in #t7{core::Iterable<Never>})
+        #t6.{core::List::add}(#t8);
+  } =>#t6;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t9 = <Never>[];
+    final core::Iterable<Never>? #t10 = n3;
+    if(!#t10.{core::Object::==}(null))
+      for (final Never #t11 in #t10{core::Iterable<Never>})
+        #t9.{core::List::add}(#t11);
+  } =>#t9;
+  core::Set<Never> s1 = block {
+    final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+    for (final Never #t13 in n1)
+      #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(n1);
+  } =>#t12;
+  core::Set<Never> s2 = block {
+    final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t15 = n1;
+    if(!#t15.{core::Object::==}(null))
+      for (final Never #t16 in #t15{core::Iterable<Never>})
+        #t14.{core::Set::add}(#t16);
+    #t14.{core::Set::add}(n1);
+  } =>#t14;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  var s3 = {...n2, n1};
+               ^") in let final dynamic #t19 = #t17.{core::Set::add}(n1) in #t17;
+  core::Set<Never> s4 = block {
+    final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t21 = n2;
+    if(!#t21.{core::Object::==}(null))
+      for (final Never #t22 in #t21{core::Iterable<Never>})
+        #t20.{core::Set::add}(#t22);
+    #t20.{core::Set::add}(n1);
+  } =>#t20;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+  var s5 = {...n3, n1};
+               ^") in let final dynamic #t25 = #t23.{core::Set::add}(n1) in #t23;
+  core::Set<Never> s6 = block {
+    final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t27 = n3;
+    if(!#t27.{core::Object::==}(null))
+      for (final Never #t28 in #t27{core::Iterable<Never>})
+        #t26.{core::Set::add}(#t28);
+    #t26.{core::Set::add}(n1);
+  } =>#t26;
+  core::Map<Never, Never> m1 = block {
+    final core::Map<Never, Never> #t29 = <Never, Never>{};
+    for (final core::MapEntry<Never, Never> #t30 in n1.{core::Map::entries})
+      #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+    #t29.{core::Map::[]=}(n1, n1);
+  } =>#t29;
+  core::Map<Never, Never> m2 = block {
+    final core::Map<Never, Never> #t31 = <Never, Never>{};
+    final core::Map<Never, Never>? #t32 = n1;
+    if(!#t32.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t33 in #t32{core::Map<Never, Never>}.{core::Map::entries})
+        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t31.{core::Map::[]=}(n1, n1);
+  } =>#t31;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m4 = block {
+    final core::Map<Never, Never> #t34 = <Never, Never>{};
+    final core::Map<Never, Never>? #t35 = n2;
+    if(!#t35.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t36 in #t35{core::Map<Never, Never>}.{core::Map::entries})
+        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+    #t34.{core::Map::[]=}(n1, n1);
+  } =>#t34;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m6 = block {
+    final core::Map<Never, Never> #t37 = <Never, Never>{};
+    final core::Map<Never, Never>? #t38 = n3;
+    if(!#t38.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t39 in #t38{core::Map<Never, Never>}.{core::Map::entries})
+        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t37.{core::Map::[]=}(n1, n1);
+  } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t40 = <Never>[];
+    for (final Never #t41 in n1)
+      #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t42 = <Never>[];
+    final core::Iterable<Never>? #t43 = n1;
+    if(!#t43.{core::Object::==}(null))
+      for (final Never #t44 in #t43{core::Iterable<Never>})
+        #t42.{core::List::add}(#t44);
+  } =>#t42;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t45 = <Never>[];
+    final core::Iterable<Never>? #t46 = n2;
+    if(!#t46.{core::Object::==}(null))
+      for (final Never #t47 in #t46{core::Iterable<Never>})
+        #t45.{core::List::add}(#t47);
+  } =>#t45;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t48 = <Never>[];
+    final core::Iterable<Never>? #t49 = n3;
+    if(!#t49.{core::Object::==}(null))
+      for (final Never #t50 in #t49{core::Iterable<Never>})
+        #t48.{core::List::add}(#t50);
+  } =>#t48;
+  core::Set<self::test2::N1> s1 = block {
+    final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t52 in n1)
+      #t51.{core::Set::add}(#t52);
+    #t51.{core::Set::add}(n1);
+  } =>#t51;
+  core::Set<self::test2::N1> s2 = block {
+    final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t54 = n1;
+    if(!#t54.{core::Object::==}(null))
+      for (final self::test2::N1 #t55 in #t54{core::Iterable<self::test2::N1>})
+        #t53.{core::Set::add}(#t55);
+    #t53.{core::Set::add}(n1);
+  } =>#t53;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  var s3 = {...n2, n1};
+               ^") in let final dynamic #t58 = #t56.{core::Set::add}(n1) in #t56;
+  core::Set<self::test2::N1> s4 = block {
+    final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t60 = n2;
+    if(!#t60.{core::Object::==}(null))
+      for (final self::test2::N1 #t61 in #t60{core::Iterable<self::test2::N1>})
+        #t59.{core::Set::add}(#t61);
+    #t59.{core::Set::add}(n1);
+  } =>#t59;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  var s5 = {...n3, n1};
+               ^") in let final dynamic #t64 = #t62.{core::Set::add}(n1) in #t62;
+  core::Set<self::test2::N1> s6 = block {
+    final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t66 = n3;
+    if(!#t66.{core::Object::==}(null))
+      for (final self::test2::N1 #t67 in #t66{core::Iterable<self::test2::N1>})
+        #t65.{core::Set::add}(#t67);
+    #t65.{core::Set::add}(n1);
+  } =>#t65;
+  core::Map<self::test2::N1, self::test2::N1> m1 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+    for (final core::MapEntry<self::test2::N1, self::test2::N1> #t69 in n1.{core::Map::entries})
+      #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+    #t68.{core::Map::[]=}(n1, n1);
+  } =>#t68;
+  core::Map<self::test2::N1, self::test2::N1> m2 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+    if(!#t71.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t72 in #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+    #t70.{core::Map::[]=}(n1, n1);
+  } =>#t70;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m4 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+    if(!#t74.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t75 in #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+    #t73.{core::Map::[]=}(n1, n1);
+  } =>#t73;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m6 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+    if(!#t77.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t78 in #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+    #t76.{core::Map::[]=}(n1, n1);
+  } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
new file mode 100644
index 0000000..f24f351
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -0,0 +1,375 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t1 = <Never>[];
+    for (final Never #t2 in n1)
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t3 = <Never>[];
+    final core::Iterable<Never>? #t4 = n1;
+    if(!#t4.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t4{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t5 = :sync-for-iterator.{core::Iterator::current};
+        #t3.{core::List::add}(#t5);
+      }
+    }
+  } =>#t3;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t6 = <Never>[];
+    final core::Iterable<Never>? #t7 = n2;
+    if(!#t7.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t7{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t8 = :sync-for-iterator.{core::Iterator::current};
+        #t6.{core::List::add}(#t8);
+      }
+    }
+  } =>#t6;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t9 = <Never>[];
+    final core::Iterable<Never>? #t10 = n3;
+    if(!#t10.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t10{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t11 = :sync-for-iterator.{core::Iterator::current};
+        #t9.{core::List::add}(#t11);
+      }
+    }
+  } =>#t9;
+  core::Set<Never> s1 = block {
+    final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+    for (final Never #t13 in n1)
+      #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(n1);
+  } =>#t12;
+  core::Set<Never> s2 = block {
+    final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t15 = n1;
+    if(!#t15.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t16 = :sync-for-iterator.{core::Iterator::current};
+        #t14.{core::Set::add}(#t16);
+      }
+    }
+    #t14.{core::Set::add}(n1);
+  } =>#t14;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  var s3 = {...n2, n1};
+               ^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
+  core::Set<Never> s4 = block {
+    final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t21 = n2;
+    if(!#t21.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t22 = :sync-for-iterator.{core::Iterator::current};
+        #t20.{core::Set::add}(#t22);
+      }
+    }
+    #t20.{core::Set::add}(n1);
+  } =>#t20;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+  var s5 = {...n3, n1};
+               ^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
+  core::Set<Never> s6 = block {
+    final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t27 = n3;
+    if(!#t27.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t28 = :sync-for-iterator.{core::Iterator::current};
+        #t26.{core::Set::add}(#t28);
+      }
+    }
+    #t26.{core::Set::add}(n1);
+  } =>#t26;
+  core::Map<Never, Never> m1 = block {
+    final core::Map<Never, Never> #t29 = <Never, Never>{};
+    {
+      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t30 = :sync-for-iterator.{core::Iterator::current};
+        #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+      }
+    }
+    #t29.{core::Map::[]=}(n1, n1);
+  } =>#t29;
+  core::Map<Never, Never> m2 = block {
+    final core::Map<Never, Never> #t31 = <Never, Never>{};
+    final core::Map<Never, Never>? #t32 = n1;
+    if(!#t32.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t32{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t33 = :sync-for-iterator.{core::Iterator::current};
+        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+      }
+    }
+    #t31.{core::Map::[]=}(n1, n1);
+  } =>#t31;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m4 = block {
+    final core::Map<Never, Never> #t34 = <Never, Never>{};
+    final core::Map<Never, Never>? #t35 = n2;
+    if(!#t35.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t35{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t36 = :sync-for-iterator.{core::Iterator::current};
+        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+      }
+    }
+    #t34.{core::Map::[]=}(n1, n1);
+  } =>#t34;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m6 = block {
+    final core::Map<Never, Never> #t37 = <Never, Never>{};
+    final core::Map<Never, Never>? #t38 = n3;
+    if(!#t38.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t38{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t39 = :sync-for-iterator.{core::Iterator::current};
+        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+      }
+    }
+    #t37.{core::Map::[]=}(n1, n1);
+  } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t40 = <Never>[];
+    for (final Never #t41 in n1)
+      #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t42 = <Never>[];
+    final core::Iterable<Never>? #t43 = n1;
+    if(!#t43.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t43{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t44 = :sync-for-iterator.{core::Iterator::current};
+        #t42.{core::List::add}(#t44);
+      }
+    }
+  } =>#t42;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t45 = <Never>[];
+    final core::Iterable<Never>? #t46 = n2;
+    if(!#t46.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t46{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t47 = :sync-for-iterator.{core::Iterator::current};
+        #t45.{core::List::add}(#t47);
+      }
+    }
+  } =>#t45;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t48 = <Never>[];
+    final core::Iterable<Never>? #t49 = n3;
+    if(!#t49.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t49{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t50 = :sync-for-iterator.{core::Iterator::current};
+        #t48.{core::List::add}(#t50);
+      }
+    }
+  } =>#t48;
+  core::Set<self::test2::N1> s1 = block {
+    final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t52 in n1)
+      #t51.{core::Set::add}(#t52);
+    #t51.{core::Set::add}(n1);
+  } =>#t51;
+  core::Set<self::test2::N1> s2 = block {
+    final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t54 = n1;
+    if(!#t54.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t55 = :sync-for-iterator.{core::Iterator::current};
+        #t53.{core::Set::add}(#t55);
+      }
+    }
+    #t53.{core::Set::add}(n1);
+  } =>#t53;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  var s3 = {...n2, n1};
+               ^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
+  core::Set<self::test2::N1> s4 = block {
+    final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t60 = n2;
+    if(!#t60.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t61 = :sync-for-iterator.{core::Iterator::current};
+        #t59.{core::Set::add}(#t61);
+      }
+    }
+    #t59.{core::Set::add}(n1);
+  } =>#t59;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  var s5 = {...n3, n1};
+               ^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
+  core::Set<self::test2::N1> s6 = block {
+    final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t66 = n3;
+    if(!#t66.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t67 = :sync-for-iterator.{core::Iterator::current};
+        #t65.{core::Set::add}(#t67);
+      }
+    }
+    #t65.{core::Set::add}(n1);
+  } =>#t65;
+  core::Map<self::test2::N1, self::test2::N1> m1 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+    {
+      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t69 = :sync-for-iterator.{core::Iterator::current};
+        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+      }
+    }
+    #t68.{core::Map::[]=}(n1, n1);
+  } =>#t68;
+  core::Map<self::test2::N1, self::test2::N1> m2 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+    if(!#t71.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t72 = :sync-for-iterator.{core::Iterator::current};
+        #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+      }
+    }
+    #t70.{core::Map::[]=}(n1, n1);
+  } =>#t70;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m4 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+    if(!#t74.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t75 = :sync-for-iterator.{core::Iterator::current};
+        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+      }
+    }
+    #t73.{core::Map::[]=}(n1, n1);
+  } =>#t73;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m6 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+    if(!#t77.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t78 = :sync-for-iterator.{core::Iterator::current};
+        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+      }
+    }
+    #t76.{core::Map::[]=}(n1, n1);
+  } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline.expect
new file mode 100644
index 0000000..09008cc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+test1(Never n1, Never? n2, Null n3) {}
+test2<N1 extends Never, N2 extends Never?, N3 extends Null>(
+    N1 n1, N2 n2, N3 n3) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7dc1872
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+main() {}
+test1(Never n1, Never? n2, Null n3) {}
+test2<N1 extends Never, N2 extends Never?, N3 extends Null>(
+    N1 n1, N2 n2, N3 n3) {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
new file mode 100644
index 0000000..6e4b63d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
@@ -0,0 +1,293 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t1 = <Never>[];
+    for (final Never #t2 in n1)
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t3 = <Never>[];
+    final core::Iterable<Never>? #t4 = n1;
+    if(!#t4.{core::Object::==}(null))
+      for (final Never #t5 in #t4{core::Iterable<Never>})
+        #t3.{core::List::add}(#t5);
+  } =>#t3;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t6 = <Never>[];
+    final core::Iterable<Never>? #t7 = n2;
+    if(!#t7.{core::Object::==}(null))
+      for (final Never #t8 in #t7{core::Iterable<Never>})
+        #t6.{core::List::add}(#t8);
+  } =>#t6;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t9 = <Never>[];
+    final core::Iterable<Never>? #t10 = n3;
+    if(!#t10.{core::Object::==}(null))
+      for (final Never #t11 in #t10{core::Iterable<Never>})
+        #t9.{core::List::add}(#t11);
+  } =>#t9;
+  core::Set<Never> s1 = block {
+    final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+    for (final Never #t13 in n1)
+      #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(n1);
+  } =>#t12;
+  core::Set<Never> s2 = block {
+    final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t15 = n1;
+    if(!#t15.{core::Object::==}(null))
+      for (final Never #t16 in #t15{core::Iterable<Never>})
+        #t14.{core::Set::add}(#t16);
+    #t14.{core::Set::add}(n1);
+  } =>#t14;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  var s3 = {...n2, n1};
+               ^") in let final dynamic #t19 = #t17.{core::Set::add}(n1) in #t17;
+  core::Set<Never> s4 = block {
+    final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t21 = n2;
+    if(!#t21.{core::Object::==}(null))
+      for (final Never #t22 in #t21{core::Iterable<Never>})
+        #t20.{core::Set::add}(#t22);
+    #t20.{core::Set::add}(n1);
+  } =>#t20;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+  var s5 = {...n3, n1};
+               ^") in let final dynamic #t25 = #t23.{core::Set::add}(n1) in #t23;
+  core::Set<Never> s6 = block {
+    final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t27 = n3;
+    if(!#t27.{core::Object::==}(null))
+      for (final Never #t28 in #t27{core::Iterable<Never>})
+        #t26.{core::Set::add}(#t28);
+    #t26.{core::Set::add}(n1);
+  } =>#t26;
+  core::Map<Never, Never> m1 = block {
+    final core::Map<Never, Never> #t29 = <Never, Never>{};
+    for (final core::MapEntry<Never, Never> #t30 in n1.{core::Map::entries})
+      #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+    #t29.{core::Map::[]=}(n1, n1);
+  } =>#t29;
+  core::Map<Never, Never> m2 = block {
+    final core::Map<Never, Never> #t31 = <Never, Never>{};
+    final core::Map<Never, Never>? #t32 = n1;
+    if(!#t32.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t33 in #t32{core::Map<Never, Never>}.{core::Map::entries})
+        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t31.{core::Map::[]=}(n1, n1);
+  } =>#t31;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m4 = block {
+    final core::Map<Never, Never> #t34 = <Never, Never>{};
+    final core::Map<Never, Never>? #t35 = n2;
+    if(!#t35.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t36 in #t35{core::Map<Never, Never>}.{core::Map::entries})
+        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+    #t34.{core::Map::[]=}(n1, n1);
+  } =>#t34;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m6 = block {
+    final core::Map<Never, Never> #t37 = <Never, Never>{};
+    final core::Map<Never, Never>? #t38 = n3;
+    if(!#t38.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t39 in #t38{core::Map<Never, Never>}.{core::Map::entries})
+        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t37.{core::Map::[]=}(n1, n1);
+  } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t40 = <Never>[];
+    for (final Never #t41 in n1)
+      #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t42 = <Never>[];
+    final core::Iterable<Never>? #t43 = n1;
+    if(!#t43.{core::Object::==}(null))
+      for (final Never #t44 in #t43{core::Iterable<Never>})
+        #t42.{core::List::add}(#t44);
+  } =>#t42;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t45 = <Never>[];
+    final core::Iterable<Never>? #t46 = n2;
+    if(!#t46.{core::Object::==}(null))
+      for (final Never #t47 in #t46{core::Iterable<Never>})
+        #t45.{core::List::add}(#t47);
+  } =>#t45;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t48 = <Never>[];
+    final core::Iterable<Never>? #t49 = n3;
+    if(!#t49.{core::Object::==}(null))
+      for (final Never #t50 in #t49{core::Iterable<Never>})
+        #t48.{core::List::add}(#t50);
+  } =>#t48;
+  core::Set<self::test2::N1> s1 = block {
+    final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t52 in n1)
+      #t51.{core::Set::add}(#t52);
+    #t51.{core::Set::add}(n1);
+  } =>#t51;
+  core::Set<self::test2::N1> s2 = block {
+    final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t54 = n1;
+    if(!#t54.{core::Object::==}(null))
+      for (final self::test2::N1 #t55 in #t54{core::Iterable<self::test2::N1>})
+        #t53.{core::Set::add}(#t55);
+    #t53.{core::Set::add}(n1);
+  } =>#t53;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  var s3 = {...n2, n1};
+               ^") in let final dynamic #t58 = #t56.{core::Set::add}(n1) in #t56;
+  core::Set<self::test2::N1> s4 = block {
+    final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t60 = n2;
+    if(!#t60.{core::Object::==}(null))
+      for (final self::test2::N1 #t61 in #t60{core::Iterable<self::test2::N1>})
+        #t59.{core::Set::add}(#t61);
+    #t59.{core::Set::add}(n1);
+  } =>#t59;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  var s5 = {...n3, n1};
+               ^") in let final dynamic #t64 = #t62.{core::Set::add}(n1) in #t62;
+  core::Set<self::test2::N1> s6 = block {
+    final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t66 = n3;
+    if(!#t66.{core::Object::==}(null))
+      for (final self::test2::N1 #t67 in #t66{core::Iterable<self::test2::N1>})
+        #t65.{core::Set::add}(#t67);
+    #t65.{core::Set::add}(n1);
+  } =>#t65;
+  core::Map<self::test2::N1, self::test2::N1> m1 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+    for (final core::MapEntry<self::test2::N1, self::test2::N1> #t69 in n1.{core::Map::entries})
+      #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+    #t68.{core::Map::[]=}(n1, n1);
+  } =>#t68;
+  core::Map<self::test2::N1, self::test2::N1> m2 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+    if(!#t71.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t72 in #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+    #t70.{core::Map::[]=}(n1, n1);
+  } =>#t70;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m4 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+    if(!#t74.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t75 in #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+    #t73.{core::Map::[]=}(n1, n1);
+  } =>#t73;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m6 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+    if(!#t77.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t78 in #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+    #t76.{core::Map::[]=}(n1, n1);
+  } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
new file mode 100644
index 0000000..f24f351
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -0,0 +1,375 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t1 = <Never>[];
+    for (final Never #t2 in n1)
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t3 = <Never>[];
+    final core::Iterable<Never>? #t4 = n1;
+    if(!#t4.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t4{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t5 = :sync-for-iterator.{core::Iterator::current};
+        #t3.{core::List::add}(#t5);
+      }
+    }
+  } =>#t3;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t6 = <Never>[];
+    final core::Iterable<Never>? #t7 = n2;
+    if(!#t7.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t7{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t8 = :sync-for-iterator.{core::Iterator::current};
+        #t6.{core::List::add}(#t8);
+      }
+    }
+  } =>#t6;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t9 = <Never>[];
+    final core::Iterable<Never>? #t10 = n3;
+    if(!#t10.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t10{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t11 = :sync-for-iterator.{core::Iterator::current};
+        #t9.{core::List::add}(#t11);
+      }
+    }
+  } =>#t9;
+  core::Set<Never> s1 = block {
+    final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+    for (final Never #t13 in n1)
+      #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(n1);
+  } =>#t12;
+  core::Set<Never> s2 = block {
+    final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t15 = n1;
+    if(!#t15.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t16 = :sync-for-iterator.{core::Iterator::current};
+        #t14.{core::Set::add}(#t16);
+      }
+    }
+    #t14.{core::Set::add}(n1);
+  } =>#t14;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  var s3 = {...n2, n1};
+               ^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
+  core::Set<Never> s4 = block {
+    final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t21 = n2;
+    if(!#t21.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t22 = :sync-for-iterator.{core::Iterator::current};
+        #t20.{core::Set::add}(#t22);
+      }
+    }
+    #t20.{core::Set::add}(n1);
+  } =>#t20;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+  var s5 = {...n3, n1};
+               ^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
+  core::Set<Never> s6 = block {
+    final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t27 = n3;
+    if(!#t27.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t28 = :sync-for-iterator.{core::Iterator::current};
+        #t26.{core::Set::add}(#t28);
+      }
+    }
+    #t26.{core::Set::add}(n1);
+  } =>#t26;
+  core::Map<Never, Never> m1 = block {
+    final core::Map<Never, Never> #t29 = <Never, Never>{};
+    {
+      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t30 = :sync-for-iterator.{core::Iterator::current};
+        #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+      }
+    }
+    #t29.{core::Map::[]=}(n1, n1);
+  } =>#t29;
+  core::Map<Never, Never> m2 = block {
+    final core::Map<Never, Never> #t31 = <Never, Never>{};
+    final core::Map<Never, Never>? #t32 = n1;
+    if(!#t32.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t32{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t33 = :sync-for-iterator.{core::Iterator::current};
+        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+      }
+    }
+    #t31.{core::Map::[]=}(n1, n1);
+  } =>#t31;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m4 = block {
+    final core::Map<Never, Never> #t34 = <Never, Never>{};
+    final core::Map<Never, Never>? #t35 = n2;
+    if(!#t35.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t35{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t36 = :sync-for-iterator.{core::Iterator::current};
+        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+      }
+    }
+    #t34.{core::Map::[]=}(n1, n1);
+  } =>#t34;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<Never, Never> m6 = block {
+    final core::Map<Never, Never> #t37 = <Never, Never>{};
+    final core::Map<Never, Never>? #t38 = n3;
+    if(!#t38.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t38{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<Never, Never> #t39 = :sync-for-iterator.{core::Iterator::current};
+        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+      }
+    }
+    #t37.{core::Map::[]=}(n1, n1);
+  } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t40 = <Never>[];
+    for (final Never #t41 in n1)
+      #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t42 = <Never>[];
+    final core::Iterable<Never>? #t43 = n1;
+    if(!#t43.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t43{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t44 = :sync-for-iterator.{core::Iterator::current};
+        #t42.{core::List::add}(#t44);
+      }
+    }
+  } =>#t42;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t45 = <Never>[];
+    final core::Iterable<Never>? #t46 = n2;
+    if(!#t46.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t46{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t47 = :sync-for-iterator.{core::Iterator::current};
+        #t45.{core::List::add}(#t47);
+      }
+    }
+  } =>#t45;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t48 = <Never>[];
+    final core::Iterable<Never>? #t49 = n3;
+    if(!#t49.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t49{core::Iterable<Never>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final Never #t50 = :sync-for-iterator.{core::Iterator::current};
+        #t48.{core::List::add}(#t50);
+      }
+    }
+  } =>#t48;
+  core::Set<self::test2::N1> s1 = block {
+    final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t52 in n1)
+      #t51.{core::Set::add}(#t52);
+    #t51.{core::Set::add}(n1);
+  } =>#t51;
+  core::Set<self::test2::N1> s2 = block {
+    final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t54 = n1;
+    if(!#t54.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t55 = :sync-for-iterator.{core::Iterator::current};
+        #t53.{core::Set::add}(#t55);
+      }
+    }
+    #t53.{core::Set::add}(n1);
+  } =>#t53;
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  var s3 = {...n2, n1};
+               ^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
+  core::Set<self::test2::N1> s4 = block {
+    final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t60 = n2;
+    if(!#t60.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t61 = :sync-for-iterator.{core::Iterator::current};
+        #t59.{core::Set::add}(#t61);
+      }
+    }
+    #t59.{core::Set::add}(n1);
+  } =>#t59;
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  var s5 = {...n3, n1};
+               ^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
+  core::Set<self::test2::N1> s6 = block {
+    final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t66 = n3;
+    if(!#t66.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t67 = :sync-for-iterator.{core::Iterator::current};
+        #t65.{core::Set::add}(#t67);
+      }
+    }
+    #t65.{core::Set::add}(n1);
+  } =>#t65;
+  core::Map<self::test2::N1, self::test2::N1> m1 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+    {
+      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t69 = :sync-for-iterator.{core::Iterator::current};
+        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+      }
+    }
+    #t68.{core::Map::[]=}(n1, n1);
+  } =>#t68;
+  core::Map<self::test2::N1, self::test2::N1> m2 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+    if(!#t71.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t72 = :sync-for-iterator.{core::Iterator::current};
+        #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+      }
+    }
+    #t70.{core::Map::[]=}(n1, n1);
+  } =>#t70;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+  var m3 = {...n2, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m4 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+    if(!#t74.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t75 = :sync-for-iterator.{core::Iterator::current};
+        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+      }
+    }
+    #t73.{core::Map::[]=}(n1, n1);
+  } =>#t73;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+  var m5 = {...n3, n1: n1};
+               ^": null, n1: n1};
+  core::Map<self::test2::N1, self::test2::N1> m6 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+    if(!#t77.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t78 = :sync-for-iterator.{core::Iterator::current};
+        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+      }
+    }
+    #t76.{core::Map::[]=}(n1, n1);
+  } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
index 40260d9..64f137e 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
@@ -22,42 +22,42 @@
 //   x?.[42] = 42; // Warning.
 //   ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'foo'.
 //   y.foo(); // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
 //   y.bar; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
 //   y.baz = 42; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
@@ -87,35 +87,35 @@
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
   let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo(); // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
   y.bar; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y++; // Error.
    ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y += 1; // Error.
     ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
index 1eb7ae3..2a5f9c5 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
@@ -22,42 +22,42 @@
 //   x?.[42] = 42; // Warning.
 //   ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'foo'.
 //   y.foo(); // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
 //   y.bar; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
 //   y.baz = 42; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
@@ -87,35 +87,35 @@
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
   let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo(); // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
   y.bar; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y++; // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y += 1; // Error.
     ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
index 40260d9..64f137e 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
@@ -22,42 +22,42 @@
 //   x?.[42] = 42; // Warning.
 //   ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'foo'.
 //   y.foo(); // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
 //   y.bar; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
 //   y.baz = 42; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
@@ -87,35 +87,35 @@
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
   let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo(); // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
   y.bar; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y++; // Error.
    ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y += 1; // Error.
     ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
index 1eb7ae3..2a5f9c5 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
@@ -22,42 +22,42 @@
 //   x?.[42] = 42; // Warning.
 //   ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'foo'.
 //   y.foo(); // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
 //   y.bar; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
 //   y.baz = 42; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 // Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
@@ -87,35 +87,35 @@
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
   let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo(); // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
   y.bar; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y++; // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '+' operator.
   y += 1; // Error.
     ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
 Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
index 066a5f6..6c5d89f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
@@ -62,10 +62,18 @@
 //   nonNullableClass.nullableField += 2; // error
 //                                  ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nonNullableClass.nullableField += 2; // error
+//                                  ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableClass?.nullableField += 2; // error
 //                                ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nullableClass?.nullableField += 2; // error
+//                                ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
@@ -171,22 +179,26 @@
   let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
   let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
   let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
-  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
   nonNullableClass.nullableField += 2; // error
-                                 ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+                                 ^" in (let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in #t31.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+  let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
   nullableClass?.nullableField += 2; // error
-                               ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
-  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
-  let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+                               ^" in (let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableClass?.nullableField += 2; // error
+                               ^" in #t34.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+  let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 Try calling using ?.call instead.
   nullableClass(); // error
                ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
index 066a5f6..980d82f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
@@ -62,10 +62,18 @@
 //   nonNullableClass.nullableField += 2; // error
 //                                  ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nonNullableClass.nullableField += 2; // error
+//                                  ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableClass?.nullableField += 2; // error
 //                                ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nullableClass?.nullableField += 2; // error
+//                                ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
@@ -171,22 +179,26 @@
   let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
   let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
   let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
-  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   nonNullableClass.nullableField += 2; // error
                                  ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
   nullableClass?.nullableField += 2; // error
-                               ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
-  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
-  let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+                               ^" in let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableClass?.nullableField += 2; // error
+                               ^" in #t34.{self::Class::nullableField}.{core::num::+}(2);
+  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+  let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 Try calling using ?.call instead.
   nullableClass(); // error
                ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
index 066a5f6..6c5d89f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
@@ -62,10 +62,18 @@
 //   nonNullableClass.nullableField += 2; // error
 //                                  ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nonNullableClass.nullableField += 2; // error
+//                                  ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableClass?.nullableField += 2; // error
 //                                ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nullableClass?.nullableField += 2; // error
+//                                ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
@@ -171,22 +179,26 @@
   let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
   let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
   let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
-  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
   nonNullableClass.nullableField += 2; // error
-                                 ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+                                 ^" in (let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in #t31.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+  let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
   nullableClass?.nullableField += 2; // error
-                               ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
-  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
-  let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+                               ^" in (let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableClass?.nullableField += 2; // error
+                               ^" in #t34.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+  let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 Try calling using ?.call instead.
   nullableClass(); // error
                ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
index 066a5f6..980d82f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
@@ -62,10 +62,18 @@
 //   nonNullableClass.nullableField += 2; // error
 //                                  ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nonNullableClass.nullableField += 2; // error
+//                                  ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableClass?.nullableField += 2; // error
 //                                ^
 //
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nullableClass?.nullableField += 2; // error
+//                                ^
+//
 // pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
@@ -171,22 +179,26 @@
   let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
   let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
   let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
-  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   nonNullableClass.nullableField += 2; // error
                                  ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
   nullableClass?.nullableField += 2; // error
-                               ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
-  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
-  let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+                               ^" in let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableClass?.nullableField += 2; // error
+                               ^" in #t34.{self::Class::nullableField}.{core::num::+}(2);
+  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+  let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 Try calling using ?.call instead.
   nullableClass(); // error
                ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart b/pkg/front_end/testcases/nnbd/numbers.dart
new file mode 100644
index 0000000..afd51a4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart
@@ -0,0 +1,485 @@
+// 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.
+
+add<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n = n + n;
+  var n_i = n + i;
+  var n_d = n + d;
+  var n_x = n + x;
+  var n_y = n + y;
+  var n_z = n + z;
+
+  var i_n = i + n;
+  var i_i = i + i;
+  var i_d = i + d;
+  var i_x = i + x;
+  var i_y = i + y;
+  var i_z = i + z;
+
+  var d_n = d + n;
+  var d_i = d + i;
+  var d_d = d + d;
+  var d_x = d + x;
+  var d_y = d + y;
+  var d_z = d + z;
+
+  var x_n = x + n;
+  var x_i = x + i;
+  var x_d = x + d;
+  var x_x = x + x;
+  var x_y = x + y;
+  var x_z = x + z;
+
+  var y_n = y + n;
+  var y_i = y + i;
+  var y_d = y + d;
+  var y_x = y + x;
+  var y_y = y + y;
+  var y_z = y + z;
+
+  var z_n = z + n;
+  var z_i = z + i;
+  var z_d = z + d;
+  var z_x = z + x;
+  var z_y = z + y;
+  var z_z = z + z;
+}
+
+sub<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n = n - n;
+  var n_i = n - i;
+  var n_d = n - d;
+  var n_x = n - x;
+  var n_y = n - y;
+  var n_z = n - z;
+
+  var i_n = i - n;
+  var i_i = i - i;
+  var i_d = i - d;
+  var i_x = i - x;
+  var i_y = i - y;
+  var i_z = i - z;
+
+  var d_n = d - n;
+  var d_i = d - i;
+  var d_d = d - d;
+  var d_x = d - x;
+  var d_y = d - y;
+  var d_z = d - z;
+
+  var x_n = x - n;
+  var x_i = x - i;
+  var x_d = x - d;
+  var x_x = x - x;
+  var x_y = x - y;
+  var x_z = x - z;
+
+  var y_n = y - n;
+  var y_i = y - i;
+  var y_d = y - d;
+  var y_x = y - x;
+  var y_y = y - y;
+  var y_z = y - z;
+
+  var z_n = z - n;
+  var z_i = z - i;
+  var z_d = z - d;
+  var z_x = z - x;
+  var z_y = z - y;
+  var z_z = z - z;
+}
+
+mul<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n = n * n;
+  var n_i = n * i;
+  var n_d = n * d;
+  var n_x = n * x;
+  var n_y = n * y;
+  var n_z = n * z;
+
+  var i_n = i * n;
+  var i_i = i * i;
+  var i_d = i * d;
+  var i_x = i * x;
+  var i_y = i * y;
+  var i_z = i * z;
+
+  var d_n = d * n;
+  var d_i = d * i;
+  var d_d = d * d;
+  var d_x = d * x;
+  var d_y = d * y;
+  var d_z = d * z;
+
+  var x_n = x * n;
+  var x_i = x * i;
+  var x_d = x * d;
+  var x_x = x * x;
+  var x_y = x * y;
+  var x_z = x * z;
+
+  var y_n = y * n;
+  var y_i = y * i;
+  var y_d = y * d;
+  var y_x = y * x;
+  var y_y = y * y;
+  var y_z = y * z;
+
+  var z_n = z * n;
+  var z_i = z * i;
+  var z_d = z * d;
+  var z_x = z * x;
+  var z_y = z * y;
+  var z_z = z * z;
+}
+
+mod<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n = n % n;
+  var n_i = n % i;
+  var n_d = n % d;
+  var n_x = n % x;
+  var n_y = n % y;
+  var n_z = n % z;
+
+  var i_n = i % n;
+  var i_i = i % i;
+  var i_d = i % d;
+  var i_x = i % x;
+  var i_y = i % y;
+  var i_z = i % z;
+
+  var d_n = d % n;
+  var d_i = d % i;
+  var d_d = d % d;
+  var d_x = d % x;
+  var d_y = d % y;
+  var d_z = d % z;
+
+  var x_n = x % n;
+  var x_i = x % i;
+  var x_d = x % d;
+  var x_x = x % x;
+  var x_y = x % y;
+  var x_z = x % z;
+
+  var y_n = y % n;
+  var y_i = y % i;
+  var y_d = y % d;
+  var y_x = y % x;
+  var y_y = y % y;
+  var y_z = y % z;
+
+  var z_n = z % n;
+  var z_i = z % i;
+  var z_d = z % d;
+  var z_x = z % x;
+  var z_y = z % y;
+  var z_z = z % z;
+}
+
+remainder<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n = n.remainder(n);
+  var n_i = n.remainder(i);
+  var n_d = n.remainder(d);
+  var n_x = n.remainder(x);
+  var n_y = n.remainder(y);
+  var n_z = n.remainder(z);
+
+  var i_n = i.remainder(n);
+  var i_i = i.remainder(i);
+  var i_d = i.remainder(d);
+  var i_x = i.remainder(x);
+  var i_y = i.remainder(y);
+  var i_z = i.remainder(z);
+
+  var d_n = d.remainder(n);
+  var d_i = d.remainder(i);
+  var d_d = d.remainder(d);
+  var d_x = d.remainder(x);
+  var d_y = d.remainder(y);
+  var d_z = d.remainder(z);
+
+  var x_n = x.remainder(n);
+  var x_i = x.remainder(i);
+  var x_d = x.remainder(d);
+  var x_x = x.remainder(x);
+  var x_y = x.remainder(y);
+  var x_z = x.remainder(z);
+
+  var y_n = y.remainder(n);
+  var y_i = y.remainder(i);
+  var y_d = y.remainder(d);
+  var y_x = y.remainder(x);
+  var y_y = y.remainder(y);
+  var y_z = y.remainder(z);
+
+  var z_n = z.remainder(n);
+  var z_i = z.remainder(i);
+  var z_d = z.remainder(d);
+  var z_x = z.remainder(x);
+  var z_y = z.remainder(y);
+  var z_z = z.remainder(z);
+}
+
+clamp<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n_n = n.clamp(n, n);
+  var n_i_n = n.clamp(i, n);
+  var n_d_n = n.clamp(d, n);
+  var n_x_n = n.clamp(x, n);
+  var n_y_n = n.clamp(y, n);
+  var n_z_n = n.clamp(z, n);
+
+  var n_n_i = n.clamp(n, i);
+  var n_i_i = n.clamp(i, i);
+  var n_d_i = n.clamp(d, i);
+  var n_x_i = n.clamp(x, i);
+  var n_y_i = n.clamp(y, i);
+  var n_z_i = n.clamp(z, i);
+
+  var n_n_d = n.clamp(n, d);
+  var n_i_d = n.clamp(i, d);
+  var n_d_d = n.clamp(d, d);
+  var n_x_d = n.clamp(x, d);
+  var n_y_d = n.clamp(y, d);
+  var n_z_d = n.clamp(z, d);
+
+  var n_n_x = n.clamp(n, x);
+  var n_i_x = n.clamp(i, x);
+  var n_d_x = n.clamp(d, x);
+  var n_x_x = n.clamp(x, x);
+  var n_y_x = n.clamp(y, x);
+  var n_z_x = n.clamp(z, x);
+
+  var n_n_y = n.clamp(n, y);
+  var n_i_y = n.clamp(i, y);
+  var n_d_y = n.clamp(d, y);
+  var n_x_y = n.clamp(x, y);
+  var n_y_y = n.clamp(y, y);
+  var n_z_y = n.clamp(z, y);
+
+  var n_n_z = n.clamp(n, z);
+  var n_i_z = n.clamp(i, z);
+  var n_d_z = n.clamp(d, z);
+  var n_x_z = n.clamp(x, z);
+  var n_y_z = n.clamp(y, z);
+  var n_z_z = n.clamp(z, z);
+
+  var i_n_n = i.clamp(n, n);
+  var i_i_n = i.clamp(i, n);
+  var i_d_n = i.clamp(d, n);
+  var i_x_n = i.clamp(x, n);
+  var i_y_n = i.clamp(y, n);
+  var i_z_n = i.clamp(z, n);
+
+  var i_n_i = i.clamp(n, i);
+  var i_i_i = i.clamp(i, i);
+  var i_d_i = i.clamp(d, i);
+  var i_x_i = i.clamp(x, i);
+  var i_y_i = i.clamp(y, i);
+  var i_z_i = i.clamp(z, i);
+
+  var i_n_d = i.clamp(n, d);
+  var i_i_d = i.clamp(i, d);
+  var i_d_d = i.clamp(d, d);
+  var i_x_d = i.clamp(x, d);
+  var i_y_d = i.clamp(y, d);
+  var i_z_d = i.clamp(z, d);
+
+  var i_n_x = i.clamp(n, x);
+  var i_i_x = i.clamp(i, x);
+  var i_d_x = i.clamp(d, x);
+  var i_x_x = i.clamp(x, x);
+  var i_y_x = i.clamp(y, x);
+  var i_z_x = i.clamp(z, x);
+
+  var i_n_y = i.clamp(n, y);
+  var i_i_y = i.clamp(i, y);
+  var i_d_y = i.clamp(d, y);
+  var i_x_y = i.clamp(x, y);
+  var i_y_y = i.clamp(y, y);
+  var i_z_y = i.clamp(z, y);
+
+  var i_n_z = i.clamp(n, z);
+  var i_i_z = i.clamp(i, z);
+  var i_d_z = i.clamp(d, z);
+  var i_x_z = i.clamp(x, z);
+  var i_y_z = i.clamp(y, z);
+  var i_z_z = i.clamp(z, z);
+
+  var d_n_n = d.clamp(n, n);
+  var d_i_n = d.clamp(i, n);
+  var d_d_n = d.clamp(d, n);
+  var d_x_n = d.clamp(x, n);
+  var d_y_n = d.clamp(y, n);
+  var d_z_n = d.clamp(z, n);
+
+  var d_n_i = d.clamp(n, i);
+  var d_i_i = d.clamp(i, i);
+  var d_d_i = d.clamp(d, i);
+  var d_x_i = d.clamp(x, i);
+  var d_y_i = d.clamp(y, i);
+  var d_z_i = d.clamp(z, i);
+
+  var d_n_d = d.clamp(n, d);
+  var d_i_d = d.clamp(i, d);
+  var d_d_d = d.clamp(d, d);
+  var d_x_d = d.clamp(x, d);
+  var d_y_d = d.clamp(y, d);
+  var d_z_d = d.clamp(z, d);
+
+  var d_n_x = d.clamp(n, x);
+  var d_i_x = d.clamp(i, x);
+  var d_d_x = d.clamp(d, x);
+  var d_x_x = d.clamp(x, x);
+  var d_y_x = d.clamp(y, x);
+  var d_z_x = d.clamp(z, x);
+
+  var d_n_y = d.clamp(n, y);
+  var d_i_y = d.clamp(i, y);
+  var d_d_y = d.clamp(d, y);
+  var d_x_y = d.clamp(x, y);
+  var d_y_y = d.clamp(y, y);
+  var d_z_y = d.clamp(z, y);
+
+  var d_n_z = d.clamp(n, z);
+  var d_i_z = d.clamp(i, z);
+  var d_d_z = d.clamp(d, z);
+  var d_x_z = d.clamp(x, z);
+  var d_y_z = d.clamp(y, z);
+  var d_z_z = d.clamp(z, z);
+
+  var x_n_n = x.clamp(n, n);
+  var x_i_n = x.clamp(i, n);
+  var x_d_n = x.clamp(d, n);
+  var x_x_n = x.clamp(x, n);
+  var x_y_n = x.clamp(y, n);
+  var x_z_n = x.clamp(z, n);
+
+  var x_n_i = x.clamp(n, i);
+  var x_i_i = x.clamp(i, i);
+  var x_d_i = x.clamp(d, i);
+  var x_x_i = x.clamp(x, i);
+  var x_y_i = x.clamp(y, i);
+  var x_z_i = x.clamp(z, i);
+
+  var x_n_d = x.clamp(n, d);
+  var x_i_d = x.clamp(i, d);
+  var x_d_d = x.clamp(d, d);
+  var x_x_d = x.clamp(x, d);
+  var x_y_d = x.clamp(y, d);
+  var x_z_d = x.clamp(z, d);
+
+  var x_n_x = x.clamp(n, x);
+  var x_i_x = x.clamp(i, x);
+  var x_d_x = x.clamp(d, x);
+  var x_x_x = x.clamp(x, x);
+  var x_y_x = x.clamp(y, x);
+  var x_z_x = x.clamp(z, x);
+
+  var x_n_y = x.clamp(n, y);
+  var x_i_y = x.clamp(i, y);
+  var x_d_y = x.clamp(d, y);
+  var x_x_y = x.clamp(x, y);
+  var x_y_y = x.clamp(y, y);
+  var x_z_y = x.clamp(z, y);
+
+  var x_n_z = x.clamp(n, z);
+  var x_i_z = x.clamp(i, z);
+  var x_d_z = x.clamp(d, z);
+  var x_x_z = x.clamp(x, z);
+  var x_y_z = x.clamp(y, z);
+  var x_z_z = x.clamp(z, z);
+
+  var y_n_n = y.clamp(n, n);
+  var y_i_n = y.clamp(i, n);
+  var y_d_n = y.clamp(d, n);
+  var y_x_n = y.clamp(x, n);
+  var y_y_n = y.clamp(y, n);
+  var y_z_n = y.clamp(z, n);
+
+  var y_n_i = y.clamp(n, i);
+  var y_i_i = y.clamp(i, i);
+  var y_d_i = y.clamp(d, i);
+  var y_x_i = y.clamp(x, i);
+  var y_y_i = y.clamp(y, i);
+  var y_z_i = y.clamp(z, i);
+
+  var y_n_d = y.clamp(n, d);
+  var y_i_d = y.clamp(i, d);
+  var y_d_d = y.clamp(d, d);
+  var y_x_d = y.clamp(x, d);
+  var y_y_d = y.clamp(y, d);
+  var y_z_d = y.clamp(z, d);
+
+  var y_n_x = y.clamp(n, x);
+  var y_i_x = y.clamp(i, x);
+  var y_d_x = y.clamp(d, x);
+  var y_x_x = y.clamp(x, x);
+  var y_y_x = y.clamp(y, x);
+  var y_z_x = y.clamp(z, x);
+
+  var y_n_y = y.clamp(n, y);
+  var y_i_y = y.clamp(i, y);
+  var y_d_y = y.clamp(d, y);
+  var y_x_y = y.clamp(x, y);
+  var y_y_y = y.clamp(y, y);
+  var y_z_y = y.clamp(z, y);
+
+  var y_n_z = y.clamp(n, z);
+  var y_i_z = y.clamp(i, z);
+  var y_d_z = y.clamp(d, z);
+  var y_x_z = y.clamp(x, z);
+  var y_y_z = y.clamp(y, z);
+  var y_z_z = y.clamp(z, z);
+
+  var z_n_n = z.clamp(n, n);
+  var z_i_n = z.clamp(i, n);
+  var z_d_n = z.clamp(d, n);
+  var z_x_n = z.clamp(x, n);
+  var z_y_n = z.clamp(y, n);
+  var z_z_n = z.clamp(z, n);
+
+  var z_n_i = z.clamp(n, i);
+  var z_i_i = z.clamp(i, i);
+  var z_d_i = z.clamp(d, i);
+  var z_x_i = z.clamp(x, i);
+  var z_y_i = z.clamp(y, i);
+  var z_z_i = z.clamp(z, i);
+
+  var z_n_d = z.clamp(n, d);
+  var z_i_d = z.clamp(i, d);
+  var z_d_d = z.clamp(d, d);
+  var z_x_d = z.clamp(x, d);
+  var z_y_d = z.clamp(y, d);
+  var z_z_d = z.clamp(z, d);
+
+  var z_n_x = z.clamp(n, x);
+  var z_i_x = z.clamp(i, x);
+  var z_d_x = z.clamp(d, x);
+  var z_x_x = z.clamp(x, x);
+  var z_y_x = z.clamp(y, x);
+  var z_z_x = z.clamp(z, x);
+
+  var z_n_y = z.clamp(n, y);
+  var z_i_y = z.clamp(i, y);
+  var z_d_y = z.clamp(d, y);
+  var z_x_y = z.clamp(x, y);
+  var z_y_y = z.clamp(y, y);
+  var z_z_y = z.clamp(z, y);
+
+  var z_n_z = z.clamp(n, z);
+  var z_i_z = z.clamp(i, z);
+  var z_d_z = z.clamp(d, z);
+  var z_x_z = z.clamp(x, z);
+  var z_y_z = z.clamp(y, z);
+  var z_z_z = z.clamp(z, z);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.outline.expect b/pkg/front_end/testcases/nnbd/numbers.dart.outline.expect
new file mode 100644
index 0000000..e9834e0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
+  ;
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
+  ;
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
+  ;
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
+  ;
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
+  ;
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect b/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(n);
+  core::num n_i = n.{core::num::+}(i);
+  core::double n_d = n.{core::num::+}(d);
+  core::num n_x = n.{core::num::+}(x);
+  core::num n_y = n.{core::num::+}(y);
+  core::double n_z = n.{core::num::+}(z);
+  core::num i_n = i.{core::num::+}(n);
+  core::int i_i = i.{core::num::+}(i);
+  core::double i_d = i.{core::num::+}(d);
+  core::num i_x = i.{core::num::+}(x);
+  core::int i_y = i.{core::num::+}(y);
+  core::double i_z = i.{core::num::+}(z);
+  core::double d_n = d.{core::double::+}(n);
+  core::double d_i = d.{core::double::+}(i);
+  core::double d_d = d.{core::double::+}(d);
+  core::double d_x = d.{core::double::+}(x);
+  core::double d_y = d.{core::double::+}(y);
+  core::double d_z = d.{core::double::+}(z);
+  core::num x_n = x.{core::num::+}(n);
+  core::num x_i = x.{core::num::+}(i);
+  core::double x_d = x.{core::num::+}(d);
+  core::num x_x = x.{core::num::+}(x);
+  core::num x_y = x.{core::num::+}(y);
+  core::double x_z = x.{core::num::+}(z);
+  core::num y_n = y.{core::num::+}(n);
+  core::int y_i = y.{core::num::+}(i);
+  core::double y_d = y.{core::num::+}(d);
+  core::num y_x = y.{core::num::+}(x);
+  core::int y_y = y.{core::num::+}(y);
+  core::double y_z = y.{core::num::+}(z);
+  core::double z_n = z.{core::double::+}(n);
+  core::double z_i = z.{core::double::+}(i);
+  core::double z_d = z.{core::double::+}(d);
+  core::double z_x = z.{core::double::+}(x);
+  core::double z_y = z.{core::double::+}(y);
+  core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(n);
+  core::num n_i = n.{core::num::-}(i);
+  core::double n_d = n.{core::num::-}(d);
+  core::num n_x = n.{core::num::-}(x);
+  core::num n_y = n.{core::num::-}(y);
+  core::double n_z = n.{core::num::-}(z);
+  core::num i_n = i.{core::num::-}(n);
+  core::int i_i = i.{core::num::-}(i);
+  core::double i_d = i.{core::num::-}(d);
+  core::num i_x = i.{core::num::-}(x);
+  core::int i_y = i.{core::num::-}(y);
+  core::double i_z = i.{core::num::-}(z);
+  core::double d_n = d.{core::double::-}(n);
+  core::double d_i = d.{core::double::-}(i);
+  core::double d_d = d.{core::double::-}(d);
+  core::double d_x = d.{core::double::-}(x);
+  core::double d_y = d.{core::double::-}(y);
+  core::double d_z = d.{core::double::-}(z);
+  core::num x_n = x.{core::num::-}(n);
+  core::num x_i = x.{core::num::-}(i);
+  core::double x_d = x.{core::num::-}(d);
+  core::num x_x = x.{core::num::-}(x);
+  core::num x_y = x.{core::num::-}(y);
+  core::double x_z = x.{core::num::-}(z);
+  core::num y_n = y.{core::num::-}(n);
+  core::int y_i = y.{core::num::-}(i);
+  core::double y_d = y.{core::num::-}(d);
+  core::num y_x = y.{core::num::-}(x);
+  core::int y_y = y.{core::num::-}(y);
+  core::double y_z = y.{core::num::-}(z);
+  core::double z_n = z.{core::double::-}(n);
+  core::double z_i = z.{core::double::-}(i);
+  core::double z_d = z.{core::double::-}(d);
+  core::double z_x = z.{core::double::-}(x);
+  core::double z_y = z.{core::double::-}(y);
+  core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(n);
+  core::num n_i = n.{core::num::*}(i);
+  core::double n_d = n.{core::num::*}(d);
+  core::num n_x = n.{core::num::*}(x);
+  core::num n_y = n.{core::num::*}(y);
+  core::double n_z = n.{core::num::*}(z);
+  core::num i_n = i.{core::num::*}(n);
+  core::int i_i = i.{core::num::*}(i);
+  core::double i_d = i.{core::num::*}(d);
+  core::num i_x = i.{core::num::*}(x);
+  core::int i_y = i.{core::num::*}(y);
+  core::double i_z = i.{core::num::*}(z);
+  core::double d_n = d.{core::double::*}(n);
+  core::double d_i = d.{core::double::*}(i);
+  core::double d_d = d.{core::double::*}(d);
+  core::double d_x = d.{core::double::*}(x);
+  core::double d_y = d.{core::double::*}(y);
+  core::double d_z = d.{core::double::*}(z);
+  core::num x_n = x.{core::num::*}(n);
+  core::num x_i = x.{core::num::*}(i);
+  core::double x_d = x.{core::num::*}(d);
+  core::num x_x = x.{core::num::*}(x);
+  core::num x_y = x.{core::num::*}(y);
+  core::double x_z = x.{core::num::*}(z);
+  core::num y_n = y.{core::num::*}(n);
+  core::int y_i = y.{core::num::*}(i);
+  core::double y_d = y.{core::num::*}(d);
+  core::num y_x = y.{core::num::*}(x);
+  core::int y_y = y.{core::num::*}(y);
+  core::double y_z = y.{core::num::*}(z);
+  core::double z_n = z.{core::double::*}(n);
+  core::double z_i = z.{core::double::*}(i);
+  core::double z_d = z.{core::double::*}(d);
+  core::double z_x = z.{core::double::*}(x);
+  core::double z_y = z.{core::double::*}(y);
+  core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(n);
+  core::num n_i = n.{core::num::%}(i);
+  core::double n_d = n.{core::num::%}(d);
+  core::num n_x = n.{core::num::%}(x);
+  core::num n_y = n.{core::num::%}(y);
+  core::double n_z = n.{core::num::%}(z);
+  core::num i_n = i.{core::num::%}(n);
+  core::int i_i = i.{core::num::%}(i);
+  core::double i_d = i.{core::num::%}(d);
+  core::num i_x = i.{core::num::%}(x);
+  core::int i_y = i.{core::num::%}(y);
+  core::double i_z = i.{core::num::%}(z);
+  core::double d_n = d.{core::double::%}(n);
+  core::double d_i = d.{core::double::%}(i);
+  core::double d_d = d.{core::double::%}(d);
+  core::double d_x = d.{core::double::%}(x);
+  core::double d_y = d.{core::double::%}(y);
+  core::double d_z = d.{core::double::%}(z);
+  core::num x_n = x.{core::num::%}(n);
+  core::num x_i = x.{core::num::%}(i);
+  core::double x_d = x.{core::num::%}(d);
+  core::num x_x = x.{core::num::%}(x);
+  core::num x_y = x.{core::num::%}(y);
+  core::double x_z = x.{core::num::%}(z);
+  core::num y_n = y.{core::num::%}(n);
+  core::int y_i = y.{core::num::%}(i);
+  core::double y_d = y.{core::num::%}(d);
+  core::num y_x = y.{core::num::%}(x);
+  core::int y_y = y.{core::num::%}(y);
+  core::double y_z = y.{core::num::%}(z);
+  core::double z_n = z.{core::double::%}(n);
+  core::double z_i = z.{core::double::%}(i);
+  core::double z_d = z.{core::double::%}(d);
+  core::double z_x = z.{core::double::%}(x);
+  core::double z_y = z.{core::double::%}(y);
+  core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(n);
+  core::num n_i = n.{core::num::remainder}(i);
+  core::double n_d = n.{core::num::remainder}(d);
+  core::num n_x = n.{core::num::remainder}(x);
+  core::num n_y = n.{core::num::remainder}(y);
+  core::double n_z = n.{core::num::remainder}(z);
+  core::num i_n = i.{core::num::remainder}(n);
+  core::int i_i = i.{core::num::remainder}(i);
+  core::double i_d = i.{core::num::remainder}(d);
+  core::num i_x = i.{core::num::remainder}(x);
+  core::int i_y = i.{core::num::remainder}(y);
+  core::double i_z = i.{core::num::remainder}(z);
+  core::double d_n = d.{core::double::remainder}(n);
+  core::double d_i = d.{core::double::remainder}(i);
+  core::double d_d = d.{core::double::remainder}(d);
+  core::double d_x = d.{core::double::remainder}(x);
+  core::double d_y = d.{core::double::remainder}(y);
+  core::double d_z = d.{core::double::remainder}(z);
+  core::num x_n = x.{core::num::remainder}(n);
+  core::num x_i = x.{core::num::remainder}(i);
+  core::double x_d = x.{core::num::remainder}(d);
+  core::num x_x = x.{core::num::remainder}(x);
+  core::num x_y = x.{core::num::remainder}(y);
+  core::double x_z = x.{core::num::remainder}(z);
+  core::num y_n = y.{core::num::remainder}(n);
+  core::int y_i = y.{core::num::remainder}(i);
+  core::double y_d = y.{core::num::remainder}(d);
+  core::num y_x = y.{core::num::remainder}(x);
+  core::int y_y = y.{core::num::remainder}(y);
+  core::double y_z = y.{core::num::remainder}(z);
+  core::double z_n = z.{core::double::remainder}(n);
+  core::double z_i = z.{core::double::remainder}(i);
+  core::double z_d = z.{core::double::remainder}(d);
+  core::double z_x = z.{core::double::remainder}(x);
+  core::double z_y = z.{core::double::remainder}(y);
+  core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n_n = n.{core::num::clamp}(n, n);
+  core::num n_i_n = n.{core::num::clamp}(i, n);
+  core::num n_d_n = n.{core::num::clamp}(d, n);
+  core::num n_x_n = n.{core::num::clamp}(x, n);
+  core::num n_y_n = n.{core::num::clamp}(y, n);
+  core::num n_z_n = n.{core::num::clamp}(z, n);
+  core::num n_n_i = n.{core::num::clamp}(n, i);
+  core::num n_i_i = n.{core::num::clamp}(i, i);
+  core::num n_d_i = n.{core::num::clamp}(d, i);
+  core::num n_x_i = n.{core::num::clamp}(x, i);
+  core::num n_y_i = n.{core::num::clamp}(y, i);
+  core::num n_z_i = n.{core::num::clamp}(z, i);
+  core::num n_n_d = n.{core::num::clamp}(n, d);
+  core::num n_i_d = n.{core::num::clamp}(i, d);
+  core::num n_d_d = n.{core::num::clamp}(d, d);
+  core::num n_x_d = n.{core::num::clamp}(x, d);
+  core::num n_y_d = n.{core::num::clamp}(y, d);
+  core::num n_z_d = n.{core::num::clamp}(z, d);
+  core::num n_n_x = n.{core::num::clamp}(n, x);
+  core::num n_i_x = n.{core::num::clamp}(i, x);
+  core::num n_d_x = n.{core::num::clamp}(d, x);
+  core::num n_x_x = n.{core::num::clamp}(x, x);
+  core::num n_y_x = n.{core::num::clamp}(y, x);
+  core::num n_z_x = n.{core::num::clamp}(z, x);
+  core::num n_n_y = n.{core::num::clamp}(n, y);
+  core::num n_i_y = n.{core::num::clamp}(i, y);
+  core::num n_d_y = n.{core::num::clamp}(d, y);
+  core::num n_x_y = n.{core::num::clamp}(x, y);
+  core::num n_y_y = n.{core::num::clamp}(y, y);
+  core::num n_z_y = n.{core::num::clamp}(z, y);
+  core::num n_n_z = n.{core::num::clamp}(n, z);
+  core::num n_i_z = n.{core::num::clamp}(i, z);
+  core::num n_d_z = n.{core::num::clamp}(d, z);
+  core::num n_x_z = n.{core::num::clamp}(x, z);
+  core::num n_y_z = n.{core::num::clamp}(y, z);
+  core::num n_z_z = n.{core::num::clamp}(z, z);
+  core::num i_n_n = i.{core::num::clamp}(n, n);
+  core::num i_i_n = i.{core::num::clamp}(i, n);
+  core::num i_d_n = i.{core::num::clamp}(d, n);
+  core::num i_x_n = i.{core::num::clamp}(x, n);
+  core::num i_y_n = i.{core::num::clamp}(y, n);
+  core::num i_z_n = i.{core::num::clamp}(z, n);
+  core::num i_n_i = i.{core::num::clamp}(n, i);
+  core::int i_i_i = i.{core::num::clamp}(i, i);
+  core::num i_d_i = i.{core::num::clamp}(d, i);
+  core::num i_x_i = i.{core::num::clamp}(x, i);
+  core::int i_y_i = i.{core::num::clamp}(y, i);
+  core::num i_z_i = i.{core::num::clamp}(z, i);
+  core::num i_n_d = i.{core::num::clamp}(n, d);
+  core::num i_i_d = i.{core::num::clamp}(i, d);
+  core::num i_d_d = i.{core::num::clamp}(d, d);
+  core::num i_x_d = i.{core::num::clamp}(x, d);
+  core::num i_y_d = i.{core::num::clamp}(y, d);
+  core::num i_z_d = i.{core::num::clamp}(z, d);
+  core::num i_n_x = i.{core::num::clamp}(n, x);
+  core::num i_i_x = i.{core::num::clamp}(i, x);
+  core::num i_d_x = i.{core::num::clamp}(d, x);
+  core::num i_x_x = i.{core::num::clamp}(x, x);
+  core::num i_y_x = i.{core::num::clamp}(y, x);
+  core::num i_z_x = i.{core::num::clamp}(z, x);
+  core::num i_n_y = i.{core::num::clamp}(n, y);
+  core::int i_i_y = i.{core::num::clamp}(i, y);
+  core::num i_d_y = i.{core::num::clamp}(d, y);
+  core::num i_x_y = i.{core::num::clamp}(x, y);
+  core::int i_y_y = i.{core::num::clamp}(y, y);
+  core::num i_z_y = i.{core::num::clamp}(z, y);
+  core::num i_n_z = i.{core::num::clamp}(n, z);
+  core::num i_i_z = i.{core::num::clamp}(i, z);
+  core::num i_d_z = i.{core::num::clamp}(d, z);
+  core::num i_x_z = i.{core::num::clamp}(x, z);
+  core::num i_y_z = i.{core::num::clamp}(y, z);
+  core::num i_z_z = i.{core::num::clamp}(z, z);
+  core::num d_n_n = d.{core::num::clamp}(n, n);
+  core::num d_i_n = d.{core::num::clamp}(i, n);
+  core::num d_d_n = d.{core::num::clamp}(d, n);
+  core::num d_x_n = d.{core::num::clamp}(x, n);
+  core::num d_y_n = d.{core::num::clamp}(y, n);
+  core::num d_z_n = d.{core::num::clamp}(z, n);
+  core::num d_n_i = d.{core::num::clamp}(n, i);
+  core::num d_i_i = d.{core::num::clamp}(i, i);
+  core::num d_d_i = d.{core::num::clamp}(d, i);
+  core::num d_x_i = d.{core::num::clamp}(x, i);
+  core::num d_y_i = d.{core::num::clamp}(y, i);
+  core::num d_z_i = d.{core::num::clamp}(z, i);
+  core::num d_n_d = d.{core::num::clamp}(n, d);
+  core::num d_i_d = d.{core::num::clamp}(i, d);
+  core::double d_d_d = d.{core::num::clamp}(d, d);
+  core::num d_x_d = d.{core::num::clamp}(x, d);
+  core::num d_y_d = d.{core::num::clamp}(y, d);
+  core::double d_z_d = d.{core::num::clamp}(z, d);
+  core::num d_n_x = d.{core::num::clamp}(n, x);
+  core::num d_i_x = d.{core::num::clamp}(i, x);
+  core::num d_d_x = d.{core::num::clamp}(d, x);
+  core::num d_x_x = d.{core::num::clamp}(x, x);
+  core::num d_y_x = d.{core::num::clamp}(y, x);
+  core::num d_z_x = d.{core::num::clamp}(z, x);
+  core::num d_n_y = d.{core::num::clamp}(n, y);
+  core::num d_i_y = d.{core::num::clamp}(i, y);
+  core::num d_d_y = d.{core::num::clamp}(d, y);
+  core::num d_x_y = d.{core::num::clamp}(x, y);
+  core::num d_y_y = d.{core::num::clamp}(y, y);
+  core::num d_z_y = d.{core::num::clamp}(z, y);
+  core::num d_n_z = d.{core::num::clamp}(n, z);
+  core::num d_i_z = d.{core::num::clamp}(i, z);
+  core::double d_d_z = d.{core::num::clamp}(d, z);
+  core::num d_x_z = d.{core::num::clamp}(x, z);
+  core::num d_y_z = d.{core::num::clamp}(y, z);
+  core::double d_z_z = d.{core::num::clamp}(z, z);
+  core::num x_n_n = x.{core::num::clamp}(n, n);
+  core::num x_i_n = x.{core::num::clamp}(i, n);
+  core::num x_d_n = x.{core::num::clamp}(d, n);
+  core::num x_x_n = x.{core::num::clamp}(x, n);
+  core::num x_y_n = x.{core::num::clamp}(y, n);
+  core::num x_z_n = x.{core::num::clamp}(z, n);
+  core::num x_n_i = x.{core::num::clamp}(n, i);
+  core::num x_i_i = x.{core::num::clamp}(i, i);
+  core::num x_d_i = x.{core::num::clamp}(d, i);
+  core::num x_x_i = x.{core::num::clamp}(x, i);
+  core::num x_y_i = x.{core::num::clamp}(y, i);
+  core::num x_z_i = x.{core::num::clamp}(z, i);
+  core::num x_n_d = x.{core::num::clamp}(n, d);
+  core::num x_i_d = x.{core::num::clamp}(i, d);
+  core::num x_d_d = x.{core::num::clamp}(d, d);
+  core::num x_x_d = x.{core::num::clamp}(x, d);
+  core::num x_y_d = x.{core::num::clamp}(y, d);
+  core::num x_z_d = x.{core::num::clamp}(z, d);
+  core::num x_n_x = x.{core::num::clamp}(n, x);
+  core::num x_i_x = x.{core::num::clamp}(i, x);
+  core::num x_d_x = x.{core::num::clamp}(d, x);
+  core::num x_x_x = x.{core::num::clamp}(x, x);
+  core::num x_y_x = x.{core::num::clamp}(y, x);
+  core::num x_z_x = x.{core::num::clamp}(z, x);
+  core::num x_n_y = x.{core::num::clamp}(n, y);
+  core::num x_i_y = x.{core::num::clamp}(i, y);
+  core::num x_d_y = x.{core::num::clamp}(d, y);
+  core::num x_x_y = x.{core::num::clamp}(x, y);
+  core::num x_y_y = x.{core::num::clamp}(y, y);
+  core::num x_z_y = x.{core::num::clamp}(z, y);
+  core::num x_n_z = x.{core::num::clamp}(n, z);
+  core::num x_i_z = x.{core::num::clamp}(i, z);
+  core::num x_d_z = x.{core::num::clamp}(d, z);
+  core::num x_x_z = x.{core::num::clamp}(x, z);
+  core::num x_y_z = x.{core::num::clamp}(y, z);
+  core::num x_z_z = x.{core::num::clamp}(z, z);
+  core::num y_n_n = y.{core::num::clamp}(n, n);
+  core::num y_i_n = y.{core::num::clamp}(i, n);
+  core::num y_d_n = y.{core::num::clamp}(d, n);
+  core::num y_x_n = y.{core::num::clamp}(x, n);
+  core::num y_y_n = y.{core::num::clamp}(y, n);
+  core::num y_z_n = y.{core::num::clamp}(z, n);
+  core::num y_n_i = y.{core::num::clamp}(n, i);
+  core::int y_i_i = y.{core::num::clamp}(i, i);
+  core::num y_d_i = y.{core::num::clamp}(d, i);
+  core::num y_x_i = y.{core::num::clamp}(x, i);
+  core::int y_y_i = y.{core::num::clamp}(y, i);
+  core::num y_z_i = y.{core::num::clamp}(z, i);
+  core::num y_n_d = y.{core::num::clamp}(n, d);
+  core::num y_i_d = y.{core::num::clamp}(i, d);
+  core::num y_d_d = y.{core::num::clamp}(d, d);
+  core::num y_x_d = y.{core::num::clamp}(x, d);
+  core::num y_y_d = y.{core::num::clamp}(y, d);
+  core::num y_z_d = y.{core::num::clamp}(z, d);
+  core::num y_n_x = y.{core::num::clamp}(n, x);
+  core::num y_i_x = y.{core::num::clamp}(i, x);
+  core::num y_d_x = y.{core::num::clamp}(d, x);
+  core::num y_x_x = y.{core::num::clamp}(x, x);
+  core::num y_y_x = y.{core::num::clamp}(y, x);
+  core::num y_z_x = y.{core::num::clamp}(z, x);
+  core::num y_n_y = y.{core::num::clamp}(n, y);
+  core::int y_i_y = y.{core::num::clamp}(i, y);
+  core::num y_d_y = y.{core::num::clamp}(d, y);
+  core::num y_x_y = y.{core::num::clamp}(x, y);
+  core::int y_y_y = y.{core::num::clamp}(y, y);
+  core::num y_z_y = y.{core::num::clamp}(z, y);
+  core::num y_n_z = y.{core::num::clamp}(n, z);
+  core::num y_i_z = y.{core::num::clamp}(i, z);
+  core::num y_d_z = y.{core::num::clamp}(d, z);
+  core::num y_x_z = y.{core::num::clamp}(x, z);
+  core::num y_y_z = y.{core::num::clamp}(y, z);
+  core::num y_z_z = y.{core::num::clamp}(z, z);
+  core::num z_n_n = z.{core::num::clamp}(n, n);
+  core::num z_i_n = z.{core::num::clamp}(i, n);
+  core::num z_d_n = z.{core::num::clamp}(d, n);
+  core::num z_x_n = z.{core::num::clamp}(x, n);
+  core::num z_y_n = z.{core::num::clamp}(y, n);
+  core::num z_z_n = z.{core::num::clamp}(z, n);
+  core::num z_n_i = z.{core::num::clamp}(n, i);
+  core::num z_i_i = z.{core::num::clamp}(i, i);
+  core::num z_d_i = z.{core::num::clamp}(d, i);
+  core::num z_x_i = z.{core::num::clamp}(x, i);
+  core::num z_y_i = z.{core::num::clamp}(y, i);
+  core::num z_z_i = z.{core::num::clamp}(z, i);
+  core::num z_n_d = z.{core::num::clamp}(n, d);
+  core::num z_i_d = z.{core::num::clamp}(i, d);
+  core::double z_d_d = z.{core::num::clamp}(d, d);
+  core::num z_x_d = z.{core::num::clamp}(x, d);
+  core::num z_y_d = z.{core::num::clamp}(y, d);
+  core::double z_z_d = z.{core::num::clamp}(z, d);
+  core::num z_n_x = z.{core::num::clamp}(n, x);
+  core::num z_i_x = z.{core::num::clamp}(i, x);
+  core::num z_d_x = z.{core::num::clamp}(d, x);
+  core::num z_x_x = z.{core::num::clamp}(x, x);
+  core::num z_y_x = z.{core::num::clamp}(y, x);
+  core::num z_z_x = z.{core::num::clamp}(z, x);
+  core::num z_n_y = z.{core::num::clamp}(n, y);
+  core::num z_i_y = z.{core::num::clamp}(i, y);
+  core::num z_d_y = z.{core::num::clamp}(d, y);
+  core::num z_x_y = z.{core::num::clamp}(x, y);
+  core::num z_y_y = z.{core::num::clamp}(y, y);
+  core::num z_z_y = z.{core::num::clamp}(z, y);
+  core::num z_n_z = z.{core::num::clamp}(n, z);
+  core::num z_i_z = z.{core::num::clamp}(i, z);
+  core::double z_d_z = z.{core::num::clamp}(d, z);
+  core::num z_x_z = z.{core::num::clamp}(x, z);
+  core::num z_y_z = z.{core::num::clamp}(y, z);
+  core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(n);
+  core::num n_i = n.{core::num::+}(i);
+  core::double n_d = n.{core::num::+}(d);
+  core::num n_x = n.{core::num::+}(x);
+  core::num n_y = n.{core::num::+}(y);
+  core::double n_z = n.{core::num::+}(z);
+  core::num i_n = i.{core::num::+}(n);
+  core::int i_i = i.{core::num::+}(i);
+  core::double i_d = i.{core::num::+}(d);
+  core::num i_x = i.{core::num::+}(x);
+  core::int i_y = i.{core::num::+}(y);
+  core::double i_z = i.{core::num::+}(z);
+  core::double d_n = d.{core::double::+}(n);
+  core::double d_i = d.{core::double::+}(i);
+  core::double d_d = d.{core::double::+}(d);
+  core::double d_x = d.{core::double::+}(x);
+  core::double d_y = d.{core::double::+}(y);
+  core::double d_z = d.{core::double::+}(z);
+  core::num x_n = x.{core::num::+}(n);
+  core::num x_i = x.{core::num::+}(i);
+  core::double x_d = x.{core::num::+}(d);
+  core::num x_x = x.{core::num::+}(x);
+  core::num x_y = x.{core::num::+}(y);
+  core::double x_z = x.{core::num::+}(z);
+  core::num y_n = y.{core::num::+}(n);
+  core::int y_i = y.{core::num::+}(i);
+  core::double y_d = y.{core::num::+}(d);
+  core::num y_x = y.{core::num::+}(x);
+  core::int y_y = y.{core::num::+}(y);
+  core::double y_z = y.{core::num::+}(z);
+  core::double z_n = z.{core::double::+}(n);
+  core::double z_i = z.{core::double::+}(i);
+  core::double z_d = z.{core::double::+}(d);
+  core::double z_x = z.{core::double::+}(x);
+  core::double z_y = z.{core::double::+}(y);
+  core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(n);
+  core::num n_i = n.{core::num::-}(i);
+  core::double n_d = n.{core::num::-}(d);
+  core::num n_x = n.{core::num::-}(x);
+  core::num n_y = n.{core::num::-}(y);
+  core::double n_z = n.{core::num::-}(z);
+  core::num i_n = i.{core::num::-}(n);
+  core::int i_i = i.{core::num::-}(i);
+  core::double i_d = i.{core::num::-}(d);
+  core::num i_x = i.{core::num::-}(x);
+  core::int i_y = i.{core::num::-}(y);
+  core::double i_z = i.{core::num::-}(z);
+  core::double d_n = d.{core::double::-}(n);
+  core::double d_i = d.{core::double::-}(i);
+  core::double d_d = d.{core::double::-}(d);
+  core::double d_x = d.{core::double::-}(x);
+  core::double d_y = d.{core::double::-}(y);
+  core::double d_z = d.{core::double::-}(z);
+  core::num x_n = x.{core::num::-}(n);
+  core::num x_i = x.{core::num::-}(i);
+  core::double x_d = x.{core::num::-}(d);
+  core::num x_x = x.{core::num::-}(x);
+  core::num x_y = x.{core::num::-}(y);
+  core::double x_z = x.{core::num::-}(z);
+  core::num y_n = y.{core::num::-}(n);
+  core::int y_i = y.{core::num::-}(i);
+  core::double y_d = y.{core::num::-}(d);
+  core::num y_x = y.{core::num::-}(x);
+  core::int y_y = y.{core::num::-}(y);
+  core::double y_z = y.{core::num::-}(z);
+  core::double z_n = z.{core::double::-}(n);
+  core::double z_i = z.{core::double::-}(i);
+  core::double z_d = z.{core::double::-}(d);
+  core::double z_x = z.{core::double::-}(x);
+  core::double z_y = z.{core::double::-}(y);
+  core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(n);
+  core::num n_i = n.{core::num::*}(i);
+  core::double n_d = n.{core::num::*}(d);
+  core::num n_x = n.{core::num::*}(x);
+  core::num n_y = n.{core::num::*}(y);
+  core::double n_z = n.{core::num::*}(z);
+  core::num i_n = i.{core::num::*}(n);
+  core::int i_i = i.{core::num::*}(i);
+  core::double i_d = i.{core::num::*}(d);
+  core::num i_x = i.{core::num::*}(x);
+  core::int i_y = i.{core::num::*}(y);
+  core::double i_z = i.{core::num::*}(z);
+  core::double d_n = d.{core::double::*}(n);
+  core::double d_i = d.{core::double::*}(i);
+  core::double d_d = d.{core::double::*}(d);
+  core::double d_x = d.{core::double::*}(x);
+  core::double d_y = d.{core::double::*}(y);
+  core::double d_z = d.{core::double::*}(z);
+  core::num x_n = x.{core::num::*}(n);
+  core::num x_i = x.{core::num::*}(i);
+  core::double x_d = x.{core::num::*}(d);
+  core::num x_x = x.{core::num::*}(x);
+  core::num x_y = x.{core::num::*}(y);
+  core::double x_z = x.{core::num::*}(z);
+  core::num y_n = y.{core::num::*}(n);
+  core::int y_i = y.{core::num::*}(i);
+  core::double y_d = y.{core::num::*}(d);
+  core::num y_x = y.{core::num::*}(x);
+  core::int y_y = y.{core::num::*}(y);
+  core::double y_z = y.{core::num::*}(z);
+  core::double z_n = z.{core::double::*}(n);
+  core::double z_i = z.{core::double::*}(i);
+  core::double z_d = z.{core::double::*}(d);
+  core::double z_x = z.{core::double::*}(x);
+  core::double z_y = z.{core::double::*}(y);
+  core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(n);
+  core::num n_i = n.{core::num::%}(i);
+  core::double n_d = n.{core::num::%}(d);
+  core::num n_x = n.{core::num::%}(x);
+  core::num n_y = n.{core::num::%}(y);
+  core::double n_z = n.{core::num::%}(z);
+  core::num i_n = i.{core::num::%}(n);
+  core::int i_i = i.{core::num::%}(i);
+  core::double i_d = i.{core::num::%}(d);
+  core::num i_x = i.{core::num::%}(x);
+  core::int i_y = i.{core::num::%}(y);
+  core::double i_z = i.{core::num::%}(z);
+  core::double d_n = d.{core::double::%}(n);
+  core::double d_i = d.{core::double::%}(i);
+  core::double d_d = d.{core::double::%}(d);
+  core::double d_x = d.{core::double::%}(x);
+  core::double d_y = d.{core::double::%}(y);
+  core::double d_z = d.{core::double::%}(z);
+  core::num x_n = x.{core::num::%}(n);
+  core::num x_i = x.{core::num::%}(i);
+  core::double x_d = x.{core::num::%}(d);
+  core::num x_x = x.{core::num::%}(x);
+  core::num x_y = x.{core::num::%}(y);
+  core::double x_z = x.{core::num::%}(z);
+  core::num y_n = y.{core::num::%}(n);
+  core::int y_i = y.{core::num::%}(i);
+  core::double y_d = y.{core::num::%}(d);
+  core::num y_x = y.{core::num::%}(x);
+  core::int y_y = y.{core::num::%}(y);
+  core::double y_z = y.{core::num::%}(z);
+  core::double z_n = z.{core::double::%}(n);
+  core::double z_i = z.{core::double::%}(i);
+  core::double z_d = z.{core::double::%}(d);
+  core::double z_x = z.{core::double::%}(x);
+  core::double z_y = z.{core::double::%}(y);
+  core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(n);
+  core::num n_i = n.{core::num::remainder}(i);
+  core::double n_d = n.{core::num::remainder}(d);
+  core::num n_x = n.{core::num::remainder}(x);
+  core::num n_y = n.{core::num::remainder}(y);
+  core::double n_z = n.{core::num::remainder}(z);
+  core::num i_n = i.{core::num::remainder}(n);
+  core::int i_i = i.{core::num::remainder}(i);
+  core::double i_d = i.{core::num::remainder}(d);
+  core::num i_x = i.{core::num::remainder}(x);
+  core::int i_y = i.{core::num::remainder}(y);
+  core::double i_z = i.{core::num::remainder}(z);
+  core::double d_n = d.{core::double::remainder}(n);
+  core::double d_i = d.{core::double::remainder}(i);
+  core::double d_d = d.{core::double::remainder}(d);
+  core::double d_x = d.{core::double::remainder}(x);
+  core::double d_y = d.{core::double::remainder}(y);
+  core::double d_z = d.{core::double::remainder}(z);
+  core::num x_n = x.{core::num::remainder}(n);
+  core::num x_i = x.{core::num::remainder}(i);
+  core::double x_d = x.{core::num::remainder}(d);
+  core::num x_x = x.{core::num::remainder}(x);
+  core::num x_y = x.{core::num::remainder}(y);
+  core::double x_z = x.{core::num::remainder}(z);
+  core::num y_n = y.{core::num::remainder}(n);
+  core::int y_i = y.{core::num::remainder}(i);
+  core::double y_d = y.{core::num::remainder}(d);
+  core::num y_x = y.{core::num::remainder}(x);
+  core::int y_y = y.{core::num::remainder}(y);
+  core::double y_z = y.{core::num::remainder}(z);
+  core::double z_n = z.{core::double::remainder}(n);
+  core::double z_i = z.{core::double::remainder}(i);
+  core::double z_d = z.{core::double::remainder}(d);
+  core::double z_x = z.{core::double::remainder}(x);
+  core::double z_y = z.{core::double::remainder}(y);
+  core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n_n = n.{core::num::clamp}(n, n);
+  core::num n_i_n = n.{core::num::clamp}(i, n);
+  core::num n_d_n = n.{core::num::clamp}(d, n);
+  core::num n_x_n = n.{core::num::clamp}(x, n);
+  core::num n_y_n = n.{core::num::clamp}(y, n);
+  core::num n_z_n = n.{core::num::clamp}(z, n);
+  core::num n_n_i = n.{core::num::clamp}(n, i);
+  core::num n_i_i = n.{core::num::clamp}(i, i);
+  core::num n_d_i = n.{core::num::clamp}(d, i);
+  core::num n_x_i = n.{core::num::clamp}(x, i);
+  core::num n_y_i = n.{core::num::clamp}(y, i);
+  core::num n_z_i = n.{core::num::clamp}(z, i);
+  core::num n_n_d = n.{core::num::clamp}(n, d);
+  core::num n_i_d = n.{core::num::clamp}(i, d);
+  core::num n_d_d = n.{core::num::clamp}(d, d);
+  core::num n_x_d = n.{core::num::clamp}(x, d);
+  core::num n_y_d = n.{core::num::clamp}(y, d);
+  core::num n_z_d = n.{core::num::clamp}(z, d);
+  core::num n_n_x = n.{core::num::clamp}(n, x);
+  core::num n_i_x = n.{core::num::clamp}(i, x);
+  core::num n_d_x = n.{core::num::clamp}(d, x);
+  core::num n_x_x = n.{core::num::clamp}(x, x);
+  core::num n_y_x = n.{core::num::clamp}(y, x);
+  core::num n_z_x = n.{core::num::clamp}(z, x);
+  core::num n_n_y = n.{core::num::clamp}(n, y);
+  core::num n_i_y = n.{core::num::clamp}(i, y);
+  core::num n_d_y = n.{core::num::clamp}(d, y);
+  core::num n_x_y = n.{core::num::clamp}(x, y);
+  core::num n_y_y = n.{core::num::clamp}(y, y);
+  core::num n_z_y = n.{core::num::clamp}(z, y);
+  core::num n_n_z = n.{core::num::clamp}(n, z);
+  core::num n_i_z = n.{core::num::clamp}(i, z);
+  core::num n_d_z = n.{core::num::clamp}(d, z);
+  core::num n_x_z = n.{core::num::clamp}(x, z);
+  core::num n_y_z = n.{core::num::clamp}(y, z);
+  core::num n_z_z = n.{core::num::clamp}(z, z);
+  core::num i_n_n = i.{core::num::clamp}(n, n);
+  core::num i_i_n = i.{core::num::clamp}(i, n);
+  core::num i_d_n = i.{core::num::clamp}(d, n);
+  core::num i_x_n = i.{core::num::clamp}(x, n);
+  core::num i_y_n = i.{core::num::clamp}(y, n);
+  core::num i_z_n = i.{core::num::clamp}(z, n);
+  core::num i_n_i = i.{core::num::clamp}(n, i);
+  core::int i_i_i = i.{core::num::clamp}(i, i);
+  core::num i_d_i = i.{core::num::clamp}(d, i);
+  core::num i_x_i = i.{core::num::clamp}(x, i);
+  core::int i_y_i = i.{core::num::clamp}(y, i);
+  core::num i_z_i = i.{core::num::clamp}(z, i);
+  core::num i_n_d = i.{core::num::clamp}(n, d);
+  core::num i_i_d = i.{core::num::clamp}(i, d);
+  core::num i_d_d = i.{core::num::clamp}(d, d);
+  core::num i_x_d = i.{core::num::clamp}(x, d);
+  core::num i_y_d = i.{core::num::clamp}(y, d);
+  core::num i_z_d = i.{core::num::clamp}(z, d);
+  core::num i_n_x = i.{core::num::clamp}(n, x);
+  core::num i_i_x = i.{core::num::clamp}(i, x);
+  core::num i_d_x = i.{core::num::clamp}(d, x);
+  core::num i_x_x = i.{core::num::clamp}(x, x);
+  core::num i_y_x = i.{core::num::clamp}(y, x);
+  core::num i_z_x = i.{core::num::clamp}(z, x);
+  core::num i_n_y = i.{core::num::clamp}(n, y);
+  core::int i_i_y = i.{core::num::clamp}(i, y);
+  core::num i_d_y = i.{core::num::clamp}(d, y);
+  core::num i_x_y = i.{core::num::clamp}(x, y);
+  core::int i_y_y = i.{core::num::clamp}(y, y);
+  core::num i_z_y = i.{core::num::clamp}(z, y);
+  core::num i_n_z = i.{core::num::clamp}(n, z);
+  core::num i_i_z = i.{core::num::clamp}(i, z);
+  core::num i_d_z = i.{core::num::clamp}(d, z);
+  core::num i_x_z = i.{core::num::clamp}(x, z);
+  core::num i_y_z = i.{core::num::clamp}(y, z);
+  core::num i_z_z = i.{core::num::clamp}(z, z);
+  core::num d_n_n = d.{core::num::clamp}(n, n);
+  core::num d_i_n = d.{core::num::clamp}(i, n);
+  core::num d_d_n = d.{core::num::clamp}(d, n);
+  core::num d_x_n = d.{core::num::clamp}(x, n);
+  core::num d_y_n = d.{core::num::clamp}(y, n);
+  core::num d_z_n = d.{core::num::clamp}(z, n);
+  core::num d_n_i = d.{core::num::clamp}(n, i);
+  core::num d_i_i = d.{core::num::clamp}(i, i);
+  core::num d_d_i = d.{core::num::clamp}(d, i);
+  core::num d_x_i = d.{core::num::clamp}(x, i);
+  core::num d_y_i = d.{core::num::clamp}(y, i);
+  core::num d_z_i = d.{core::num::clamp}(z, i);
+  core::num d_n_d = d.{core::num::clamp}(n, d);
+  core::num d_i_d = d.{core::num::clamp}(i, d);
+  core::double d_d_d = d.{core::num::clamp}(d, d);
+  core::num d_x_d = d.{core::num::clamp}(x, d);
+  core::num d_y_d = d.{core::num::clamp}(y, d);
+  core::double d_z_d = d.{core::num::clamp}(z, d);
+  core::num d_n_x = d.{core::num::clamp}(n, x);
+  core::num d_i_x = d.{core::num::clamp}(i, x);
+  core::num d_d_x = d.{core::num::clamp}(d, x);
+  core::num d_x_x = d.{core::num::clamp}(x, x);
+  core::num d_y_x = d.{core::num::clamp}(y, x);
+  core::num d_z_x = d.{core::num::clamp}(z, x);
+  core::num d_n_y = d.{core::num::clamp}(n, y);
+  core::num d_i_y = d.{core::num::clamp}(i, y);
+  core::num d_d_y = d.{core::num::clamp}(d, y);
+  core::num d_x_y = d.{core::num::clamp}(x, y);
+  core::num d_y_y = d.{core::num::clamp}(y, y);
+  core::num d_z_y = d.{core::num::clamp}(z, y);
+  core::num d_n_z = d.{core::num::clamp}(n, z);
+  core::num d_i_z = d.{core::num::clamp}(i, z);
+  core::double d_d_z = d.{core::num::clamp}(d, z);
+  core::num d_x_z = d.{core::num::clamp}(x, z);
+  core::num d_y_z = d.{core::num::clamp}(y, z);
+  core::double d_z_z = d.{core::num::clamp}(z, z);
+  core::num x_n_n = x.{core::num::clamp}(n, n);
+  core::num x_i_n = x.{core::num::clamp}(i, n);
+  core::num x_d_n = x.{core::num::clamp}(d, n);
+  core::num x_x_n = x.{core::num::clamp}(x, n);
+  core::num x_y_n = x.{core::num::clamp}(y, n);
+  core::num x_z_n = x.{core::num::clamp}(z, n);
+  core::num x_n_i = x.{core::num::clamp}(n, i);
+  core::num x_i_i = x.{core::num::clamp}(i, i);
+  core::num x_d_i = x.{core::num::clamp}(d, i);
+  core::num x_x_i = x.{core::num::clamp}(x, i);
+  core::num x_y_i = x.{core::num::clamp}(y, i);
+  core::num x_z_i = x.{core::num::clamp}(z, i);
+  core::num x_n_d = x.{core::num::clamp}(n, d);
+  core::num x_i_d = x.{core::num::clamp}(i, d);
+  core::num x_d_d = x.{core::num::clamp}(d, d);
+  core::num x_x_d = x.{core::num::clamp}(x, d);
+  core::num x_y_d = x.{core::num::clamp}(y, d);
+  core::num x_z_d = x.{core::num::clamp}(z, d);
+  core::num x_n_x = x.{core::num::clamp}(n, x);
+  core::num x_i_x = x.{core::num::clamp}(i, x);
+  core::num x_d_x = x.{core::num::clamp}(d, x);
+  core::num x_x_x = x.{core::num::clamp}(x, x);
+  core::num x_y_x = x.{core::num::clamp}(y, x);
+  core::num x_z_x = x.{core::num::clamp}(z, x);
+  core::num x_n_y = x.{core::num::clamp}(n, y);
+  core::num x_i_y = x.{core::num::clamp}(i, y);
+  core::num x_d_y = x.{core::num::clamp}(d, y);
+  core::num x_x_y = x.{core::num::clamp}(x, y);
+  core::num x_y_y = x.{core::num::clamp}(y, y);
+  core::num x_z_y = x.{core::num::clamp}(z, y);
+  core::num x_n_z = x.{core::num::clamp}(n, z);
+  core::num x_i_z = x.{core::num::clamp}(i, z);
+  core::num x_d_z = x.{core::num::clamp}(d, z);
+  core::num x_x_z = x.{core::num::clamp}(x, z);
+  core::num x_y_z = x.{core::num::clamp}(y, z);
+  core::num x_z_z = x.{core::num::clamp}(z, z);
+  core::num y_n_n = y.{core::num::clamp}(n, n);
+  core::num y_i_n = y.{core::num::clamp}(i, n);
+  core::num y_d_n = y.{core::num::clamp}(d, n);
+  core::num y_x_n = y.{core::num::clamp}(x, n);
+  core::num y_y_n = y.{core::num::clamp}(y, n);
+  core::num y_z_n = y.{core::num::clamp}(z, n);
+  core::num y_n_i = y.{core::num::clamp}(n, i);
+  core::int y_i_i = y.{core::num::clamp}(i, i);
+  core::num y_d_i = y.{core::num::clamp}(d, i);
+  core::num y_x_i = y.{core::num::clamp}(x, i);
+  core::int y_y_i = y.{core::num::clamp}(y, i);
+  core::num y_z_i = y.{core::num::clamp}(z, i);
+  core::num y_n_d = y.{core::num::clamp}(n, d);
+  core::num y_i_d = y.{core::num::clamp}(i, d);
+  core::num y_d_d = y.{core::num::clamp}(d, d);
+  core::num y_x_d = y.{core::num::clamp}(x, d);
+  core::num y_y_d = y.{core::num::clamp}(y, d);
+  core::num y_z_d = y.{core::num::clamp}(z, d);
+  core::num y_n_x = y.{core::num::clamp}(n, x);
+  core::num y_i_x = y.{core::num::clamp}(i, x);
+  core::num y_d_x = y.{core::num::clamp}(d, x);
+  core::num y_x_x = y.{core::num::clamp}(x, x);
+  core::num y_y_x = y.{core::num::clamp}(y, x);
+  core::num y_z_x = y.{core::num::clamp}(z, x);
+  core::num y_n_y = y.{core::num::clamp}(n, y);
+  core::int y_i_y = y.{core::num::clamp}(i, y);
+  core::num y_d_y = y.{core::num::clamp}(d, y);
+  core::num y_x_y = y.{core::num::clamp}(x, y);
+  core::int y_y_y = y.{core::num::clamp}(y, y);
+  core::num y_z_y = y.{core::num::clamp}(z, y);
+  core::num y_n_z = y.{core::num::clamp}(n, z);
+  core::num y_i_z = y.{core::num::clamp}(i, z);
+  core::num y_d_z = y.{core::num::clamp}(d, z);
+  core::num y_x_z = y.{core::num::clamp}(x, z);
+  core::num y_y_z = y.{core::num::clamp}(y, z);
+  core::num y_z_z = y.{core::num::clamp}(z, z);
+  core::num z_n_n = z.{core::num::clamp}(n, n);
+  core::num z_i_n = z.{core::num::clamp}(i, n);
+  core::num z_d_n = z.{core::num::clamp}(d, n);
+  core::num z_x_n = z.{core::num::clamp}(x, n);
+  core::num z_y_n = z.{core::num::clamp}(y, n);
+  core::num z_z_n = z.{core::num::clamp}(z, n);
+  core::num z_n_i = z.{core::num::clamp}(n, i);
+  core::num z_i_i = z.{core::num::clamp}(i, i);
+  core::num z_d_i = z.{core::num::clamp}(d, i);
+  core::num z_x_i = z.{core::num::clamp}(x, i);
+  core::num z_y_i = z.{core::num::clamp}(y, i);
+  core::num z_z_i = z.{core::num::clamp}(z, i);
+  core::num z_n_d = z.{core::num::clamp}(n, d);
+  core::num z_i_d = z.{core::num::clamp}(i, d);
+  core::double z_d_d = z.{core::num::clamp}(d, d);
+  core::num z_x_d = z.{core::num::clamp}(x, d);
+  core::num z_y_d = z.{core::num::clamp}(y, d);
+  core::double z_z_d = z.{core::num::clamp}(z, d);
+  core::num z_n_x = z.{core::num::clamp}(n, x);
+  core::num z_i_x = z.{core::num::clamp}(i, x);
+  core::num z_d_x = z.{core::num::clamp}(d, x);
+  core::num z_x_x = z.{core::num::clamp}(x, x);
+  core::num z_y_x = z.{core::num::clamp}(y, x);
+  core::num z_z_x = z.{core::num::clamp}(z, x);
+  core::num z_n_y = z.{core::num::clamp}(n, y);
+  core::num z_i_y = z.{core::num::clamp}(i, y);
+  core::num z_d_y = z.{core::num::clamp}(d, y);
+  core::num z_x_y = z.{core::num::clamp}(x, y);
+  core::num z_y_y = z.{core::num::clamp}(y, y);
+  core::num z_z_y = z.{core::num::clamp}(z, y);
+  core::num z_n_z = z.{core::num::clamp}(n, z);
+  core::num z_i_z = z.{core::num::clamp}(i, z);
+  core::double z_d_z = z.{core::num::clamp}(d, z);
+  core::num z_x_z = z.{core::num::clamp}(x, z);
+  core::num z_y_z = z.{core::num::clamp}(y, z);
+  core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline.expect
new file mode 100644
index 0000000..f82bc4c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+add<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+mod<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5a136a0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+add<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+main() {}
+mod<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(n);
+  core::num n_i = n.{core::num::+}(i);
+  core::double n_d = n.{core::num::+}(d);
+  core::num n_x = n.{core::num::+}(x);
+  core::num n_y = n.{core::num::+}(y);
+  core::double n_z = n.{core::num::+}(z);
+  core::num i_n = i.{core::num::+}(n);
+  core::int i_i = i.{core::num::+}(i);
+  core::double i_d = i.{core::num::+}(d);
+  core::num i_x = i.{core::num::+}(x);
+  core::int i_y = i.{core::num::+}(y);
+  core::double i_z = i.{core::num::+}(z);
+  core::double d_n = d.{core::double::+}(n);
+  core::double d_i = d.{core::double::+}(i);
+  core::double d_d = d.{core::double::+}(d);
+  core::double d_x = d.{core::double::+}(x);
+  core::double d_y = d.{core::double::+}(y);
+  core::double d_z = d.{core::double::+}(z);
+  core::num x_n = x.{core::num::+}(n);
+  core::num x_i = x.{core::num::+}(i);
+  core::double x_d = x.{core::num::+}(d);
+  core::num x_x = x.{core::num::+}(x);
+  core::num x_y = x.{core::num::+}(y);
+  core::double x_z = x.{core::num::+}(z);
+  core::num y_n = y.{core::num::+}(n);
+  core::int y_i = y.{core::num::+}(i);
+  core::double y_d = y.{core::num::+}(d);
+  core::num y_x = y.{core::num::+}(x);
+  core::int y_y = y.{core::num::+}(y);
+  core::double y_z = y.{core::num::+}(z);
+  core::double z_n = z.{core::double::+}(n);
+  core::double z_i = z.{core::double::+}(i);
+  core::double z_d = z.{core::double::+}(d);
+  core::double z_x = z.{core::double::+}(x);
+  core::double z_y = z.{core::double::+}(y);
+  core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(n);
+  core::num n_i = n.{core::num::-}(i);
+  core::double n_d = n.{core::num::-}(d);
+  core::num n_x = n.{core::num::-}(x);
+  core::num n_y = n.{core::num::-}(y);
+  core::double n_z = n.{core::num::-}(z);
+  core::num i_n = i.{core::num::-}(n);
+  core::int i_i = i.{core::num::-}(i);
+  core::double i_d = i.{core::num::-}(d);
+  core::num i_x = i.{core::num::-}(x);
+  core::int i_y = i.{core::num::-}(y);
+  core::double i_z = i.{core::num::-}(z);
+  core::double d_n = d.{core::double::-}(n);
+  core::double d_i = d.{core::double::-}(i);
+  core::double d_d = d.{core::double::-}(d);
+  core::double d_x = d.{core::double::-}(x);
+  core::double d_y = d.{core::double::-}(y);
+  core::double d_z = d.{core::double::-}(z);
+  core::num x_n = x.{core::num::-}(n);
+  core::num x_i = x.{core::num::-}(i);
+  core::double x_d = x.{core::num::-}(d);
+  core::num x_x = x.{core::num::-}(x);
+  core::num x_y = x.{core::num::-}(y);
+  core::double x_z = x.{core::num::-}(z);
+  core::num y_n = y.{core::num::-}(n);
+  core::int y_i = y.{core::num::-}(i);
+  core::double y_d = y.{core::num::-}(d);
+  core::num y_x = y.{core::num::-}(x);
+  core::int y_y = y.{core::num::-}(y);
+  core::double y_z = y.{core::num::-}(z);
+  core::double z_n = z.{core::double::-}(n);
+  core::double z_i = z.{core::double::-}(i);
+  core::double z_d = z.{core::double::-}(d);
+  core::double z_x = z.{core::double::-}(x);
+  core::double z_y = z.{core::double::-}(y);
+  core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(n);
+  core::num n_i = n.{core::num::*}(i);
+  core::double n_d = n.{core::num::*}(d);
+  core::num n_x = n.{core::num::*}(x);
+  core::num n_y = n.{core::num::*}(y);
+  core::double n_z = n.{core::num::*}(z);
+  core::num i_n = i.{core::num::*}(n);
+  core::int i_i = i.{core::num::*}(i);
+  core::double i_d = i.{core::num::*}(d);
+  core::num i_x = i.{core::num::*}(x);
+  core::int i_y = i.{core::num::*}(y);
+  core::double i_z = i.{core::num::*}(z);
+  core::double d_n = d.{core::double::*}(n);
+  core::double d_i = d.{core::double::*}(i);
+  core::double d_d = d.{core::double::*}(d);
+  core::double d_x = d.{core::double::*}(x);
+  core::double d_y = d.{core::double::*}(y);
+  core::double d_z = d.{core::double::*}(z);
+  core::num x_n = x.{core::num::*}(n);
+  core::num x_i = x.{core::num::*}(i);
+  core::double x_d = x.{core::num::*}(d);
+  core::num x_x = x.{core::num::*}(x);
+  core::num x_y = x.{core::num::*}(y);
+  core::double x_z = x.{core::num::*}(z);
+  core::num y_n = y.{core::num::*}(n);
+  core::int y_i = y.{core::num::*}(i);
+  core::double y_d = y.{core::num::*}(d);
+  core::num y_x = y.{core::num::*}(x);
+  core::int y_y = y.{core::num::*}(y);
+  core::double y_z = y.{core::num::*}(z);
+  core::double z_n = z.{core::double::*}(n);
+  core::double z_i = z.{core::double::*}(i);
+  core::double z_d = z.{core::double::*}(d);
+  core::double z_x = z.{core::double::*}(x);
+  core::double z_y = z.{core::double::*}(y);
+  core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(n);
+  core::num n_i = n.{core::num::%}(i);
+  core::double n_d = n.{core::num::%}(d);
+  core::num n_x = n.{core::num::%}(x);
+  core::num n_y = n.{core::num::%}(y);
+  core::double n_z = n.{core::num::%}(z);
+  core::num i_n = i.{core::num::%}(n);
+  core::int i_i = i.{core::num::%}(i);
+  core::double i_d = i.{core::num::%}(d);
+  core::num i_x = i.{core::num::%}(x);
+  core::int i_y = i.{core::num::%}(y);
+  core::double i_z = i.{core::num::%}(z);
+  core::double d_n = d.{core::double::%}(n);
+  core::double d_i = d.{core::double::%}(i);
+  core::double d_d = d.{core::double::%}(d);
+  core::double d_x = d.{core::double::%}(x);
+  core::double d_y = d.{core::double::%}(y);
+  core::double d_z = d.{core::double::%}(z);
+  core::num x_n = x.{core::num::%}(n);
+  core::num x_i = x.{core::num::%}(i);
+  core::double x_d = x.{core::num::%}(d);
+  core::num x_x = x.{core::num::%}(x);
+  core::num x_y = x.{core::num::%}(y);
+  core::double x_z = x.{core::num::%}(z);
+  core::num y_n = y.{core::num::%}(n);
+  core::int y_i = y.{core::num::%}(i);
+  core::double y_d = y.{core::num::%}(d);
+  core::num y_x = y.{core::num::%}(x);
+  core::int y_y = y.{core::num::%}(y);
+  core::double y_z = y.{core::num::%}(z);
+  core::double z_n = z.{core::double::%}(n);
+  core::double z_i = z.{core::double::%}(i);
+  core::double z_d = z.{core::double::%}(d);
+  core::double z_x = z.{core::double::%}(x);
+  core::double z_y = z.{core::double::%}(y);
+  core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(n);
+  core::num n_i = n.{core::num::remainder}(i);
+  core::double n_d = n.{core::num::remainder}(d);
+  core::num n_x = n.{core::num::remainder}(x);
+  core::num n_y = n.{core::num::remainder}(y);
+  core::double n_z = n.{core::num::remainder}(z);
+  core::num i_n = i.{core::num::remainder}(n);
+  core::int i_i = i.{core::num::remainder}(i);
+  core::double i_d = i.{core::num::remainder}(d);
+  core::num i_x = i.{core::num::remainder}(x);
+  core::int i_y = i.{core::num::remainder}(y);
+  core::double i_z = i.{core::num::remainder}(z);
+  core::double d_n = d.{core::double::remainder}(n);
+  core::double d_i = d.{core::double::remainder}(i);
+  core::double d_d = d.{core::double::remainder}(d);
+  core::double d_x = d.{core::double::remainder}(x);
+  core::double d_y = d.{core::double::remainder}(y);
+  core::double d_z = d.{core::double::remainder}(z);
+  core::num x_n = x.{core::num::remainder}(n);
+  core::num x_i = x.{core::num::remainder}(i);
+  core::double x_d = x.{core::num::remainder}(d);
+  core::num x_x = x.{core::num::remainder}(x);
+  core::num x_y = x.{core::num::remainder}(y);
+  core::double x_z = x.{core::num::remainder}(z);
+  core::num y_n = y.{core::num::remainder}(n);
+  core::int y_i = y.{core::num::remainder}(i);
+  core::double y_d = y.{core::num::remainder}(d);
+  core::num y_x = y.{core::num::remainder}(x);
+  core::int y_y = y.{core::num::remainder}(y);
+  core::double y_z = y.{core::num::remainder}(z);
+  core::double z_n = z.{core::double::remainder}(n);
+  core::double z_i = z.{core::double::remainder}(i);
+  core::double z_d = z.{core::double::remainder}(d);
+  core::double z_x = z.{core::double::remainder}(x);
+  core::double z_y = z.{core::double::remainder}(y);
+  core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n_n = n.{core::num::clamp}(n, n);
+  core::num n_i_n = n.{core::num::clamp}(i, n);
+  core::num n_d_n = n.{core::num::clamp}(d, n);
+  core::num n_x_n = n.{core::num::clamp}(x, n);
+  core::num n_y_n = n.{core::num::clamp}(y, n);
+  core::num n_z_n = n.{core::num::clamp}(z, n);
+  core::num n_n_i = n.{core::num::clamp}(n, i);
+  core::num n_i_i = n.{core::num::clamp}(i, i);
+  core::num n_d_i = n.{core::num::clamp}(d, i);
+  core::num n_x_i = n.{core::num::clamp}(x, i);
+  core::num n_y_i = n.{core::num::clamp}(y, i);
+  core::num n_z_i = n.{core::num::clamp}(z, i);
+  core::num n_n_d = n.{core::num::clamp}(n, d);
+  core::num n_i_d = n.{core::num::clamp}(i, d);
+  core::num n_d_d = n.{core::num::clamp}(d, d);
+  core::num n_x_d = n.{core::num::clamp}(x, d);
+  core::num n_y_d = n.{core::num::clamp}(y, d);
+  core::num n_z_d = n.{core::num::clamp}(z, d);
+  core::num n_n_x = n.{core::num::clamp}(n, x);
+  core::num n_i_x = n.{core::num::clamp}(i, x);
+  core::num n_d_x = n.{core::num::clamp}(d, x);
+  core::num n_x_x = n.{core::num::clamp}(x, x);
+  core::num n_y_x = n.{core::num::clamp}(y, x);
+  core::num n_z_x = n.{core::num::clamp}(z, x);
+  core::num n_n_y = n.{core::num::clamp}(n, y);
+  core::num n_i_y = n.{core::num::clamp}(i, y);
+  core::num n_d_y = n.{core::num::clamp}(d, y);
+  core::num n_x_y = n.{core::num::clamp}(x, y);
+  core::num n_y_y = n.{core::num::clamp}(y, y);
+  core::num n_z_y = n.{core::num::clamp}(z, y);
+  core::num n_n_z = n.{core::num::clamp}(n, z);
+  core::num n_i_z = n.{core::num::clamp}(i, z);
+  core::num n_d_z = n.{core::num::clamp}(d, z);
+  core::num n_x_z = n.{core::num::clamp}(x, z);
+  core::num n_y_z = n.{core::num::clamp}(y, z);
+  core::num n_z_z = n.{core::num::clamp}(z, z);
+  core::num i_n_n = i.{core::num::clamp}(n, n);
+  core::num i_i_n = i.{core::num::clamp}(i, n);
+  core::num i_d_n = i.{core::num::clamp}(d, n);
+  core::num i_x_n = i.{core::num::clamp}(x, n);
+  core::num i_y_n = i.{core::num::clamp}(y, n);
+  core::num i_z_n = i.{core::num::clamp}(z, n);
+  core::num i_n_i = i.{core::num::clamp}(n, i);
+  core::int i_i_i = i.{core::num::clamp}(i, i);
+  core::num i_d_i = i.{core::num::clamp}(d, i);
+  core::num i_x_i = i.{core::num::clamp}(x, i);
+  core::int i_y_i = i.{core::num::clamp}(y, i);
+  core::num i_z_i = i.{core::num::clamp}(z, i);
+  core::num i_n_d = i.{core::num::clamp}(n, d);
+  core::num i_i_d = i.{core::num::clamp}(i, d);
+  core::num i_d_d = i.{core::num::clamp}(d, d);
+  core::num i_x_d = i.{core::num::clamp}(x, d);
+  core::num i_y_d = i.{core::num::clamp}(y, d);
+  core::num i_z_d = i.{core::num::clamp}(z, d);
+  core::num i_n_x = i.{core::num::clamp}(n, x);
+  core::num i_i_x = i.{core::num::clamp}(i, x);
+  core::num i_d_x = i.{core::num::clamp}(d, x);
+  core::num i_x_x = i.{core::num::clamp}(x, x);
+  core::num i_y_x = i.{core::num::clamp}(y, x);
+  core::num i_z_x = i.{core::num::clamp}(z, x);
+  core::num i_n_y = i.{core::num::clamp}(n, y);
+  core::int i_i_y = i.{core::num::clamp}(i, y);
+  core::num i_d_y = i.{core::num::clamp}(d, y);
+  core::num i_x_y = i.{core::num::clamp}(x, y);
+  core::int i_y_y = i.{core::num::clamp}(y, y);
+  core::num i_z_y = i.{core::num::clamp}(z, y);
+  core::num i_n_z = i.{core::num::clamp}(n, z);
+  core::num i_i_z = i.{core::num::clamp}(i, z);
+  core::num i_d_z = i.{core::num::clamp}(d, z);
+  core::num i_x_z = i.{core::num::clamp}(x, z);
+  core::num i_y_z = i.{core::num::clamp}(y, z);
+  core::num i_z_z = i.{core::num::clamp}(z, z);
+  core::num d_n_n = d.{core::num::clamp}(n, n);
+  core::num d_i_n = d.{core::num::clamp}(i, n);
+  core::num d_d_n = d.{core::num::clamp}(d, n);
+  core::num d_x_n = d.{core::num::clamp}(x, n);
+  core::num d_y_n = d.{core::num::clamp}(y, n);
+  core::num d_z_n = d.{core::num::clamp}(z, n);
+  core::num d_n_i = d.{core::num::clamp}(n, i);
+  core::num d_i_i = d.{core::num::clamp}(i, i);
+  core::num d_d_i = d.{core::num::clamp}(d, i);
+  core::num d_x_i = d.{core::num::clamp}(x, i);
+  core::num d_y_i = d.{core::num::clamp}(y, i);
+  core::num d_z_i = d.{core::num::clamp}(z, i);
+  core::num d_n_d = d.{core::num::clamp}(n, d);
+  core::num d_i_d = d.{core::num::clamp}(i, d);
+  core::double d_d_d = d.{core::num::clamp}(d, d);
+  core::num d_x_d = d.{core::num::clamp}(x, d);
+  core::num d_y_d = d.{core::num::clamp}(y, d);
+  core::double d_z_d = d.{core::num::clamp}(z, d);
+  core::num d_n_x = d.{core::num::clamp}(n, x);
+  core::num d_i_x = d.{core::num::clamp}(i, x);
+  core::num d_d_x = d.{core::num::clamp}(d, x);
+  core::num d_x_x = d.{core::num::clamp}(x, x);
+  core::num d_y_x = d.{core::num::clamp}(y, x);
+  core::num d_z_x = d.{core::num::clamp}(z, x);
+  core::num d_n_y = d.{core::num::clamp}(n, y);
+  core::num d_i_y = d.{core::num::clamp}(i, y);
+  core::num d_d_y = d.{core::num::clamp}(d, y);
+  core::num d_x_y = d.{core::num::clamp}(x, y);
+  core::num d_y_y = d.{core::num::clamp}(y, y);
+  core::num d_z_y = d.{core::num::clamp}(z, y);
+  core::num d_n_z = d.{core::num::clamp}(n, z);
+  core::num d_i_z = d.{core::num::clamp}(i, z);
+  core::double d_d_z = d.{core::num::clamp}(d, z);
+  core::num d_x_z = d.{core::num::clamp}(x, z);
+  core::num d_y_z = d.{core::num::clamp}(y, z);
+  core::double d_z_z = d.{core::num::clamp}(z, z);
+  core::num x_n_n = x.{core::num::clamp}(n, n);
+  core::num x_i_n = x.{core::num::clamp}(i, n);
+  core::num x_d_n = x.{core::num::clamp}(d, n);
+  core::num x_x_n = x.{core::num::clamp}(x, n);
+  core::num x_y_n = x.{core::num::clamp}(y, n);
+  core::num x_z_n = x.{core::num::clamp}(z, n);
+  core::num x_n_i = x.{core::num::clamp}(n, i);
+  core::num x_i_i = x.{core::num::clamp}(i, i);
+  core::num x_d_i = x.{core::num::clamp}(d, i);
+  core::num x_x_i = x.{core::num::clamp}(x, i);
+  core::num x_y_i = x.{core::num::clamp}(y, i);
+  core::num x_z_i = x.{core::num::clamp}(z, i);
+  core::num x_n_d = x.{core::num::clamp}(n, d);
+  core::num x_i_d = x.{core::num::clamp}(i, d);
+  core::num x_d_d = x.{core::num::clamp}(d, d);
+  core::num x_x_d = x.{core::num::clamp}(x, d);
+  core::num x_y_d = x.{core::num::clamp}(y, d);
+  core::num x_z_d = x.{core::num::clamp}(z, d);
+  core::num x_n_x = x.{core::num::clamp}(n, x);
+  core::num x_i_x = x.{core::num::clamp}(i, x);
+  core::num x_d_x = x.{core::num::clamp}(d, x);
+  core::num x_x_x = x.{core::num::clamp}(x, x);
+  core::num x_y_x = x.{core::num::clamp}(y, x);
+  core::num x_z_x = x.{core::num::clamp}(z, x);
+  core::num x_n_y = x.{core::num::clamp}(n, y);
+  core::num x_i_y = x.{core::num::clamp}(i, y);
+  core::num x_d_y = x.{core::num::clamp}(d, y);
+  core::num x_x_y = x.{core::num::clamp}(x, y);
+  core::num x_y_y = x.{core::num::clamp}(y, y);
+  core::num x_z_y = x.{core::num::clamp}(z, y);
+  core::num x_n_z = x.{core::num::clamp}(n, z);
+  core::num x_i_z = x.{core::num::clamp}(i, z);
+  core::num x_d_z = x.{core::num::clamp}(d, z);
+  core::num x_x_z = x.{core::num::clamp}(x, z);
+  core::num x_y_z = x.{core::num::clamp}(y, z);
+  core::num x_z_z = x.{core::num::clamp}(z, z);
+  core::num y_n_n = y.{core::num::clamp}(n, n);
+  core::num y_i_n = y.{core::num::clamp}(i, n);
+  core::num y_d_n = y.{core::num::clamp}(d, n);
+  core::num y_x_n = y.{core::num::clamp}(x, n);
+  core::num y_y_n = y.{core::num::clamp}(y, n);
+  core::num y_z_n = y.{core::num::clamp}(z, n);
+  core::num y_n_i = y.{core::num::clamp}(n, i);
+  core::int y_i_i = y.{core::num::clamp}(i, i);
+  core::num y_d_i = y.{core::num::clamp}(d, i);
+  core::num y_x_i = y.{core::num::clamp}(x, i);
+  core::int y_y_i = y.{core::num::clamp}(y, i);
+  core::num y_z_i = y.{core::num::clamp}(z, i);
+  core::num y_n_d = y.{core::num::clamp}(n, d);
+  core::num y_i_d = y.{core::num::clamp}(i, d);
+  core::num y_d_d = y.{core::num::clamp}(d, d);
+  core::num y_x_d = y.{core::num::clamp}(x, d);
+  core::num y_y_d = y.{core::num::clamp}(y, d);
+  core::num y_z_d = y.{core::num::clamp}(z, d);
+  core::num y_n_x = y.{core::num::clamp}(n, x);
+  core::num y_i_x = y.{core::num::clamp}(i, x);
+  core::num y_d_x = y.{core::num::clamp}(d, x);
+  core::num y_x_x = y.{core::num::clamp}(x, x);
+  core::num y_y_x = y.{core::num::clamp}(y, x);
+  core::num y_z_x = y.{core::num::clamp}(z, x);
+  core::num y_n_y = y.{core::num::clamp}(n, y);
+  core::int y_i_y = y.{core::num::clamp}(i, y);
+  core::num y_d_y = y.{core::num::clamp}(d, y);
+  core::num y_x_y = y.{core::num::clamp}(x, y);
+  core::int y_y_y = y.{core::num::clamp}(y, y);
+  core::num y_z_y = y.{core::num::clamp}(z, y);
+  core::num y_n_z = y.{core::num::clamp}(n, z);
+  core::num y_i_z = y.{core::num::clamp}(i, z);
+  core::num y_d_z = y.{core::num::clamp}(d, z);
+  core::num y_x_z = y.{core::num::clamp}(x, z);
+  core::num y_y_z = y.{core::num::clamp}(y, z);
+  core::num y_z_z = y.{core::num::clamp}(z, z);
+  core::num z_n_n = z.{core::num::clamp}(n, n);
+  core::num z_i_n = z.{core::num::clamp}(i, n);
+  core::num z_d_n = z.{core::num::clamp}(d, n);
+  core::num z_x_n = z.{core::num::clamp}(x, n);
+  core::num z_y_n = z.{core::num::clamp}(y, n);
+  core::num z_z_n = z.{core::num::clamp}(z, n);
+  core::num z_n_i = z.{core::num::clamp}(n, i);
+  core::num z_i_i = z.{core::num::clamp}(i, i);
+  core::num z_d_i = z.{core::num::clamp}(d, i);
+  core::num z_x_i = z.{core::num::clamp}(x, i);
+  core::num z_y_i = z.{core::num::clamp}(y, i);
+  core::num z_z_i = z.{core::num::clamp}(z, i);
+  core::num z_n_d = z.{core::num::clamp}(n, d);
+  core::num z_i_d = z.{core::num::clamp}(i, d);
+  core::double z_d_d = z.{core::num::clamp}(d, d);
+  core::num z_x_d = z.{core::num::clamp}(x, d);
+  core::num z_y_d = z.{core::num::clamp}(y, d);
+  core::double z_z_d = z.{core::num::clamp}(z, d);
+  core::num z_n_x = z.{core::num::clamp}(n, x);
+  core::num z_i_x = z.{core::num::clamp}(i, x);
+  core::num z_d_x = z.{core::num::clamp}(d, x);
+  core::num z_x_x = z.{core::num::clamp}(x, x);
+  core::num z_y_x = z.{core::num::clamp}(y, x);
+  core::num z_z_x = z.{core::num::clamp}(z, x);
+  core::num z_n_y = z.{core::num::clamp}(n, y);
+  core::num z_i_y = z.{core::num::clamp}(i, y);
+  core::num z_d_y = z.{core::num::clamp}(d, y);
+  core::num z_x_y = z.{core::num::clamp}(x, y);
+  core::num z_y_y = z.{core::num::clamp}(y, y);
+  core::num z_z_y = z.{core::num::clamp}(z, y);
+  core::num z_n_z = z.{core::num::clamp}(n, z);
+  core::num z_i_z = z.{core::num::clamp}(i, z);
+  core::double z_d_z = z.{core::num::clamp}(d, z);
+  core::num z_x_z = z.{core::num::clamp}(x, z);
+  core::num z_y_z = z.{core::num::clamp}(y, z);
+  core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(n);
+  core::num n_i = n.{core::num::+}(i);
+  core::double n_d = n.{core::num::+}(d);
+  core::num n_x = n.{core::num::+}(x);
+  core::num n_y = n.{core::num::+}(y);
+  core::double n_z = n.{core::num::+}(z);
+  core::num i_n = i.{core::num::+}(n);
+  core::int i_i = i.{core::num::+}(i);
+  core::double i_d = i.{core::num::+}(d);
+  core::num i_x = i.{core::num::+}(x);
+  core::int i_y = i.{core::num::+}(y);
+  core::double i_z = i.{core::num::+}(z);
+  core::double d_n = d.{core::double::+}(n);
+  core::double d_i = d.{core::double::+}(i);
+  core::double d_d = d.{core::double::+}(d);
+  core::double d_x = d.{core::double::+}(x);
+  core::double d_y = d.{core::double::+}(y);
+  core::double d_z = d.{core::double::+}(z);
+  core::num x_n = x.{core::num::+}(n);
+  core::num x_i = x.{core::num::+}(i);
+  core::double x_d = x.{core::num::+}(d);
+  core::num x_x = x.{core::num::+}(x);
+  core::num x_y = x.{core::num::+}(y);
+  core::double x_z = x.{core::num::+}(z);
+  core::num y_n = y.{core::num::+}(n);
+  core::int y_i = y.{core::num::+}(i);
+  core::double y_d = y.{core::num::+}(d);
+  core::num y_x = y.{core::num::+}(x);
+  core::int y_y = y.{core::num::+}(y);
+  core::double y_z = y.{core::num::+}(z);
+  core::double z_n = z.{core::double::+}(n);
+  core::double z_i = z.{core::double::+}(i);
+  core::double z_d = z.{core::double::+}(d);
+  core::double z_x = z.{core::double::+}(x);
+  core::double z_y = z.{core::double::+}(y);
+  core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(n);
+  core::num n_i = n.{core::num::-}(i);
+  core::double n_d = n.{core::num::-}(d);
+  core::num n_x = n.{core::num::-}(x);
+  core::num n_y = n.{core::num::-}(y);
+  core::double n_z = n.{core::num::-}(z);
+  core::num i_n = i.{core::num::-}(n);
+  core::int i_i = i.{core::num::-}(i);
+  core::double i_d = i.{core::num::-}(d);
+  core::num i_x = i.{core::num::-}(x);
+  core::int i_y = i.{core::num::-}(y);
+  core::double i_z = i.{core::num::-}(z);
+  core::double d_n = d.{core::double::-}(n);
+  core::double d_i = d.{core::double::-}(i);
+  core::double d_d = d.{core::double::-}(d);
+  core::double d_x = d.{core::double::-}(x);
+  core::double d_y = d.{core::double::-}(y);
+  core::double d_z = d.{core::double::-}(z);
+  core::num x_n = x.{core::num::-}(n);
+  core::num x_i = x.{core::num::-}(i);
+  core::double x_d = x.{core::num::-}(d);
+  core::num x_x = x.{core::num::-}(x);
+  core::num x_y = x.{core::num::-}(y);
+  core::double x_z = x.{core::num::-}(z);
+  core::num y_n = y.{core::num::-}(n);
+  core::int y_i = y.{core::num::-}(i);
+  core::double y_d = y.{core::num::-}(d);
+  core::num y_x = y.{core::num::-}(x);
+  core::int y_y = y.{core::num::-}(y);
+  core::double y_z = y.{core::num::-}(z);
+  core::double z_n = z.{core::double::-}(n);
+  core::double z_i = z.{core::double::-}(i);
+  core::double z_d = z.{core::double::-}(d);
+  core::double z_x = z.{core::double::-}(x);
+  core::double z_y = z.{core::double::-}(y);
+  core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(n);
+  core::num n_i = n.{core::num::*}(i);
+  core::double n_d = n.{core::num::*}(d);
+  core::num n_x = n.{core::num::*}(x);
+  core::num n_y = n.{core::num::*}(y);
+  core::double n_z = n.{core::num::*}(z);
+  core::num i_n = i.{core::num::*}(n);
+  core::int i_i = i.{core::num::*}(i);
+  core::double i_d = i.{core::num::*}(d);
+  core::num i_x = i.{core::num::*}(x);
+  core::int i_y = i.{core::num::*}(y);
+  core::double i_z = i.{core::num::*}(z);
+  core::double d_n = d.{core::double::*}(n);
+  core::double d_i = d.{core::double::*}(i);
+  core::double d_d = d.{core::double::*}(d);
+  core::double d_x = d.{core::double::*}(x);
+  core::double d_y = d.{core::double::*}(y);
+  core::double d_z = d.{core::double::*}(z);
+  core::num x_n = x.{core::num::*}(n);
+  core::num x_i = x.{core::num::*}(i);
+  core::double x_d = x.{core::num::*}(d);
+  core::num x_x = x.{core::num::*}(x);
+  core::num x_y = x.{core::num::*}(y);
+  core::double x_z = x.{core::num::*}(z);
+  core::num y_n = y.{core::num::*}(n);
+  core::int y_i = y.{core::num::*}(i);
+  core::double y_d = y.{core::num::*}(d);
+  core::num y_x = y.{core::num::*}(x);
+  core::int y_y = y.{core::num::*}(y);
+  core::double y_z = y.{core::num::*}(z);
+  core::double z_n = z.{core::double::*}(n);
+  core::double z_i = z.{core::double::*}(i);
+  core::double z_d = z.{core::double::*}(d);
+  core::double z_x = z.{core::double::*}(x);
+  core::double z_y = z.{core::double::*}(y);
+  core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(n);
+  core::num n_i = n.{core::num::%}(i);
+  core::double n_d = n.{core::num::%}(d);
+  core::num n_x = n.{core::num::%}(x);
+  core::num n_y = n.{core::num::%}(y);
+  core::double n_z = n.{core::num::%}(z);
+  core::num i_n = i.{core::num::%}(n);
+  core::int i_i = i.{core::num::%}(i);
+  core::double i_d = i.{core::num::%}(d);
+  core::num i_x = i.{core::num::%}(x);
+  core::int i_y = i.{core::num::%}(y);
+  core::double i_z = i.{core::num::%}(z);
+  core::double d_n = d.{core::double::%}(n);
+  core::double d_i = d.{core::double::%}(i);
+  core::double d_d = d.{core::double::%}(d);
+  core::double d_x = d.{core::double::%}(x);
+  core::double d_y = d.{core::double::%}(y);
+  core::double d_z = d.{core::double::%}(z);
+  core::num x_n = x.{core::num::%}(n);
+  core::num x_i = x.{core::num::%}(i);
+  core::double x_d = x.{core::num::%}(d);
+  core::num x_x = x.{core::num::%}(x);
+  core::num x_y = x.{core::num::%}(y);
+  core::double x_z = x.{core::num::%}(z);
+  core::num y_n = y.{core::num::%}(n);
+  core::int y_i = y.{core::num::%}(i);
+  core::double y_d = y.{core::num::%}(d);
+  core::num y_x = y.{core::num::%}(x);
+  core::int y_y = y.{core::num::%}(y);
+  core::double y_z = y.{core::num::%}(z);
+  core::double z_n = z.{core::double::%}(n);
+  core::double z_i = z.{core::double::%}(i);
+  core::double z_d = z.{core::double::%}(d);
+  core::double z_x = z.{core::double::%}(x);
+  core::double z_y = z.{core::double::%}(y);
+  core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(n);
+  core::num n_i = n.{core::num::remainder}(i);
+  core::double n_d = n.{core::num::remainder}(d);
+  core::num n_x = n.{core::num::remainder}(x);
+  core::num n_y = n.{core::num::remainder}(y);
+  core::double n_z = n.{core::num::remainder}(z);
+  core::num i_n = i.{core::num::remainder}(n);
+  core::int i_i = i.{core::num::remainder}(i);
+  core::double i_d = i.{core::num::remainder}(d);
+  core::num i_x = i.{core::num::remainder}(x);
+  core::int i_y = i.{core::num::remainder}(y);
+  core::double i_z = i.{core::num::remainder}(z);
+  core::double d_n = d.{core::double::remainder}(n);
+  core::double d_i = d.{core::double::remainder}(i);
+  core::double d_d = d.{core::double::remainder}(d);
+  core::double d_x = d.{core::double::remainder}(x);
+  core::double d_y = d.{core::double::remainder}(y);
+  core::double d_z = d.{core::double::remainder}(z);
+  core::num x_n = x.{core::num::remainder}(n);
+  core::num x_i = x.{core::num::remainder}(i);
+  core::double x_d = x.{core::num::remainder}(d);
+  core::num x_x = x.{core::num::remainder}(x);
+  core::num x_y = x.{core::num::remainder}(y);
+  core::double x_z = x.{core::num::remainder}(z);
+  core::num y_n = y.{core::num::remainder}(n);
+  core::int y_i = y.{core::num::remainder}(i);
+  core::double y_d = y.{core::num::remainder}(d);
+  core::num y_x = y.{core::num::remainder}(x);
+  core::int y_y = y.{core::num::remainder}(y);
+  core::double y_z = y.{core::num::remainder}(z);
+  core::double z_n = z.{core::double::remainder}(n);
+  core::double z_i = z.{core::double::remainder}(i);
+  core::double z_d = z.{core::double::remainder}(d);
+  core::double z_x = z.{core::double::remainder}(x);
+  core::double z_y = z.{core::double::remainder}(y);
+  core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n_n = n.{core::num::clamp}(n, n);
+  core::num n_i_n = n.{core::num::clamp}(i, n);
+  core::num n_d_n = n.{core::num::clamp}(d, n);
+  core::num n_x_n = n.{core::num::clamp}(x, n);
+  core::num n_y_n = n.{core::num::clamp}(y, n);
+  core::num n_z_n = n.{core::num::clamp}(z, n);
+  core::num n_n_i = n.{core::num::clamp}(n, i);
+  core::num n_i_i = n.{core::num::clamp}(i, i);
+  core::num n_d_i = n.{core::num::clamp}(d, i);
+  core::num n_x_i = n.{core::num::clamp}(x, i);
+  core::num n_y_i = n.{core::num::clamp}(y, i);
+  core::num n_z_i = n.{core::num::clamp}(z, i);
+  core::num n_n_d = n.{core::num::clamp}(n, d);
+  core::num n_i_d = n.{core::num::clamp}(i, d);
+  core::num n_d_d = n.{core::num::clamp}(d, d);
+  core::num n_x_d = n.{core::num::clamp}(x, d);
+  core::num n_y_d = n.{core::num::clamp}(y, d);
+  core::num n_z_d = n.{core::num::clamp}(z, d);
+  core::num n_n_x = n.{core::num::clamp}(n, x);
+  core::num n_i_x = n.{core::num::clamp}(i, x);
+  core::num n_d_x = n.{core::num::clamp}(d, x);
+  core::num n_x_x = n.{core::num::clamp}(x, x);
+  core::num n_y_x = n.{core::num::clamp}(y, x);
+  core::num n_z_x = n.{core::num::clamp}(z, x);
+  core::num n_n_y = n.{core::num::clamp}(n, y);
+  core::num n_i_y = n.{core::num::clamp}(i, y);
+  core::num n_d_y = n.{core::num::clamp}(d, y);
+  core::num n_x_y = n.{core::num::clamp}(x, y);
+  core::num n_y_y = n.{core::num::clamp}(y, y);
+  core::num n_z_y = n.{core::num::clamp}(z, y);
+  core::num n_n_z = n.{core::num::clamp}(n, z);
+  core::num n_i_z = n.{core::num::clamp}(i, z);
+  core::num n_d_z = n.{core::num::clamp}(d, z);
+  core::num n_x_z = n.{core::num::clamp}(x, z);
+  core::num n_y_z = n.{core::num::clamp}(y, z);
+  core::num n_z_z = n.{core::num::clamp}(z, z);
+  core::num i_n_n = i.{core::num::clamp}(n, n);
+  core::num i_i_n = i.{core::num::clamp}(i, n);
+  core::num i_d_n = i.{core::num::clamp}(d, n);
+  core::num i_x_n = i.{core::num::clamp}(x, n);
+  core::num i_y_n = i.{core::num::clamp}(y, n);
+  core::num i_z_n = i.{core::num::clamp}(z, n);
+  core::num i_n_i = i.{core::num::clamp}(n, i);
+  core::int i_i_i = i.{core::num::clamp}(i, i);
+  core::num i_d_i = i.{core::num::clamp}(d, i);
+  core::num i_x_i = i.{core::num::clamp}(x, i);
+  core::int i_y_i = i.{core::num::clamp}(y, i);
+  core::num i_z_i = i.{core::num::clamp}(z, i);
+  core::num i_n_d = i.{core::num::clamp}(n, d);
+  core::num i_i_d = i.{core::num::clamp}(i, d);
+  core::num i_d_d = i.{core::num::clamp}(d, d);
+  core::num i_x_d = i.{core::num::clamp}(x, d);
+  core::num i_y_d = i.{core::num::clamp}(y, d);
+  core::num i_z_d = i.{core::num::clamp}(z, d);
+  core::num i_n_x = i.{core::num::clamp}(n, x);
+  core::num i_i_x = i.{core::num::clamp}(i, x);
+  core::num i_d_x = i.{core::num::clamp}(d, x);
+  core::num i_x_x = i.{core::num::clamp}(x, x);
+  core::num i_y_x = i.{core::num::clamp}(y, x);
+  core::num i_z_x = i.{core::num::clamp}(z, x);
+  core::num i_n_y = i.{core::num::clamp}(n, y);
+  core::int i_i_y = i.{core::num::clamp}(i, y);
+  core::num i_d_y = i.{core::num::clamp}(d, y);
+  core::num i_x_y = i.{core::num::clamp}(x, y);
+  core::int i_y_y = i.{core::num::clamp}(y, y);
+  core::num i_z_y = i.{core::num::clamp}(z, y);
+  core::num i_n_z = i.{core::num::clamp}(n, z);
+  core::num i_i_z = i.{core::num::clamp}(i, z);
+  core::num i_d_z = i.{core::num::clamp}(d, z);
+  core::num i_x_z = i.{core::num::clamp}(x, z);
+  core::num i_y_z = i.{core::num::clamp}(y, z);
+  core::num i_z_z = i.{core::num::clamp}(z, z);
+  core::num d_n_n = d.{core::num::clamp}(n, n);
+  core::num d_i_n = d.{core::num::clamp}(i, n);
+  core::num d_d_n = d.{core::num::clamp}(d, n);
+  core::num d_x_n = d.{core::num::clamp}(x, n);
+  core::num d_y_n = d.{core::num::clamp}(y, n);
+  core::num d_z_n = d.{core::num::clamp}(z, n);
+  core::num d_n_i = d.{core::num::clamp}(n, i);
+  core::num d_i_i = d.{core::num::clamp}(i, i);
+  core::num d_d_i = d.{core::num::clamp}(d, i);
+  core::num d_x_i = d.{core::num::clamp}(x, i);
+  core::num d_y_i = d.{core::num::clamp}(y, i);
+  core::num d_z_i = d.{core::num::clamp}(z, i);
+  core::num d_n_d = d.{core::num::clamp}(n, d);
+  core::num d_i_d = d.{core::num::clamp}(i, d);
+  core::double d_d_d = d.{core::num::clamp}(d, d);
+  core::num d_x_d = d.{core::num::clamp}(x, d);
+  core::num d_y_d = d.{core::num::clamp}(y, d);
+  core::double d_z_d = d.{core::num::clamp}(z, d);
+  core::num d_n_x = d.{core::num::clamp}(n, x);
+  core::num d_i_x = d.{core::num::clamp}(i, x);
+  core::num d_d_x = d.{core::num::clamp}(d, x);
+  core::num d_x_x = d.{core::num::clamp}(x, x);
+  core::num d_y_x = d.{core::num::clamp}(y, x);
+  core::num d_z_x = d.{core::num::clamp}(z, x);
+  core::num d_n_y = d.{core::num::clamp}(n, y);
+  core::num d_i_y = d.{core::num::clamp}(i, y);
+  core::num d_d_y = d.{core::num::clamp}(d, y);
+  core::num d_x_y = d.{core::num::clamp}(x, y);
+  core::num d_y_y = d.{core::num::clamp}(y, y);
+  core::num d_z_y = d.{core::num::clamp}(z, y);
+  core::num d_n_z = d.{core::num::clamp}(n, z);
+  core::num d_i_z = d.{core::num::clamp}(i, z);
+  core::double d_d_z = d.{core::num::clamp}(d, z);
+  core::num d_x_z = d.{core::num::clamp}(x, z);
+  core::num d_y_z = d.{core::num::clamp}(y, z);
+  core::double d_z_z = d.{core::num::clamp}(z, z);
+  core::num x_n_n = x.{core::num::clamp}(n, n);
+  core::num x_i_n = x.{core::num::clamp}(i, n);
+  core::num x_d_n = x.{core::num::clamp}(d, n);
+  core::num x_x_n = x.{core::num::clamp}(x, n);
+  core::num x_y_n = x.{core::num::clamp}(y, n);
+  core::num x_z_n = x.{core::num::clamp}(z, n);
+  core::num x_n_i = x.{core::num::clamp}(n, i);
+  core::num x_i_i = x.{core::num::clamp}(i, i);
+  core::num x_d_i = x.{core::num::clamp}(d, i);
+  core::num x_x_i = x.{core::num::clamp}(x, i);
+  core::num x_y_i = x.{core::num::clamp}(y, i);
+  core::num x_z_i = x.{core::num::clamp}(z, i);
+  core::num x_n_d = x.{core::num::clamp}(n, d);
+  core::num x_i_d = x.{core::num::clamp}(i, d);
+  core::num x_d_d = x.{core::num::clamp}(d, d);
+  core::num x_x_d = x.{core::num::clamp}(x, d);
+  core::num x_y_d = x.{core::num::clamp}(y, d);
+  core::num x_z_d = x.{core::num::clamp}(z, d);
+  core::num x_n_x = x.{core::num::clamp}(n, x);
+  core::num x_i_x = x.{core::num::clamp}(i, x);
+  core::num x_d_x = x.{core::num::clamp}(d, x);
+  core::num x_x_x = x.{core::num::clamp}(x, x);
+  core::num x_y_x = x.{core::num::clamp}(y, x);
+  core::num x_z_x = x.{core::num::clamp}(z, x);
+  core::num x_n_y = x.{core::num::clamp}(n, y);
+  core::num x_i_y = x.{core::num::clamp}(i, y);
+  core::num x_d_y = x.{core::num::clamp}(d, y);
+  core::num x_x_y = x.{core::num::clamp}(x, y);
+  core::num x_y_y = x.{core::num::clamp}(y, y);
+  core::num x_z_y = x.{core::num::clamp}(z, y);
+  core::num x_n_z = x.{core::num::clamp}(n, z);
+  core::num x_i_z = x.{core::num::clamp}(i, z);
+  core::num x_d_z = x.{core::num::clamp}(d, z);
+  core::num x_x_z = x.{core::num::clamp}(x, z);
+  core::num x_y_z = x.{core::num::clamp}(y, z);
+  core::num x_z_z = x.{core::num::clamp}(z, z);
+  core::num y_n_n = y.{core::num::clamp}(n, n);
+  core::num y_i_n = y.{core::num::clamp}(i, n);
+  core::num y_d_n = y.{core::num::clamp}(d, n);
+  core::num y_x_n = y.{core::num::clamp}(x, n);
+  core::num y_y_n = y.{core::num::clamp}(y, n);
+  core::num y_z_n = y.{core::num::clamp}(z, n);
+  core::num y_n_i = y.{core::num::clamp}(n, i);
+  core::int y_i_i = y.{core::num::clamp}(i, i);
+  core::num y_d_i = y.{core::num::clamp}(d, i);
+  core::num y_x_i = y.{core::num::clamp}(x, i);
+  core::int y_y_i = y.{core::num::clamp}(y, i);
+  core::num y_z_i = y.{core::num::clamp}(z, i);
+  core::num y_n_d = y.{core::num::clamp}(n, d);
+  core::num y_i_d = y.{core::num::clamp}(i, d);
+  core::num y_d_d = y.{core::num::clamp}(d, d);
+  core::num y_x_d = y.{core::num::clamp}(x, d);
+  core::num y_y_d = y.{core::num::clamp}(y, d);
+  core::num y_z_d = y.{core::num::clamp}(z, d);
+  core::num y_n_x = y.{core::num::clamp}(n, x);
+  core::num y_i_x = y.{core::num::clamp}(i, x);
+  core::num y_d_x = y.{core::num::clamp}(d, x);
+  core::num y_x_x = y.{core::num::clamp}(x, x);
+  core::num y_y_x = y.{core::num::clamp}(y, x);
+  core::num y_z_x = y.{core::num::clamp}(z, x);
+  core::num y_n_y = y.{core::num::clamp}(n, y);
+  core::int y_i_y = y.{core::num::clamp}(i, y);
+  core::num y_d_y = y.{core::num::clamp}(d, y);
+  core::num y_x_y = y.{core::num::clamp}(x, y);
+  core::int y_y_y = y.{core::num::clamp}(y, y);
+  core::num y_z_y = y.{core::num::clamp}(z, y);
+  core::num y_n_z = y.{core::num::clamp}(n, z);
+  core::num y_i_z = y.{core::num::clamp}(i, z);
+  core::num y_d_z = y.{core::num::clamp}(d, z);
+  core::num y_x_z = y.{core::num::clamp}(x, z);
+  core::num y_y_z = y.{core::num::clamp}(y, z);
+  core::num y_z_z = y.{core::num::clamp}(z, z);
+  core::num z_n_n = z.{core::num::clamp}(n, n);
+  core::num z_i_n = z.{core::num::clamp}(i, n);
+  core::num z_d_n = z.{core::num::clamp}(d, n);
+  core::num z_x_n = z.{core::num::clamp}(x, n);
+  core::num z_y_n = z.{core::num::clamp}(y, n);
+  core::num z_z_n = z.{core::num::clamp}(z, n);
+  core::num z_n_i = z.{core::num::clamp}(n, i);
+  core::num z_i_i = z.{core::num::clamp}(i, i);
+  core::num z_d_i = z.{core::num::clamp}(d, i);
+  core::num z_x_i = z.{core::num::clamp}(x, i);
+  core::num z_y_i = z.{core::num::clamp}(y, i);
+  core::num z_z_i = z.{core::num::clamp}(z, i);
+  core::num z_n_d = z.{core::num::clamp}(n, d);
+  core::num z_i_d = z.{core::num::clamp}(i, d);
+  core::double z_d_d = z.{core::num::clamp}(d, d);
+  core::num z_x_d = z.{core::num::clamp}(x, d);
+  core::num z_y_d = z.{core::num::clamp}(y, d);
+  core::double z_z_d = z.{core::num::clamp}(z, d);
+  core::num z_n_x = z.{core::num::clamp}(n, x);
+  core::num z_i_x = z.{core::num::clamp}(i, x);
+  core::num z_d_x = z.{core::num::clamp}(d, x);
+  core::num z_x_x = z.{core::num::clamp}(x, x);
+  core::num z_y_x = z.{core::num::clamp}(y, x);
+  core::num z_z_x = z.{core::num::clamp}(z, x);
+  core::num z_n_y = z.{core::num::clamp}(n, y);
+  core::num z_i_y = z.{core::num::clamp}(i, y);
+  core::num z_d_y = z.{core::num::clamp}(d, y);
+  core::num z_x_y = z.{core::num::clamp}(x, y);
+  core::num z_y_y = z.{core::num::clamp}(y, y);
+  core::num z_z_y = z.{core::num::clamp}(z, y);
+  core::num z_n_z = z.{core::num::clamp}(n, z);
+  core::num z_i_z = z.{core::num::clamp}(i, z);
+  core::double z_d_z = z.{core::num::clamp}(d, z);
+  core::num z_x_z = z.{core::num::clamp}(x, z);
+  core::num z_y_z = z.{core::num::clamp}(y, z);
+  core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart b/pkg/front_end/testcases/nnbd/numbers_inferred.dart
new file mode 100644
index 0000000..f2a9f12
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart
@@ -0,0 +1,277 @@
+// 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.
+
+T f<T>() => throw 'Unsupported';
+
+add<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  num n_n = n + f();
+  int n_i = n + f();
+  double n_d = n + f();
+  X n_x = n + f();
+  Y n_y = n + f();
+  Z n_z = n + f();
+
+  num i_n = i + f();
+  int i_i = i + f();
+  double i_d = i + f();
+  X i_x = i + f();
+  Y i_y = i + f();
+  Z i_z = i + f();
+
+  num d_n = d + f();
+  int d_i = d + f();
+  double d_d = d + f();
+  X d_x = d + f();
+  Y d_y = d + f();
+  Z d_z = d + f();
+
+  num x_n = x + f();
+  int x_i = x + f();
+  double x_d = x + f();
+  X x_x = x + f();
+  Y x_y = x + f();
+  Z x_z = x + f();
+
+  num y_n = y + f();
+  int y_i = y + f();
+  double y_d = y + f();
+  X y_x = y + f();
+  Y y_y = y + f();
+  Z y_z = y + f();
+
+  num z_n = z + f();
+  int z_i = z + f();
+  double z_d = z + f();
+  X z_x = z + f();
+  Y z_y = z + f();
+  Z z_z = z + f();
+}
+
+sub<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  num n_n = n - f();
+  int n_i = n - f();
+  double n_d = n - f();
+  X n_x = n - f();
+  Y n_y = n - f();
+  Z n_z = n - f();
+
+  num i_n = i - f();
+  int i_i = i - f();
+  double i_d = i - f();
+  X i_x = i - f();
+  Y i_y = i - f();
+  Z i_z = i - f();
+
+  num d_n = d - f();
+  int d_i = d - f();
+  double d_d = d - f();
+  X d_x = d - f();
+  Y d_y = d - f();
+  Z d_z = d - f();
+
+  num x_n = x - f();
+  int x_i = x - f();
+  double x_d = x - f();
+  X x_x = x - f();
+  Y x_y = x - f();
+  Z x_z = x - f();
+
+  num y_n = y - f();
+  int y_i = y - f();
+  double y_d = y - f();
+  X y_x = y - f();
+  Y y_y = y - f();
+  Z y_z = y - f();
+
+  num z_n = z - f();
+  int z_i = z - f();
+  double z_d = z - f();
+  X z_x = z - f();
+  Y z_y = z - f();
+  Z z_z = z - f();
+}
+
+mul<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  num n_n = n * f();
+  int n_i = n * f();
+  double n_d = n * f();
+  X n_x = n * f();
+  Y n_y = n * f();
+  Z n_z = n * f();
+
+  num i_n = i * f();
+  int i_i = i * f();
+  double i_d = i * f();
+  X i_x = i * f();
+  Y i_y = i * f();
+  Z i_z = i * f();
+
+  num d_n = d * f();
+  int d_i = d * f();
+  double d_d = d * f();
+  X d_x = d * f();
+  Y d_y = d * f();
+  Z d_z = d * f();
+
+  num x_n = x * f();
+  int x_i = x * f();
+  double x_d = x * f();
+  X x_x = x * f();
+  Y x_y = x * f();
+  Z x_z = x * f();
+
+  num y_n = y * f();
+  int y_i = y * f();
+  double y_d = y * f();
+  X y_x = y * f();
+  Y y_y = y * f();
+  Z y_z = y * f();
+
+  num z_n = z * f();
+  int z_i = z * f();
+  double z_d = z * f();
+  X z_x = z * f();
+  Y z_y = z * f();
+  Z z_z = z * f();
+}
+
+mod<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  num n_n = n % f();
+  int n_i = n % f();
+  double n_d = n % f();
+  X n_x = n % f();
+  Y n_y = n % f();
+  Z n_z = n % f();
+
+  num i_n = i % f();
+  int i_i = i % f();
+  double i_d = i % f();
+  X i_x = i % f();
+  Y i_y = i % f();
+  Z i_z = i % f();
+
+  num d_n = d % f();
+  int d_i = d % f();
+  double d_d = d % f();
+  X d_x = d % f();
+  Y d_y = d % f();
+  Z d_z = d % f();
+
+  num x_n = x % f();
+  int x_i = x % f();
+  double x_d = x % f();
+  X x_x = x % f();
+  Y x_y = x % f();
+  Z x_z = x % f();
+
+  num y_n = y % f();
+  int y_i = y % f();
+  double y_d = y % f();
+  X y_x = y % f();
+  Y y_y = y % f();
+  Z y_z = y % f();
+
+  num z_n = z % f();
+  int z_i = z % f();
+  double z_d = z % f();
+  X z_x = z % f();
+  Y z_y = z % f();
+  Z z_z = z % f();
+}
+
+remainder<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n = n.remainder(f());
+  int n_i = n.remainder(f());
+  double n_d = n.remainder(f());
+  X n_x = n.remainder(f());
+  Y n_y = n.remainder(f());
+  Z n_z = n.remainder(f());
+
+  num i_n = i.remainder(f());
+  int i_i = i.remainder(f());
+  double i_d = i.remainder(f());
+  X i_x = i.remainder(f());
+  Y i_y = i.remainder(f());
+  Z i_z = i.remainder(f());
+
+  var d_n = d.remainder(f());
+  int d_i = d.remainder(f());
+  double d_d = d.remainder(f());
+  X d_x = d.remainder(f());
+  Y d_y = d.remainder(f());
+  Z d_z = d.remainder(f());
+
+  var x_n = x.remainder(f());
+  int x_i = x.remainder(f());
+  double x_d = x.remainder(f());
+  X x_x = x.remainder(f());
+  Y x_y = x.remainder(f());
+  Z x_z = x.remainder(f());
+
+  var y_n = y.remainder(f());
+  int y_i = y.remainder(f());
+  double y_d = y.remainder(f());
+  X y_x = y.remainder(f());
+  Y y_y = y.remainder(f());
+  Z y_z = y.remainder(f());
+
+  var z_n = z.remainder(f());
+  int z_i = z.remainder(f());
+  double z_d = z.remainder(f());
+  X z_x = z.remainder(f());
+  Y z_y = z.remainder(f());
+  Z z_z = z.remainder(f());
+}
+
+clamp<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {
+  var n_n = n.clamp(f(), f());
+  int n_i = n.clamp(f(), f());
+  double n_d = n.clamp(f(), f());
+  X n_x = n.clamp(f(), f());
+  Y n_y = n.clamp(f(), f());
+  Z n_z = n.clamp(f(), f());
+
+  num i_n = i.clamp(f(), f());
+  int i_i = i.clamp(f(), f());
+  double i_d = i.clamp(f(), f());
+  X i_x = i.clamp(f(), f());
+  Y i_y = i.clamp(f(), f());
+  Z i_z = i.clamp(f(), f());
+
+  var d_n = d.clamp(f(), f());
+  int d_i = d.clamp(f(), f());
+  double d_d = d.clamp(f(), f());
+  X d_x = d.clamp(f(), f());
+  Y d_y = d.clamp(f(), f());
+  Z d_z = d.clamp(f(), f());
+
+  var x_n = x.clamp(f(), f());
+  int x_i = x.clamp(f(), f());
+  double x_d = x.clamp(f(), f());
+  X x_x = x.clamp(f(), f());
+  Y x_y = x.clamp(f(), f());
+  Z x_z = x.clamp(f(), f());
+
+  var y_n = y.clamp(f(), f());
+  int y_i = y.clamp(f(), f());
+  double y_d = y.clamp(f(), f());
+  X y_x = y.clamp(f(), f());
+  Y y_y = y.clamp(f(), f());
+  Z y_z = y.clamp(f(), f());
+
+  var z_n = z.clamp(f(), f());
+  int z_i = z.clamp(f(), f());
+  double z_d = z.clamp(f(), f());
+  X z_x = z.clamp(f(), f());
+  Y z_y = z.clamp(f(), f());
+  Z z_z = z.clamp(f(), f());
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.outline.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.outline.expect
new file mode 100644
index 0000000..8160ab1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+  ;
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
+  ;
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
+  ;
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
+  ;
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
+  ;
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
+  ;
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double n_d = n.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double i_d = i.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int d_i = d.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X d_x = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double x_d = x.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double y_d = y.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int z_i = z.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X z_x = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.clamp(f(), f());
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+  return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n + f();
+              ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::+}(self::f<core::double>());
+  self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::+}(self::f<core::num>());
+  core::int i_i = i.{core::num::+}(self::f<core::int>());
+  core::double i_d = i.{core::num::+}(self::f<core::double>());
+  self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::+}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d + f();
+              ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::+}(self::f<core::num>());
+  self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::+}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x + f();
+              ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::+}(self::f<core::double>());
+  self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::+}(self::f<core::num>());
+  core::int y_i = y.{core::num::+}(self::f<core::int>());
+  core::double y_d = y.{core::num::+}(self::f<core::double>());
+  self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::+}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z + f();
+              ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::+}(self::f<core::num>());
+  self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n - f();
+              ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::-}(self::f<core::double>());
+  self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::-}(self::f<core::num>());
+  core::int i_i = i.{core::num::-}(self::f<core::int>());
+  core::double i_d = i.{core::num::-}(self::f<core::double>());
+  self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::-}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d - f();
+              ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::-}(self::f<core::num>());
+  self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::-}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x - f();
+              ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::-}(self::f<core::double>());
+  self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::-}(self::f<core::num>());
+  core::int y_i = y.{core::num::-}(self::f<core::int>());
+  core::double y_d = y.{core::num::-}(self::f<core::double>());
+  self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::-}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z - f();
+              ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::-}(self::f<core::num>());
+  self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n * f();
+              ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::*}(self::f<core::double>());
+  self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::*}(self::f<core::num>());
+  core::int i_i = i.{core::num::*}(self::f<core::int>());
+  core::double i_d = i.{core::num::*}(self::f<core::double>());
+  self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::*}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d * f();
+              ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::*}(self::f<core::num>());
+  self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::*}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x * f();
+              ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::*}(self::f<core::double>());
+  self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::*}(self::f<core::num>());
+  core::int y_i = y.{core::num::*}(self::f<core::int>());
+  core::double y_d = y.{core::num::*}(self::f<core::double>());
+  self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::*}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z * f();
+              ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::*}(self::f<core::num>());
+  self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n % f();
+              ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::%}(self::f<core::double>());
+  self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::%}(self::f<core::num>());
+  core::int i_i = i.{core::num::%}(self::f<core::int>());
+  core::double i_d = i.{core::num::%}(self::f<core::double>());
+  self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::%}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d % f();
+              ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::%}(self::f<core::num>());
+  self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::%}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x % f();
+              ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::%}(self::f<core::double>());
+  self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::%}(self::f<core::num>());
+  core::int y_i = y.{core::num::%}(self::f<core::int>());
+  core::double y_d = y.{core::num::%}(self::f<core::double>());
+  self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::%}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z % f();
+              ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::%}(self::f<core::num>());
+  self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.remainder(f());
+              ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+  core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+  core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d.remainder(f());
+              ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.remainder(f());
+              ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+  core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+  core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z.remainder(f());
+              ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.clamp(f(), f());
+              ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double n_d = n.clamp(f(), f());
+                 ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double i_d = i.clamp(f(), f());
+                 ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int d_i = d.clamp(f(), f());
+              ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X d_x = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.clamp(f(), f());
+              ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double x_d = x.clamp(f(), f());
+                 ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double y_d = y.clamp(f(), f());
+                 ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int z_i = z.clamp(f(), f());
+              ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X z_x = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double n_d = n.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double i_d = i.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int d_i = d.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X d_x = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double x_d = x.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double y_d = y.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int z_i = z.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X z_x = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.clamp(f(), f());
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+  return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n + f();
+              ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::+}(self::f<core::double>());
+  self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::+}(self::f<core::num>());
+  core::int i_i = i.{core::num::+}(self::f<core::int>());
+  core::double i_d = i.{core::num::+}(self::f<core::double>());
+  self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::+}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d + f();
+              ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::+}(self::f<core::num>());
+  self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::+}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x + f();
+              ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::+}(self::f<core::double>());
+  self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::+}(self::f<core::num>());
+  core::int y_i = y.{core::num::+}(self::f<core::int>());
+  core::double y_d = y.{core::num::+}(self::f<core::double>());
+  self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::+}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z + f();
+              ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::+}(self::f<core::num>());
+  self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n - f();
+              ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::-}(self::f<core::double>());
+  self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::-}(self::f<core::num>());
+  core::int i_i = i.{core::num::-}(self::f<core::int>());
+  core::double i_d = i.{core::num::-}(self::f<core::double>());
+  self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::-}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d - f();
+              ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::-}(self::f<core::num>());
+  self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::-}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x - f();
+              ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::-}(self::f<core::double>());
+  self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::-}(self::f<core::num>());
+  core::int y_i = y.{core::num::-}(self::f<core::int>());
+  core::double y_d = y.{core::num::-}(self::f<core::double>());
+  self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::-}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z - f();
+              ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::-}(self::f<core::num>());
+  self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n * f();
+              ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::*}(self::f<core::double>());
+  self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::*}(self::f<core::num>());
+  core::int i_i = i.{core::num::*}(self::f<core::int>());
+  core::double i_d = i.{core::num::*}(self::f<core::double>());
+  self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::*}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d * f();
+              ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::*}(self::f<core::num>());
+  self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::*}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x * f();
+              ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::*}(self::f<core::double>());
+  self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::*}(self::f<core::num>());
+  core::int y_i = y.{core::num::*}(self::f<core::int>());
+  core::double y_d = y.{core::num::*}(self::f<core::double>());
+  self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::*}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z * f();
+              ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::*}(self::f<core::num>());
+  self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n % f();
+              ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::%}(self::f<core::double>());
+  self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::%}(self::f<core::num>());
+  core::int i_i = i.{core::num::%}(self::f<core::int>());
+  core::double i_d = i.{core::num::%}(self::f<core::double>());
+  self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::%}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d % f();
+              ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::%}(self::f<core::num>());
+  self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::%}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x % f();
+              ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::%}(self::f<core::double>());
+  self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::%}(self::f<core::num>());
+  core::int y_i = y.{core::num::%}(self::f<core::int>());
+  core::double y_d = y.{core::num::%}(self::f<core::double>());
+  self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::%}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z % f();
+              ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::%}(self::f<core::num>());
+  self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.remainder(f());
+              ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+  core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+  core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d.remainder(f());
+              ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.remainder(f());
+              ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+  core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+  core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z.remainder(f());
+              ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.clamp(f(), f());
+              ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double n_d = n.clamp(f(), f());
+                 ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double i_d = i.clamp(f(), f());
+                 ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int d_i = d.clamp(f(), f());
+              ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X d_x = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.clamp(f(), f());
+              ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double x_d = x.clamp(f(), f());
+                 ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double y_d = y.clamp(f(), f());
+                 ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int z_i = z.clamp(f(), f());
+              ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X z_x = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline.expect
new file mode 100644
index 0000000..5828a2d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+T f<T>() => throw 'Unsupported';
+add<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+mod<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..425ac61
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+T f<T>() => throw 'Unsupported';
+add<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+main() {}
+mod<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+    num n, int i, double d, X x, Y y, Z z) {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double n_d = n.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double i_d = i.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int d_i = d.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X d_x = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double x_d = x.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double y_d = y.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int z_i = z.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X z_x = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.clamp(f(), f());
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+  return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n + f();
+              ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::+}(self::f<core::double>());
+  self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::+}(self::f<core::num>());
+  core::int i_i = i.{core::num::+}(self::f<core::int>());
+  core::double i_d = i.{core::num::+}(self::f<core::double>());
+  self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::+}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d + f();
+              ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::+}(self::f<core::num>());
+  self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::+}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x + f();
+              ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::+}(self::f<core::double>());
+  self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::+}(self::f<core::num>());
+  core::int y_i = y.{core::num::+}(self::f<core::int>());
+  core::double y_d = y.{core::num::+}(self::f<core::double>());
+  self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::+}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z + f();
+              ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::+}(self::f<core::num>());
+  self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n - f();
+              ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::-}(self::f<core::double>());
+  self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::-}(self::f<core::num>());
+  core::int i_i = i.{core::num::-}(self::f<core::int>());
+  core::double i_d = i.{core::num::-}(self::f<core::double>());
+  self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::-}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d - f();
+              ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::-}(self::f<core::num>());
+  self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::-}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x - f();
+              ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::-}(self::f<core::double>());
+  self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::-}(self::f<core::num>());
+  core::int y_i = y.{core::num::-}(self::f<core::int>());
+  core::double y_d = y.{core::num::-}(self::f<core::double>());
+  self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::-}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z - f();
+              ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::-}(self::f<core::num>());
+  self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n * f();
+              ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::*}(self::f<core::double>());
+  self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::*}(self::f<core::num>());
+  core::int i_i = i.{core::num::*}(self::f<core::int>());
+  core::double i_d = i.{core::num::*}(self::f<core::double>());
+  self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::*}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d * f();
+              ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::*}(self::f<core::num>());
+  self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::*}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x * f();
+              ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::*}(self::f<core::double>());
+  self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::*}(self::f<core::num>());
+  core::int y_i = y.{core::num::*}(self::f<core::int>());
+  core::double y_d = y.{core::num::*}(self::f<core::double>());
+  self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::*}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z * f();
+              ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::*}(self::f<core::num>());
+  self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n % f();
+              ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::%}(self::f<core::double>());
+  self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::%}(self::f<core::num>());
+  core::int i_i = i.{core::num::%}(self::f<core::int>());
+  core::double i_d = i.{core::num::%}(self::f<core::double>());
+  self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::%}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d % f();
+              ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::%}(self::f<core::num>());
+  self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::%}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x % f();
+              ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::%}(self::f<core::double>());
+  self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::%}(self::f<core::num>());
+  core::int y_i = y.{core::num::%}(self::f<core::int>());
+  core::double y_d = y.{core::num::%}(self::f<core::double>());
+  self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::%}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z % f();
+              ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::%}(self::f<core::num>());
+  self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.remainder(f());
+              ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+  core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+  core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d.remainder(f());
+              ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.remainder(f());
+              ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+  core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+  core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z.remainder(f());
+              ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.clamp(f(), f());
+              ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double n_d = n.clamp(f(), f());
+                 ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double i_d = i.clamp(f(), f());
+                 ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int d_i = d.clamp(f(), f());
+              ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X d_x = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.clamp(f(), f());
+              ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double x_d = x.clamp(f(), f());
+                 ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double y_d = y.clamp(f(), f());
+                 ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int z_i = z.clamp(f(), f());
+              ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X z_x = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double n_d = n.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double i_d = i.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int d_i = d.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X d_x = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double x_d = x.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double y_d = y.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int z_i = z.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X z_x = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.clamp(f(), f());
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+  return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n + f();
+              ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::+}(self::f<core::double>());
+  self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::+}(self::f<core::num>());
+  core::int i_i = i.{core::num::+}(self::f<core::int>());
+  core::double i_d = i.{core::num::+}(self::f<core::double>());
+  self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::+}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d + f();
+              ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::+}(self::f<core::num>());
+  self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::+}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x + f();
+              ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::+}(self::f<core::double>());
+  self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::+}(self::f<core::num>());
+  core::int y_i = y.{core::num::+}(self::f<core::int>());
+  core::double y_d = y.{core::num::+}(self::f<core::double>());
+  self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::+}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z + f();
+              ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::+}(self::f<core::num>());
+  self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n - f();
+              ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::-}(self::f<core::double>());
+  self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::-}(self::f<core::num>());
+  core::int i_i = i.{core::num::-}(self::f<core::int>());
+  core::double i_d = i.{core::num::-}(self::f<core::double>());
+  self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::-}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d - f();
+              ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::-}(self::f<core::num>());
+  self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::-}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x - f();
+              ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::-}(self::f<core::double>());
+  self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::-}(self::f<core::num>());
+  core::int y_i = y.{core::num::-}(self::f<core::int>());
+  core::double y_d = y.{core::num::-}(self::f<core::double>());
+  self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::-}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z - f();
+              ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::-}(self::f<core::num>());
+  self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n * f();
+              ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::*}(self::f<core::double>());
+  self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::*}(self::f<core::num>());
+  core::int i_i = i.{core::num::*}(self::f<core::int>());
+  core::double i_d = i.{core::num::*}(self::f<core::double>());
+  self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::*}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d * f();
+              ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::*}(self::f<core::num>());
+  self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::*}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x * f();
+              ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::*}(self::f<core::double>());
+  self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::*}(self::f<core::num>());
+  core::int y_i = y.{core::num::*}(self::f<core::int>());
+  core::double y_d = y.{core::num::*}(self::f<core::double>());
+  self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::*}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z * f();
+              ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::*}(self::f<core::num>());
+  self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n % f();
+              ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::%}(self::f<core::double>());
+  self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::%}(self::f<core::num>());
+  core::int i_i = i.{core::num::%}(self::f<core::int>());
+  core::double i_d = i.{core::num::%}(self::f<core::double>());
+  self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::double::%}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d % f();
+              ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::%}(self::f<core::num>());
+  self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::%}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x % f();
+              ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::%}(self::f<core::double>());
+  self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::%}(self::f<core::num>());
+  core::int y_i = y.{core::num::%}(self::f<core::int>());
+  core::double y_d = y.{core::num::%}(self::f<core::double>());
+  self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::double::%}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z % f();
+              ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::%}(self::f<core::num>());
+  self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+  core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.remainder(f());
+              ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+  core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+  core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+  core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d.remainder(f());
+              ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+  core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.remainder(f());
+              ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+  core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+  core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+  self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+  core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z.remainder(f());
+              ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+  self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.clamp(f(), f());
+              ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double n_d = n.clamp(f(), f());
+                 ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double i_d = i.clamp(f(), f());
+                 ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int d_i = d.clamp(f(), f());
+              ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X d_x = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.clamp(f(), f());
+              ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double x_d = x.clamp(f(), f());
+                 ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+  core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double y_d = y.clamp(f(), f());
+                 ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+  core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int z_i = z.clamp(f(), f());
+              ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+  self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X z_x = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+  self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
index 7ba4b0f..df25b02 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
@@ -29,7 +29,7 @@
   get extensionFunctionTypeGetter = self::Extension|get#extensionFunctionTypeGetter;
   set extensionProperty = self::Extension|set#extensionProperty;
 }
-static field core::int? topLevelBinary;
+static field core::num topLevelBinary;
 static field core::int topLevelUnary;
 static field dynamic topLevelIndexGet;
 static field core::int topLevelIndexSet;
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
index 7c80c76..c4c45a5 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
@@ -443,7 +443,7 @@
   get extensionFunctionTypeGetter = self::Extension|get#extensionFunctionTypeGetter;
   set extensionProperty = self::Extension|set#extensionProperty;
 }
-static field core::int? topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static field core::num topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 var topLevelBinary = nullableInt + 0;
                                  ^" in self::nullableInt.{core::num::+}(0);
 static field core::int topLevelUnary = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -650,7 +650,7 @@
 static get nullableClass() → self::Class?
   return new self::Class::•();
 static method test() → dynamic {
-  core::int? localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  core::num localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   var localBinary = nullableInt + 0;
                                 ^" in self::nullableInt.{core::num::+}(0);
   core::int localUnary = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:77:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
index 7c80c76..c4c45a5 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
@@ -443,7 +443,7 @@
   get extensionFunctionTypeGetter = self::Extension|get#extensionFunctionTypeGetter;
   set extensionProperty = self::Extension|set#extensionProperty;
 }
-static field core::int? topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static field core::num topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 var topLevelBinary = nullableInt + 0;
                                  ^" in self::nullableInt.{core::num::+}(0);
 static field core::int topLevelUnary = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -650,7 +650,7 @@
 static get nullableClass() → self::Class?
   return new self::Class::•();
 static method test() → dynamic {
-  core::int? localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  core::num localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   var localBinary = nullableInt + 0;
                                 ^" in self::nullableInt.{core::num::+}(0);
   core::int localUnary = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:77:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart b/pkg/front_end/testcases/nnbd/return_null.dart
index a044f19..93ea4d6 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart
+++ b/pkg/front_end/testcases/nnbd/return_null.dart
@@ -114,7 +114,7 @@
   }
 
   bool b = false;
-  var local1 = () /* error */ {
+  var local1 = () /* ok */ {
     if (b) return 0;
   }();
   var local2 = () /* ok */ {
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
index ec3912f..022f00c 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
@@ -52,10 +52,6 @@
 //   Enum caseReturn2(Enum e) /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-//   var local1 = () /* error */ {
-//                ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
@@ -212,12 +208,9 @@
   ^" in null;
   }
   core::bool b = false;
-  core::int local1 = (() → core::int {
+  core::int? local1 = (() → core::int? {
     if(b)
       return 0;
-    return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-  var local1 = () /* error */ {
-               ^" in null;
   }).call();
   core::int? local2 = (() → core::int? {
     if(b)
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 e697630..6f1bd4c 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
@@ -52,10 +52,6 @@
 //   Enum caseReturn2(Enum e) /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-//   var local1 = () /* error */ {
-//                ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
@@ -612,12 +608,9 @@
   ^" in null;
   }
   core::bool b = false;
-  core::int local1 = (() → core::int {
+  core::int? local1 = (() → core::int? {
     if(b)
       return 0;
-    return let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-  var local1 = () /* error */ {
-               ^" in null;
   }).call();
   core::int? local2 = (() → core::int? {
     if(b)
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
index 2aff0f0..4c9329b 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
@@ -52,10 +52,6 @@
 //   Enum caseReturn2(Enum e) /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-//   var local1 = () /* error */ {
-//                ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
@@ -212,12 +208,9 @@
   ^" in null;
   }
   core::bool b = false;
-  core::int local1 = (() → core::int {
+  core::int? local1 = (() → core::int? {
     if(b)
       return 0;
-    return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-  var local1 = () /* error */ {
-               ^" in null;
   }).call();
   core::int? local2 = (() → core::int? {
     if(b)
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
index e888a45..b3b3e5b 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
@@ -52,10 +52,6 @@
 //   Enum caseReturn2(Enum e) /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-//   var local1 = () /* error */ {
-//                ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:async" as asy;
@@ -612,12 +608,9 @@
   ^" in null;
   }
   core::bool b = false;
-  core::int local1 = (() → core::int {
+  core::int? local1 = (() → core::int? {
     if(b)
       return 0;
-    return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-  var local1 = () /* error */ {
-               ^" in null;
   }).call();
   core::int? local2 = (() → core::int? {
     if(b)
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
index fffeeb8..609cde0 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
@@ -54,7 +54,7 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
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 fffeeb8..609cde0 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
@@ -54,7 +54,7 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
index fffeeb8..609cde0 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
@@ -54,7 +54,7 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
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 fffeeb8..609cde0 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
@@ -54,7 +54,7 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart
new file mode 100644
index 0000000..5765ffd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Foo<T> {
+  dynamic bar;
+  dynamic baz;
+
+  dynamic qux() {
+    final T? v = bar;
+    if (v is num) {
+      baz['value'] = v.isFinite ? v : v.toString();
+    }
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.outline.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.outline.expect
new file mode 100644
index 0000000..c9c1d63
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.outline.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+  field dynamic bar;
+  field dynamic baz;
+  synthetic constructor •() → self::Foo<self::Foo::T%>
+    ;
+  method qux() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+  field dynamic bar = null;
+  field dynamic baz = null;
+  synthetic constructor •() → self::Foo<self::Foo::T%>
+    : super core::Object::•()
+    ;
+  method qux() → dynamic {
+    final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+    if(v is{ForNonNullableByDefault} core::num) {
+      this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+  field dynamic bar = null;
+  field dynamic baz = null;
+  synthetic constructor •() → self::Foo<self::Foo::T%>
+    : super core::Object::•()
+    ;
+  method qux() → dynamic {
+    final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+    if(v is{ForNonNullableByDefault} core::num) {
+      this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+  field dynamic bar = null;
+  field dynamic baz = null;
+  synthetic constructor •() → self::Foo<self::Foo::T%>
+    : super core::Object::•()
+    ;
+  method qux() → dynamic {
+    final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+    if(v is{ForNonNullableByDefault} core::num) {
+      this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.transformed.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+  field dynamic bar = null;
+  field dynamic baz = null;
+  synthetic constructor •() → self::Foo<self::Foo::T%>
+    : super core::Object::•()
+    ;
+  method qux() → dynamic {
+    final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+    if(v is{ForNonNullableByDefault} core::num) {
+      this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart
new file mode 100644
index 0000000..b54e437
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class EmptyClass {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect
new file mode 100644
index 0000000..e608a1a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class EmptyClass extends core::Object {
+  synthetic constructor •() → self::EmptyClass
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+  synthetic constructor •() → self::EmptyClass
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+  synthetic constructor •() → self::EmptyClass
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+  synthetic constructor •() → self::EmptyClass
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+  synthetic constructor •() → self::EmptyClass
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
new file mode 100644
index 0000000..6c9da9d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+  int? numLegs;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
new file mode 100644
index 0000000..4353f25
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+  field core::int? numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int? numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int? numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int? numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int? numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
new file mode 100644
index 0000000..efe2cdd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+  final int numLegs = 4;
+}
+
+class Cat extends Animal {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect
new file mode 100644
index 0000000..0dc7afd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+  final field core::int numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
new file mode 100644
index 0000000..3800fa1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+  final int numLegs = 4;
+}
+
+class Cat implements Animal {
+  int numLegs = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
new file mode 100644
index 0000000..6303c33
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+  final field core::int numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  field core::int numLegs;
+  synthetic constructor •() → self::Cat
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
new file mode 100644
index 0000000..522d957
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+  final int numLegs = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
new file mode 100644
index 0000000..e16fd84
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+  final field core::int numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
new file mode 100644
index 0000000..d57a05b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+  final int numLegs = 4;
+}
+
+@valueClass
+class Cat implements Animal {
+  final int numLegs = 4;
+  final int numWhiskers = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
new file mode 100644
index 0000000..72f354d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+  final field core::int numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+@self::valueClass
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs;
+  final field core::int numWhiskers;
+  synthetic constructor •() → self::Cat
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  final field core::int numWhiskers = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  final field core::int numWhiskers = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  final field core::int numWhiskers = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  final field core::int numWhiskers = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/test.options b/pkg/front_end/testcases/nnbd/value_classes/test.options
new file mode 100644
index 0000000..81953a10
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/test.options
@@ -0,0 +1 @@
+--enable-experiment=non-nullable,value-class
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
new file mode 100644
index 0000000..79b694c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+class Animal {
+  int numLegs = 4;
+}
+
+@valueClass
+class Cat extends Animal {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect
new file mode 100644
index 0000000..7d29b32
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  field core::int numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+@self::valueClass
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
new file mode 100644
index 0000000..2cc85fc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+class Animal {
+  final int numLegs = 4;
+}
+
+@valueClass
+class Cat extends Animal {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect
new file mode 100644
index 0000000..c0cd3b6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+@self::valueClass
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
new file mode 100644
index 0000000..2d67798
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+class Animal {
+  final int numLegs = 4;
+}
+
+@valueClass
+class Cat implements Animal {
+  final int numLegs = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect
new file mode 100644
index 0000000..e4fba11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs;
+  synthetic constructor •() → self::Animal
+    ;
+}
+@self::valueClass
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs;
+  synthetic constructor •() → self::Cat
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = 4;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart
new file mode 100644
index 0000000..ad9b510
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart
@@ -0,0 +1,14 @@
+// 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 'issue42181_lib.dart';
+
+int? f1(int x) => x;
+
+void test() {
+  F f = null; // Static error
+  f = f1; // No error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline.expect
new file mode 100644
index 0000000..f3fb35c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+import 'issue42181_lib.dart';
+
+int? f1(int x) => x;
+void test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9ad4cf9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+import 'issue42181_lib.dart';
+
+int? f1(int x) => x;
+main() {}
+void test() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
new file mode 100644
index 0000000..6cfbab4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+//   F f = null; // Static error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42181_lib.dart";
+
+static method f1(core::int x) → core::int?
+  return x;
+static method test() → void {
+  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  F f = null; // Static error
+        ^" in null as{TypeError,ForNonNullableByDefault} (core::int*) → core::int*;
+  f = #C1;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::int*;
+
+constants  {
+  #C1 = tearoff self::f1
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
new file mode 100644
index 0000000..87f79f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+//   F f = null; // Static error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42181_lib.dart";
+
+static method f1(core::int x) → core::int?
+  return x;
+static method test() → void {
+  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  F f = null; // Static error
+        ^" in null;
+  f = #C1;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::int*;
+
+constants  {
+  #C1 = tearoff self::f1
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42181_lib.dart
new file mode 100644
index 0000000..16bc752
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.8
+
+typedef F = int Function(int);
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart
new file mode 100644
index 0000000..b6b0559
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart
@@ -0,0 +1,11 @@
+// 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 'issue42792_lib.dart';
+
+mixin M<T> on A<T> {}
+
+class B extends A<int> with M {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline.expect
new file mode 100644
index 0000000..af0bbd2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+import 'issue42792_lib.dart';
+
+mixin M<T> on A<T> {}
+
+class B extends A<int> with M {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7b313f7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+import 'issue42792_lib.dart';
+
+class B extends A<int> with M {}
+
+mixin M<T> on A<T> {}
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.expect
new file mode 100644
index 0000000..3a81ec3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "issue42792_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue42792_lib.dart";
+
+abstract class M<T extends core::Object? = dynamic> extends iss::A<self::M::T%> /*isMixinDeclaration*/  {
+}
+abstract class _B&A&M = iss::A<core::int> with self::M<core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B&A&M
+    : super iss::A::•()
+    ;
+}
+class B extends self::_B&A&M {
+  synthetic constructor •() → self::B
+    : super self::_B&A&M::•()
+    ;
+}
+static method main() → void {}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → iss::A<iss::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.transformed.expect
new file mode 100644
index 0000000..6750224
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.transformed.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "issue42792_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue42792_lib.dart";
+
+abstract class M<T extends core::Object? = dynamic> extends iss::A<self::M::T%> /*isMixinDeclaration*/  {
+}
+abstract class _B&A&M extends iss::A<core::int> implements self::M<core::int> /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_B&A&M
+    : super iss::A::•()
+    ;
+}
+class B extends self::_B&A&M {
+  synthetic constructor •() → self::B
+    : super self::_B&A&M::•()
+    ;
+}
+static method main() → void {}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → iss::A<iss::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42792_lib.dart
new file mode 100644
index 0000000..7a4b268
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.8
+
+abstract class A<T> {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart
new file mode 100644
index 0000000..e23b8c0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// @dart=2.7
+
+import 'issue42836_lib.dart';
+
+class Legacy extends Generic<int> {
+  int legacyMethod() => 3;
+}
+
+var legacyInstance = Legacy();
+
+test(bool b) {
+  var a1 = b ? legacyInstance : legacyInstance;
+  var a2 = b ? legacyInstance : nonNullableInstance;
+  var a3 = b ? legacyInstance : nullableInstance;
+  var b1 = b ? nonNullableInstance : legacyInstance;
+  var b2 = b ? nonNullableInstance : nonNullableInstance;
+  var b3 = b ? nonNullableInstance : nullableInstance;
+  var c1 = b ? nullableInstance : legacyInstance;
+  var c2 = b ? nullableInstance : nonNullableInstance;
+  var c3 = b ? nullableInstance : nullableInstance;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline.expect
new file mode 100644
index 0000000..9bf1641
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+// @dart = 2.7
+import 'issue42836_lib.dart';
+
+class Legacy extends Generic<int> {
+  int legacyMethod() => 3;
+}
+
+var legacyInstance = Legacy();
+test(bool b) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..cd4b436
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+// @dart = 2.7
+import 'issue42836_lib.dart';
+
+class Legacy extends Generic<int> {
+  int legacyMethod() => 3;
+}
+
+main() {}
+test(bool b) {}
+var legacyInstance = Legacy();
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.expect
new file mode 100644
index 0000000..2ff8a4f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.expect
@@ -0,0 +1,73 @@
+library;
+import self as self;
+import "issue42836_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42836_lib.dart";
+
+class Legacy extends iss::Generic<core::int*> {
+  synthetic constructor •() → self::Legacy*
+    : super iss::Generic::•()
+    ;
+  method legacyMethod() → core::int*
+    return 3;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
+static field self::Legacy* legacyInstance = new self::Legacy::•();
+static method test(core::bool* b) → dynamic {
+  self::Legacy* a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+  iss::Generic<core::int*>* a2 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nonNullableInstance;
+  iss::Generic<core::int*>* a3 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nullableInstance;
+  iss::Generic<core::int*>* b1 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : self::legacyInstance;
+  iss::NonNullable* b2 = b ?{iss::NonNullable*} iss::nonNullableInstance : iss::nonNullableInstance;
+  iss::Generic<core::int*>* b3 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : iss::nullableInstance;
+  iss::Generic<core::int*>* c1 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : self::legacyInstance;
+  iss::Generic<core::int*>* c2 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : iss::nonNullableInstance;
+  iss::Nullable* c3 = b ?{iss::Nullable*} iss::nullableInstance : iss::nullableInstance;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+import "issue42836.dart" as self;
+
+import "org-dartlang-testcase:///issue42836.dart";
+
+class Generic<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → iss::Generic<iss::Generic::T%>
+    : super core::Object::•()
+    ;
+}
+class NonNullable extends iss::Generic<core::int> {
+  synthetic constructor •() → iss::NonNullable
+    : super iss::Generic::•()
+    ;
+}
+class Nullable extends iss::Generic<core::int?> {
+  synthetic constructor •() → iss::Nullable
+    : super iss::Generic::•()
+    ;
+}
+static field iss::NonNullable nonNullableInstance = new iss::NonNullable::•();
+static field iss::Nullable nullableInstance = new iss::Nullable::•();
+static method test(core::bool b) → dynamic {
+  self::Legacy a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+  core::Object a2 = b ?{core::Object*} self::legacyInstance : iss::nonNullableInstance;
+  core::Object a3 = b ?{core::Object*} self::legacyInstance : iss::nullableInstance;
+  core::Object b1 = b ?{core::Object*} iss::nonNullableInstance : self::legacyInstance;
+  iss::NonNullable b2 = b ?{iss::NonNullable} iss::nonNullableInstance : iss::nonNullableInstance;
+  core::Object b3 = b ?{core::Object} iss::nonNullableInstance : iss::nullableInstance;
+  core::Object c1 = b ?{core::Object*} iss::nullableInstance : self::legacyInstance;
+  core::Object c2 = b ?{core::Object} iss::nullableInstance : iss::nonNullableInstance;
+  iss::Nullable c3 = b ?{iss::Nullable} iss::nullableInstance : iss::nullableInstance;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.transformed.expect
new file mode 100644
index 0000000..2ff8a4f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.transformed.expect
@@ -0,0 +1,73 @@
+library;
+import self as self;
+import "issue42836_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42836_lib.dart";
+
+class Legacy extends iss::Generic<core::int*> {
+  synthetic constructor •() → self::Legacy*
+    : super iss::Generic::•()
+    ;
+  method legacyMethod() → core::int*
+    return 3;
+  abstract member-signature get _identityHashCode() → core::int*;
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*;
+  abstract member-signature get hashCode() → core::int*;
+  abstract member-signature method toString() → core::String*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+  abstract member-signature get runtimeType() → core::Type*;
+}
+static field self::Legacy* legacyInstance = new self::Legacy::•();
+static method test(core::bool* b) → dynamic {
+  self::Legacy* a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+  iss::Generic<core::int*>* a2 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nonNullableInstance;
+  iss::Generic<core::int*>* a3 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nullableInstance;
+  iss::Generic<core::int*>* b1 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : self::legacyInstance;
+  iss::NonNullable* b2 = b ?{iss::NonNullable*} iss::nonNullableInstance : iss::nonNullableInstance;
+  iss::Generic<core::int*>* b3 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : iss::nullableInstance;
+  iss::Generic<core::int*>* c1 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : self::legacyInstance;
+  iss::Generic<core::int*>* c2 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : iss::nonNullableInstance;
+  iss::Nullable* c3 = b ?{iss::Nullable*} iss::nullableInstance : iss::nullableInstance;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+import "issue42836.dart" as self;
+
+import "org-dartlang-testcase:///issue42836.dart";
+
+class Generic<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → iss::Generic<iss::Generic::T%>
+    : super core::Object::•()
+    ;
+}
+class NonNullable extends iss::Generic<core::int> {
+  synthetic constructor •() → iss::NonNullable
+    : super iss::Generic::•()
+    ;
+}
+class Nullable extends iss::Generic<core::int?> {
+  synthetic constructor •() → iss::Nullable
+    : super iss::Generic::•()
+    ;
+}
+static field iss::NonNullable nonNullableInstance = new iss::NonNullable::•();
+static field iss::Nullable nullableInstance = new iss::Nullable::•();
+static method test(core::bool b) → dynamic {
+  self::Legacy a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+  core::Object a2 = b ?{core::Object*} self::legacyInstance : iss::nonNullableInstance;
+  core::Object a3 = b ?{core::Object*} self::legacyInstance : iss::nullableInstance;
+  core::Object b1 = b ?{core::Object*} iss::nonNullableInstance : self::legacyInstance;
+  iss::NonNullable b2 = b ?{iss::NonNullable} iss::nonNullableInstance : iss::nonNullableInstance;
+  core::Object b3 = b ?{core::Object} iss::nonNullableInstance : iss::nullableInstance;
+  core::Object c1 = b ?{core::Object*} iss::nullableInstance : self::legacyInstance;
+  core::Object c2 = b ?{core::Object} iss::nullableInstance : iss::nonNullableInstance;
+  iss::Nullable c3 = b ?{iss::Nullable} iss::nullableInstance : iss::nullableInstance;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42836_lib.dart
new file mode 100644
index 0000000..74f567c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836_lib.dart
@@ -0,0 +1,26 @@
+// 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 'issue42836.dart';
+
+class Generic<T> {}
+
+class NonNullable extends Generic<int> {}
+
+class Nullable extends Generic<int?> {}
+
+var nonNullableInstance = NonNullable();
+var nullableInstance = Nullable();
+
+test(bool b) {
+  var a1 = b ? legacyInstance : legacyInstance;
+  var a2 = b ? legacyInstance : nonNullableInstance;
+  var a3 = b ? legacyInstance : nullableInstance;
+  var b1 = b ? nonNullableInstance : legacyInstance;
+  var b2 = b ? nonNullableInstance : nonNullableInstance;
+  var b3 = b ? nonNullableInstance : nullableInstance;
+  var c1 = b ? nullableInstance : legacyInstance;
+  var c2 = b ? nullableInstance : nonNullableInstance;
+  var c3 = b ? nullableInstance : nullableInstance;
+}
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index f58f9fe..3c00bd1 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -43,6 +43,7 @@
 inference/mixin_inference_unification_2: TypeCheckError
 late_lowering/covariant_late_field: TypeCheckError
 nnbd/covariant_late_field: TypeCheckError
+nnbd/issue42603: TypeCheckError
 rasta/native_is_illegal: Pass # Issue 29763
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 66d7125..a38ef25a 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -173,6 +173,7 @@
 nnbd/covariant_late_field: TypeCheckError
 nnbd/issue41180: RuntimeError # Strong mode runtime checking fails due to mixed strong mode.
 nnbd/issue42546: TypeCheckError
+nnbd/issue42603: TypeCheckError
 nnbd/nullable_object_access: TypeCheckError
 nnbd/nullable_receiver: TypeCheckError
 nnbd/potentially_nullable_access: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index d31841a..bac74e7 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -171,6 +171,7 @@
 nnbd/covariant_late_field: TypeCheckError
 nnbd/issue41180: RuntimeError
 nnbd/issue42546: TypeCheckError
+nnbd/issue42603: TypeCheckError
 nnbd/nullable_object_access: TypeCheckError
 nnbd/nullable_receiver: TypeCheckError
 nnbd/potentially_nullable_access: TypeCheckError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 80dbc59..65846ca 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -61,6 +61,7 @@
 late_lowering/covariant_late_field: TypeCheckError
 nnbd/covariant_late_field: TypeCheckError
 nnbd/issue42546: TypeCheckError
+nnbd/issue42603: TypeCheckError
 nnbd/nullable_object_access: TypeCheckError
 nnbd/nullable_receiver: TypeCheckError
 nnbd/potentially_nullable_access: TypeCheckError
diff --git a/pkg/frontend_server/test/src/expression_compiler_test.dart b/pkg/frontend_server/test/src/expression_compiler_test.dart
index 245118a..2dabd91 100644
--- a/pkg/frontend_server/test/src/expression_compiler_test.dart
+++ b/pkg/frontend_server/test/src/expression_compiler_test.dart
@@ -252,7 +252,7 @@
   }
 }
 
-int main() {
+void main() {
   SetupCompilerOptions options = SetupCompilerOptions();
 
   group('Expression compiler tests in extension method:', () {
@@ -1212,6 +1212,4 @@
           ''');
     });
   });
-
-  return 0;
 }
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index ad82c3c..e1bf6e0 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -3021,6 +3021,9 @@
     if (type == context.typeEnvironment.nullType) {
       return context.typeEnvironment.coreTypes
           .bottomInterfaceType(superclass, context.nullable);
+    } else if (type is NeverType) {
+      return context.typeEnvironment.coreTypes
+          .bottomInterfaceType(superclass, type.nullability);
     }
     if (type is InterfaceType) {
       List<DartType> upcastTypeArguments = context.typeEnvironment
@@ -3480,8 +3483,8 @@
       v.visitDirectMethodInvocation(this, arg);
 
   DartType getStaticType(StaticTypeContext context) {
-    if (context.typeEnvironment.isOverloadedArithmeticOperator(target)) {
-      return context.typeEnvironment.getTypeOfOverloadedArithmetic(
+    if (context.typeEnvironment.isSpecialCasedBinaryOperator(target)) {
+      return context.typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
           receiver.getStaticType(context),
           arguments.positional[0].getStaticType(context));
     }
@@ -3883,8 +3886,8 @@
     if (interfaceTarget != null) {
       if (interfaceTarget is Procedure &&
           context.typeEnvironment
-              .isOverloadedArithmeticOperator(interfaceTarget)) {
-        return context.typeEnvironment.getTypeOfOverloadedArithmetic(
+              .isSpecialCasedBinaryOperator(interfaceTarget)) {
+        return context.typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
             receiver.getStaticType(context),
             arguments.positional[0].getStaticType(context));
       }
@@ -8245,12 +8248,13 @@
   /// null, it is an equivalent of setting the overall nullability.
   @override
   TypeParameterType withDeclaredNullability(Nullability declaredNullability) {
+    if (declaredNullability == this.declaredNullability) {
+      return this;
+    }
     // TODO(dmitryas): Consider removing the assert.
     assert(promotedBound == null,
         "Can't change the nullability attribute of an intersection type.");
-    return declaredNullability == this.declaredNullability
-        ? this
-        : new TypeParameterType(parameter, declaredNullability, promotedBound);
+    return new TypeParameterType(parameter, declaredNullability, promotedBound);
   }
 
   /// Gets the nullability of a type-parameter type based on the bound.
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 19a824a..e461ce3 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -48,6 +48,24 @@
   /// If multiple members with that name are inherited and not overridden, the
   /// member from the first declared supertype is returned.
   Member getInterfaceMember(Class class_, Name name, {bool setter: false});
+
+  /// Returns the least upper bound of two interface types, as defined by Dart
+  /// 1.0.
+  ///
+  /// Given two interfaces I and J, let S_I be the set of superinterfaces of I,
+  /// let S_J be the set of superinterfaces of J, and let
+  /// S = (I union S_I) intersect (J union S_J).  Furthermore, we define
+  /// S_n = {T | T in S and depth(T) = n} for any finite n where depth(T) is
+  /// the number of steps in the longest inheritance path from T to Object.  Let
+  /// q be the largest number such that S_q has cardinality one.  The least
+  /// upper bound of I and J is the sole element of S_q.
+  ///
+  /// This is called the "legacy" least upper bound to distinguish it from the
+  /// Dart 2 least upper bound, which has special behaviors in the case where
+  /// one type is a subtype of the other, or where both types are based on the
+  /// same class.
+  InterfaceType getLegacyLeastUpperBound(
+      InterfaceType type1, InterfaceType type2, Library clientLibrary);
 }
 
 /// Interface for answering various subclassing queries.
@@ -81,24 +99,6 @@
   // interfaces).
   List<Supertype> genericSupertypesOf(Class class_);
 
-  /// Returns the least upper bound of two interface types, as defined by Dart
-  /// 1.0.
-  ///
-  /// Given two interfaces I and J, let S_I be the set of superinterfaces of I,
-  /// let S_J be the set of superinterfaces of J, and let
-  /// S = (I union S_I) intersect (J union S_J).  Furthermore, we define
-  /// S_n = {T | T in S and depth(T) = n} for any finite n where depth(T) is
-  /// the number of steps in the longest inheritance path from T to Object.  Let
-  /// q be the largest number such that S_q has cardinality one.  The least
-  /// upper bound of I and J is the sole element of S_q.
-  ///
-  /// This is called the "legacy" least upper bound to distinguish it from the
-  /// Dart 2 least upper bound, which has special behaviors in the case where
-  /// one type is a subtype of the other, or where both types are based on the
-  /// same class.
-  InterfaceType getLegacyLeastUpperBound(InterfaceType type1,
-      InterfaceType type2, Library clientLibrary, CoreTypes coreTypes);
-
   /// Returns the instantiation of [superclass] that is implemented by [class_],
   /// or `null` if [class_] does not implement [superclass] at all.
   Supertype getClassAsInstanceOf(Class class_, Class superclass);
@@ -571,8 +571,8 @@
   }
 
   @override
-  InterfaceType getLegacyLeastUpperBound(InterfaceType type1,
-      InterfaceType type2, Library clientLibrary, CoreTypes coreTypes) {
+  InterfaceType getLegacyLeastUpperBound(
+      InterfaceType type1, InterfaceType type2, Library clientLibrary) {
     // The algorithm is: first we compute a list of superclasses for both types,
     // ordered from greatest to least depth, and ordered by topological sort
     // index within each depth.  Due to the sort order, we can find the
@@ -669,6 +669,10 @@
             ? type2
             : Substitution.fromInterfaceType(type2).substituteType(
                 info2.genericSuperType[next.classNode].asInterfaceType);
+        if (!clientLibrary.isNonNullableByDefault) {
+          superType1 = legacyErasure(coreTypes, superType1);
+          superType2 = legacyErasure(coreTypes, superType2);
+        }
         if (superType1 == superType2) {
           candidate = superType1.withDeclaredNullability(
               uniteNullabilities(type1.nullability, type2.nullability));
@@ -715,6 +719,19 @@
   @override
   List<DartType> getTypeArgumentsAsInstanceOf(
       InterfaceType type, Class superclass) {
+    if (type.classNode == superclass) {
+      // TODO(johnniwinther): This is necessary because [getClassAsInstanceOf]
+      // returns a [Supertype] whose type arguments are type parameter types
+      // whose nullability is set to the default nullability of the
+      // enclosing library. If for instance [type] is `A<int!>` but `A` is
+      // declared in an opt-out library, the substitution below will combine
+      // nullabilities of the type arguments in [type] with the type parameters
+      // and thus give the result `A<int*>`. See issue #42792.
+      // For now we bypass the substitution but long term we need to ensure
+      // that [getClassAsInstanceOf] doesn't cause similar problems in other
+      // situations.
+      return type.typeArguments;
+    }
     Supertype castedType = getClassAsInstanceOf(type.classNode, superclass);
     if (castedType == null) return null;
     if (superclass.typeParameters.isEmpty) return const <DartType>[];
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 7c82be8..cc60986 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 library kernel.core_types;
 
+import 'package:kernel/type_algebra.dart';
+
 import 'ast.dart';
 import 'library_index.dart';
 
@@ -1254,13 +1256,10 @@
     // TOP(T*) is true iff TOP(T) or OBJECT(T).
     if (type.declaredNullability == Nullability.nullable ||
         type.declaredNullability == Nullability.legacy) {
-      DartType nonNullableType =
-          type.withDeclaredNullability(Nullability.nonNullable);
-      assert(
-          !identical(type, nonNullableType),
-          "Setting the declared nullability of type '${type}' "
-          "to non-nullable was supposed to change the type, but it remained the same.");
-      return isTop(nonNullableType) || isObject(nonNullableType);
+      DartType nonNullableType = unwrapNullabilityConstructor(type, this);
+      if (!identical(type, nonNullableType)) {
+        return isTop(nonNullableType) || isObject(nonNullableType);
+      }
     }
 
     // TOP(FutureOr<T>) is TOP(T).
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
new file mode 100644
index 0000000..e57f264
--- /dev/null
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -0,0 +1,1594 @@
+// Copyright (c) 2019, 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.md file.
+
+import 'dart:math' as math;
+
+import '../ast.dart'
+    show
+        BottomType,
+        Class,
+        DartType,
+        DynamicType,
+        FunctionType,
+        FutureOrType,
+        InterfaceType,
+        InvalidType,
+        Library,
+        NamedType,
+        NeverType,
+        Nullability,
+        TypeParameter,
+        TypeParameterType,
+        Variance,
+        VoidType;
+import '../class_hierarchy.dart';
+import '../core_types.dart';
+import '../type_algebra.dart';
+import '../type_environment.dart';
+import 'legacy_erasure.dart';
+
+mixin StandardBounds {
+  ClassHierarchyBase get hierarchy;
+
+  bool isSubtypeOf(DartType subtype, DartType supertype, SubtypeCheckMode mode);
+
+  bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode);
+
+  CoreTypes get coreTypes => hierarchy.coreTypes;
+
+  /// Checks the value of the MORETOP predicate for [s] and [t].
+  ///
+  /// For the definition of MORETOP see the following:
+  /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
+  bool moretop(DartType s, DartType t) {
+    assert(coreTypes.isTop(s) || coreTypes.isObject(s));
+    assert(coreTypes.isTop(t) || coreTypes.isObject(t));
+
+    // MORETOP(void, T) = true.
+    if (s is VoidType) return true;
+
+    // MORETOP(S, void) = false.
+    if (t is VoidType) return false;
+
+    // MORETOP(dynamic, T) = true.
+    if (s is DynamicType) return true;
+
+    // MORETOP(S, dynamic) = false.
+    if (t is DynamicType) return false;
+
+    // MORETOP(Object, T) = true.
+    if (s is InterfaceType &&
+        s.classNode == coreTypes.objectClass &&
+        s.declaredNullability == Nullability.nonNullable) {
+      return true;
+    }
+
+    // MORETOP(S, Object) = false.
+    if (t is InterfaceType &&
+        t.classNode == coreTypes.objectClass &&
+        t.declaredNullability == Nullability.nonNullable) {
+      return false;
+    }
+
+    // MORETOP(S*, T*) = MORETOP(S, T).
+    if (s.declaredNullability == Nullability.legacy &&
+        t.declaredNullability == Nullability.legacy) {
+      DartType nonNullableS =
+          s.withDeclaredNullability(Nullability.nonNullable);
+      assert(!identical(s, nonNullableS));
+      DartType nonNullableT =
+          t.withDeclaredNullability(Nullability.nonNullable);
+      assert(!identical(t, nonNullableT));
+      return moretop(nonNullableS, nonNullableT);
+    }
+
+    // MORETOP(S, T*) = true.
+    if (s.declaredNullability == Nullability.nonNullable &&
+        t.declaredNullability == Nullability.legacy) {
+      return true;
+    }
+
+    // MORETOP(S*, T) = false.
+    if (s.declaredNullability == Nullability.legacy &&
+        t.declaredNullability == Nullability.nonNullable) {
+      return false;
+    }
+
+    // MORETOP(S?, T?) == MORETOP(S, T).
+    if (s.declaredNullability == Nullability.nullable &&
+        t.declaredNullability == Nullability.nullable) {
+      DartType nonNullableS =
+          s.withDeclaredNullability(Nullability.nonNullable);
+      assert(!identical(s, nonNullableS));
+      DartType nonNullableT =
+          t.withDeclaredNullability(Nullability.nonNullable);
+      assert(!identical(t, nonNullableT));
+      return moretop(nonNullableS, nonNullableT);
+    }
+
+    // MORETOP(S, T?) = true.
+    if (s.declaredNullability == Nullability.nonNullable &&
+        t.declaredNullability == Nullability.nullable) {
+      return true;
+    }
+
+    // MORETOP(S?, T) = false.
+    if (s.declaredNullability == Nullability.nullable &&
+        t.declaredNullability == Nullability.nonNullable) {
+      return false;
+    }
+
+    // TODO(dmitryas): Update the following after the spec is updated.
+    if (s.declaredNullability == Nullability.nullable &&
+        t.declaredNullability == Nullability.legacy) {
+      return true;
+    }
+    if (s.declaredNullability == Nullability.legacy &&
+        t.declaredNullability == Nullability.nullable) {
+      return false;
+    }
+
+    // MORETOP(FutureOr<S>, FutureOr<T>) = MORETOP(S, T).
+    if (s is FutureOrType &&
+        s.declaredNullability == Nullability.nonNullable &&
+        t is FutureOrType &&
+        t.declaredNullability == Nullability.nonNullable) {
+      return moretop(s.typeArgument, t.typeArgument);
+    }
+
+    throw new UnsupportedError("moretop($s, $t)");
+  }
+
+  /// Checks the value of the MOREBOTTOM predicate for [s] and [t].
+  ///
+  /// For the definition of MOREBOTTOM see the following:
+  /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
+  bool morebottom(DartType s, DartType t) {
+    assert(coreTypes.isBottom(s) || coreTypes.isNull(s));
+    assert(coreTypes.isBottom(t) || coreTypes.isNull(t));
+
+    // MOREBOTTOM(Never, T) = true.
+    if (s is NeverType && s.declaredNullability == Nullability.nonNullable) {
+      return true;
+    }
+
+    // MOREBOTTOM(S, Never) = false.
+    if (t is NeverType && t.declaredNullability == Nullability.nonNullable) {
+      return false;
+    }
+
+    // MOREBOTTOM(Null, T) = true.
+    if (s == coreTypes.nullType) {
+      return true;
+    }
+
+    // MOREBOTTOM(S, Null) = false.
+    if (t == coreTypes.nullType) {
+      return false;
+    }
+
+    // MOREBOTTOM(S?, T?) = MOREBOTTOM(S, T).
+    if (t.declaredNullability == Nullability.nullable &&
+        s.declaredNullability == Nullability.nullable) {
+      DartType nonNullableS =
+          s.withDeclaredNullability(Nullability.nonNullable);
+      assert(s != nonNullableS);
+      DartType nonNullableT =
+          t.withDeclaredNullability(Nullability.nonNullable);
+      assert(t != nonNullableT);
+      return morebottom(nonNullableS, nonNullableT);
+    }
+
+    // MOREBOTTOM(S, T?) = true.
+    if (s.declaredNullability == Nullability.nonNullable &&
+        t.declaredNullability == Nullability.nullable) {
+      return true;
+    }
+
+    // MOREBOTTOM(S?, T) = false.
+    if (s.declaredNullability == Nullability.nullable &&
+        t.declaredNullability == Nullability.nonNullable) {
+      return false;
+    }
+
+    // MOREBOTTOM(S*, T*) = MOREBOTTOM(S, T)
+    if (s.declaredNullability == Nullability.legacy &&
+        t.declaredNullability == Nullability.legacy) {
+      DartType nonNullableS =
+          s.withDeclaredNullability(Nullability.nonNullable);
+      assert(s != nonNullableS);
+      DartType nonNullableT =
+          t.withDeclaredNullability(Nullability.nonNullable);
+      assert(t != nonNullableT);
+      return morebottom(nonNullableS, nonNullableT);
+    }
+
+    // MOREBOTTOM(S, T*) = true.
+    if (s.declaredNullability == Nullability.nonNullable &&
+        t.declaredNullability == Nullability.legacy) {
+      return true;
+    }
+
+    // MOREBOTTOM(S*, T) = false.
+    if (s.declaredNullability == Nullability.legacy &&
+        t.declaredNullability == Nullability.nonNullable) {
+      return false;
+    }
+
+    // TODO(dmitryas): Update the following after the spec is updated.
+    if (s.declaredNullability == Nullability.nullable &&
+        t.declaredNullability == Nullability.legacy) {
+      return true;
+    }
+    if (s.declaredNullability == Nullability.legacy &&
+        t.declaredNullability == Nullability.nullable) {
+      return false;
+    }
+
+    // MOREBOTTOM(X&S, Y&T) = MOREBOTTOM(S, T).
+    if (s is TypeParameterType &&
+        s.promotedBound != null &&
+        t is TypeParameterType &&
+        t.promotedBound != null) {
+      return morebottom(s.promotedBound, t.promotedBound);
+    }
+
+    // MOREBOTTOM(X&S, T) = true.
+    if (s is TypeParameterType && s.promotedBound != null) {
+      return true;
+    }
+
+    // MOREBOTTOM(S, X&T) = false.
+    if (t is TypeParameterType && t.promotedBound != null) {
+      return false;
+    }
+
+    // MOREBOTTOM(X extends S, Y extends T) = MOREBOTTOM(S, T).
+    if (s is TypeParameterType && t is TypeParameterType) {
+      assert(s.promotedBound == null);
+      assert(t.promotedBound == null);
+      return morebottom(s.parameter.bound, t.parameter.bound);
+    }
+
+    throw new UnsupportedError("morebottom($s, $t)");
+  }
+
+  /// Computes the standard lower bound of [type1] and [type2].
+  ///
+  /// Standard lower bound is a lower bound function that imposes an
+  /// ordering on the top types `void`, `dynamic`, and `object`.  This function
+  /// additionally handles the unknown type that appears during type inference.
+  DartType getStandardLowerBound(
+      DartType type1, DartType type2, Library clientLibrary) {
+    if (type1 is InvalidType || type2 is InvalidType) {
+      return const InvalidType();
+    }
+    if (clientLibrary.isNonNullableByDefault) {
+      return _getNullabilityAwareStandardLowerBound(
+          type1, type2, clientLibrary);
+    }
+    return _getNullabilityObliviousStandardLowerBound(
+        legacyErasure(coreTypes, type1),
+        legacyErasure(coreTypes, type2),
+        clientLibrary);
+  }
+
+  DartType _getNullabilityAwareStandardLowerBound(
+      DartType type1, DartType type2, Library clientLibrary) {
+    // DOWN(T, T) = T.
+    if (identical(type1, type2)) return type1;
+
+    return getNullabilityAwareStandardLowerBoundInternal(
+        type1, type2, clientLibrary);
+  }
+
+  DartType getNullabilityAwareStandardLowerBoundInternal(
+      DartType type1, DartType type2, Library clientLibrary) {
+    // DOWN(T1, T2) where TOP(T1) and TOP(T2) =
+    //   T1 if MORETOP(T2, T1)
+    //   T2 otherwise
+    // DOWN(T1, T2) = T2 if TOP(T1)
+    // DOWN(T1, T2) = T1 if TOP(T2)
+    if (coreTypes.isTop(type1)) {
+      if (coreTypes.isTop(type2)) return moretop(type2, type1) ? type1 : type2;
+      return type2;
+    } else if (coreTypes.isTop(type2)) {
+      return type1;
+    }
+
+    // DOWN(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
+    //   T1 if MOREBOTTOM(T1, T2)
+    //   T2 otherwise
+    // DOWN(T1, T2) = T2 if BOTTOM(T2)
+    // DOWN(T1, T2) = T1 if BOTTOM(T1)
+    if (coreTypes.isBottom(type1)) {
+      if (coreTypes.isBottom(type2)) {
+        return morebottom(type1, type2) ? type1 : type2;
+      }
+      return type1;
+    } else if (coreTypes.isBottom(type2)) {
+      return type2;
+    }
+
+    // DOWN(T1, T2) where NULL(T1) and NULL(T2) =
+    //   T1 if MOREBOTTOM(T1, T2)
+    //   T2 otherwise
+    // DOWN(Null, T2) =
+    //   Null if Null <: T2
+    //   Never otherwise
+    // DOWN(T1, Null) =
+    //  Null if Null <: T1
+    //  Never otherwise
+    if (coreTypes.isNull(type1)) {
+      if (coreTypes.isNull(type2)) {
+        return morebottom(type1, type2) ? type1 : type2;
+      }
+      Nullability type2Nullability = type2.declaredNullability;
+      if (type2Nullability == Nullability.legacy ||
+          type2Nullability == Nullability.nullable) {
+        return type1;
+      }
+      return const NeverType(Nullability.nonNullable);
+    } else if (coreTypes.isNull(type2)) {
+      Nullability type1Nullability = type1.declaredNullability;
+      if (type1Nullability == Nullability.legacy ||
+          type1Nullability == Nullability.nullable) {
+        return type2;
+      }
+      return const NeverType(Nullability.nonNullable);
+    }
+
+    // DOWN(T1, T2) where OBJECT(T1) and OBJECT(T2) =
+    //   T1 if MORETOP(T2, T1)
+    //   T2 otherwise
+    // DOWN(T1, T2) where OBJECT(T1) =
+    //   T2 if T2 is non-nullable
+    //   NonNull(T2) if NonNull(T2) is non-nullable
+    //   Never otherwise
+    // DOWN(T1, T2) where OBJECT(T2) =
+    //   T1 if T1 is non-nullable
+    //   NonNull(T1) if NonNull(T1) is non-nullable
+    //   Never otherwise
+    if (coreTypes.isObject(type1)) {
+      if (coreTypes.isObject(type2)) {
+        return moretop(type2, type1) ? type1 : type2;
+      }
+      if (type2.declaredNullability == Nullability.nonNullable) {
+        return type2;
+      }
+      type2 = type2.withDeclaredNullability(Nullability.nonNullable);
+      if (type2.declaredNullability == Nullability.nonNullable) {
+        return type2;
+      }
+      return const NeverType(Nullability.nonNullable);
+    } else if (coreTypes.isObject(type2)) {
+      if (type1.declaredNullability == Nullability.nonNullable) {
+        return type1;
+      }
+      type1 = type1.withDeclaredNullability(Nullability.nonNullable);
+      if (type1.declaredNullability == Nullability.nonNullable) {
+        return type1;
+      }
+      return const NeverType(Nullability.nonNullable);
+    }
+
+    // The effect of the following rules is accounted for in the code below via
+    // the invocations of intersectNullabilities.
+    // DOWN(T1*, T2*) = S* where S is DOWN(T1, T2)
+    // DOWN(T1*, T2?) = S* where S is DOWN(T1, T2)
+    // DOWN(T1?, T2*) = S* where S is DOWN(T1, T2)
+    // DOWN(T1*, T2) = S where S is DOWN(T1, T2)
+    // DOWN(T1, T2*) = S where S is DOWN(T1, T2)
+    // DOWN(T1?, T2?) = S? where S is DOWN(T1, T2)
+    // DOWN(T1?, T2) = S where S is DOWN(T1, T2)
+    // DOWN(T1, T2?) = S where S is DOWN(T1, T2)
+
+    if (type1 is FunctionType && type2 is FunctionType) {
+      return _getNullabilityAwareFunctionStandardLowerBound(
+          type1, type2, clientLibrary);
+    }
+
+    // DOWN(T1, T2) = T1 if T1 <: T2.
+    // DOWN(T1, T2) = T2 if T2 <: T1.
+
+    // We use the non-nullable variants of the two types to determine T1 <: T2
+    // without using the nullability of the outermost type. The result uses
+    // [intersectNullabilities] to compute the resulting type if the subtype
+    // relation is established.
+    DartType nonNullableType1 =
+        type1.withDeclaredNullability(Nullability.nonNullable);
+    DartType nonNullableType2 =
+        type2.withDeclaredNullability(Nullability.nonNullable);
+    if (isSubtypeOf(nonNullableType1, nonNullableType2,
+        SubtypeCheckMode.withNullabilities)) {
+      return type1.withDeclaredNullability(intersectNullabilities(
+          type1.declaredNullability, type2.declaredNullability));
+    }
+    if (isSubtypeOf(nonNullableType2, nonNullableType1,
+        SubtypeCheckMode.withNullabilities)) {
+      return type2.withDeclaredNullability(intersectNullabilities(
+          type1.declaredNullability, type2.declaredNullability));
+    }
+
+    // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
+    if (type1 is FutureOrType) {
+      if (type2 is FutureOrType) {
+        // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
+        DartType argument = getStandardLowerBound(
+            type1.typeArgument, type2.typeArgument, clientLibrary);
+        return new FutureOrType(argument, argument.declaredNullability);
+      }
+      if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
+        // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
+        return new InterfaceType(
+            coreTypes.futureClass,
+            intersectNullabilities(
+                type1.declaredNullability, type2.declaredNullability),
+            <DartType>[
+              getStandardLowerBound(
+                  type1.typeArgument, type2.typeArguments[0], clientLibrary)
+            ]);
+      }
+      // GLB(FutureOr<A>, B) == GLB(A, B)
+      return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
+    }
+    // The if-statement below handles the following rule:
+    //     GLB(A, FutureOr<B>) ==  GLB(FutureOr<B>, A)
+    // It's broken down into sub-cases instead of making a recursive call to
+    // avoid making the checks that were already made above.  Note that at this
+    // point it's not possible for type1 to be a FutureOr.
+    if (type2 is FutureOrType) {
+      if (type1 is InterfaceType && type1.classNode == coreTypes.futureClass) {
+        // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
+        return new InterfaceType(
+            coreTypes.futureClass,
+            intersectNullabilities(
+                type1.declaredNullability, type2.declaredNullability),
+            <DartType>[
+              getStandardLowerBound(
+                  type2.typeArgument, type1.typeArguments[0], clientLibrary)
+            ]);
+      }
+      // GLB(A, FutureOr<B>) == GLB(B, A)
+      return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
+    }
+
+    // DOWN(T1, T2) = Never otherwise.
+    return new NeverType(intersectNullabilities(
+        type1.declaredNullability, type2.declaredNullability));
+  }
+
+  DartType _getNullabilityObliviousStandardLowerBound(
+      DartType type1, DartType type2, Library clientLibrary) {
+    // Do legacy erasure on the argument, so that the result types that are
+    // computed from arguments are legacy.
+    type1 = type1 == coreTypes.nullType
+        ? type1
+        : type1.withDeclaredNullability(Nullability.legacy);
+    type2 = type2 == coreTypes.nullType
+        ? type2
+        : type2.withDeclaredNullability(Nullability.legacy);
+
+    // For all types T, SLB(T,T) = T.  Note that we don't test for equality
+    // because we don't want to make the algorithm quadratic.  This is ok
+    // because the check is not needed for correctness; it's just a speed
+    // optimization.
+    if (identical(type1, type2)) {
+      return type1;
+    }
+
+    return getNullabilityObliviousStandardLowerBoundInternal(
+        type1, type2, clientLibrary);
+  }
+
+  DartType getNullabilityObliviousStandardLowerBoundInternal(
+      type1, type2, clientLibrary) {
+    // SLB(void, T) = SLB(T, void) = T.
+    if (type1 is VoidType) {
+      return type2;
+    }
+    if (type2 is VoidType) {
+      return type1;
+    }
+
+    // SLB(dynamic, T) = SLB(T, dynamic) = T if T is not void.
+    if (type1 is DynamicType) {
+      return type2;
+    }
+    if (type2 is DynamicType) {
+      return type1;
+    }
+
+    // SLB(Object, T) = SLB(T, Object) = T if T is not void or dynamic.
+    if (type1 == coreTypes.objectLegacyRawType) {
+      return type2;
+    }
+    if (type2 == coreTypes.objectLegacyRawType) {
+      return type1;
+    }
+
+    // SLB(bottom, T) = SLB(T, bottom) = bottom.
+    if (type1 is BottomType) return type1;
+    if (type2 is BottomType) return type2;
+    if (type1 == coreTypes.nullType) return type1;
+    if (type2 == coreTypes.nullType) return type2;
+
+    // Function types have structural lower bounds.
+    if (type1 is FunctionType && type2 is FunctionType) {
+      return _getNullabilityObliviousFunctionStandardLowerBound(
+          type1, type2, clientLibrary);
+    }
+
+    // Otherwise, the lower bounds  of two types is one of them it if it is a
+    // subtype of the other.
+    if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
+      return type1;
+    }
+
+    if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
+      return type2;
+    }
+
+    // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
+    if (type1 is FutureOrType) {
+      if (type2 is FutureOrType) {
+        // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
+        DartType argument = getStandardLowerBound(
+            type1.typeArgument, type2.typeArgument, clientLibrary);
+        return new FutureOrType(argument, argument.declaredNullability);
+      }
+      if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
+        // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
+        return new InterfaceType(
+            coreTypes.futureClass,
+            intersectNullabilities(
+                type1.declaredNullability, type2.declaredNullability),
+            <DartType>[
+              getStandardLowerBound(
+                  type1.typeArgument, type2.typeArguments[0], clientLibrary)
+            ]);
+      }
+      // GLB(FutureOr<A>, B) == GLB(A, B)
+      return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
+    }
+    // The if-statement below handles the following rule:
+    //     GLB(A, FutureOr<B>) ==  GLB(FutureOr<B>, A)
+    // It's broken down into sub-cases instead of making a recursive call to
+    // avoid making the checks that were already made above.  Note that at this
+    // point it's not possible for type1 to be a FutureOr.
+    if (type2 is FutureOrType) {
+      if (type1 is FutureOrType) {
+        // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
+        return new InterfaceType(
+            coreTypes.futureClass,
+            intersectNullabilities(
+                type1.declaredNullability, type2.declaredNullability),
+            <DartType>[
+              getStandardLowerBound(
+                  type2.typeArgument, type1.typeArgument, clientLibrary)
+            ]);
+      }
+      // GLB(A, FutureOr<B>) == GLB(B, A)
+      return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
+    }
+
+    // No subtype relation, so the lower bound is bottom.
+    return const BottomType();
+  }
+
+  /// Computes the standard upper bound of two types.
+  ///
+  /// Standard upper bound is an upper bound function that imposes an ordering
+  /// on the top types 'void', 'dynamic', and `object`.  This function
+  /// additionally handles the unknown type that appears during type inference.
+  DartType getStandardUpperBound(
+      DartType type1, DartType type2, Library clientLibrary) {
+    if (type1 is InvalidType || type2 is InvalidType) {
+      return const InvalidType();
+    }
+    if (clientLibrary.isNonNullableByDefault) {
+      return _getNullabilityAwareStandardUpperBound(
+          type1, type2, clientLibrary);
+    }
+    return _getNullabilityObliviousStandardUpperBound(
+        legacyErasure(coreTypes, type1),
+        legacyErasure(coreTypes, type2),
+        clientLibrary);
+  }
+
+  DartType _getNullabilityAwareStandardUpperBound(
+      DartType type1, DartType type2, Library clientLibrary) {
+    // UP(T, T) = T
+    if (identical(type1, type2)) return type1;
+
+    return getNullabilityAwareStandardUpperBoundInternal(
+        type1, type2, clientLibrary);
+  }
+
+  DartType getNullabilityAwareStandardUpperBoundInternal(
+      DartType type1, DartType type2, Library clientLibrary) {
+    // UP(T1, T2) where TOP(T1) and TOP(T2) =
+    //   T1 if MORETOP(T1, T2)
+    //   T2 otherwise
+    // UP(T1, T2) = T1 if TOP(T1)
+    // UP(T1, T2) = T2 if TOP(T2)
+    if (coreTypes.isTop(type1)) {
+      if (coreTypes.isTop(type2)) return moretop(type1, type2) ? type1 : type2;
+      return type1;
+    } else if (coreTypes.isTop(type2)) {
+      return type2;
+    }
+
+    // UP(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
+    //   T2 if MOREBOTTOM(T1, T2)
+    //   T1 otherwise
+    // UP(T1, T2) = T2 if BOTTOM(T1)
+    // UP(T1, T2) = T1 if BOTTOM(T2)
+    if (coreTypes.isBottom(type1)) {
+      if (coreTypes.isBottom(type2)) {
+        return morebottom(type1, type2) ? type2 : type1;
+      }
+      return type2;
+    } else if (coreTypes.isBottom(type2)) {
+      return type1;
+    }
+
+    // UP(T1, T2) where NULL(T1) and NULL(T2) =
+    //   T2 if MOREBOTTOM(T1, T2)
+    //   T1 otherwise
+    // UP(T1, T2) where NULL(T1) =
+    //   T2 if T2 is nullable
+    //   T2? otherwise
+    // UP(T1, T2) where NULL(T2) =
+    //   T1 if T1 is nullable
+    //   T1? otherwise
+    if (coreTypes.isNull(type1)) {
+      if (coreTypes.isNull(type2)) {
+        return morebottom(type1, type2) ? type2 : type1;
+      }
+      return type2.withDeclaredNullability(Nullability.nullable);
+    } else if (coreTypes.isNull(type2)) {
+      return type1.withDeclaredNullability(Nullability.nullable);
+    }
+
+    // UP(T1, T2) where OBJECT(T1) and OBJECT(T2) =
+    //   T1 if MORETOP(T1, T2)
+    //   T2 otherwise
+    // UP(T1, T2) where OBJECT(T1) =
+    //   T1 if T2 is non-nullable
+    //   T1? otherwise
+    // UP(T1, T2) where OBJECT(T2) =
+    //   T2 if T1 is non-nullable
+    //   T2? otherwise
+    if (coreTypes.isObject(type1)) {
+      if (coreTypes.isObject(type2)) {
+        return moretop(type1, type2) ? type1 : type2;
+      }
+      if (type2.declaredNullability == Nullability.nonNullable) {
+        return type1;
+      }
+      return type1.withDeclaredNullability(Nullability.nullable);
+    } else if (coreTypes.isObject(type2)) {
+      if (type1.declaredNullability == Nullability.nonNullable) {
+        return type2;
+      }
+      return type2.withDeclaredNullability(Nullability.nullable);
+    }
+
+    // The effect of the following rules is accounted for in the code below via
+    // the invocations of uniteNullabilities.
+    // UP(T1*, T2*) = S* where S is UP(T1, T2)
+    // UP(T1*, T2?) = S? where S is UP(T1, T2)
+    // UP(T1?, T2*) = S? where S is UP(T1, T2)
+    // UP(T1*, T2) = S* where S is UP(T1, T2)
+    // UP(T1, T2*) = S* where S is UP(T1, T2)
+    // UP(T1?, T2?) = S? where S is UP(T1, T2)
+    // UP(T1?, T2) = S? where S is UP(T1, T2)
+    // UP(T1, T2?) = S? where S is UP(T1, T2)
+
+    if (type1 is TypeParameterType) {
+      return _getNullabilityAwareTypeParameterStandardUpperBound(
+          type1, type2, clientLibrary);
+    }
+
+    if (type2 is TypeParameterType) {
+      return _getNullabilityAwareTypeParameterStandardUpperBound(
+          type2, type1, clientLibrary);
+    }
+
+    if (type1 is FunctionType) {
+      if (type2 is FunctionType) {
+        return _getNullabilityAwareFunctionStandardUpperBound(
+            type1, type2, clientLibrary);
+      }
+
+      if (type2 is InterfaceType &&
+          type2.classNode == coreTypes.functionClass) {
+        // UP(T Function<...>(...), Function) = Function
+        return coreTypes.functionRawType(uniteNullabilities(
+            type1.declaredNullability, type2.declaredNullability));
+      }
+
+      // UP(T Function<...>(...), T2) = Object
+      return coreTypes.objectRawType(uniteNullabilities(
+          type1.declaredNullability, type2.declaredNullability));
+    } else if (type2 is FunctionType) {
+      if (type1 is InterfaceType &&
+          type1.classNode == coreTypes.functionClass) {
+        // UP(Function, T Function<...>(...)) = Function
+        return coreTypes.functionRawType(uniteNullabilities(
+            type1.declaredNullability, type2.declaredNullability));
+      }
+
+      // UP(T1, T Function<...>(...)) = Object
+      return coreTypes.objectRawType(uniteNullabilities(
+          type1.declaredNullability, type2.declaredNullability));
+    }
+
+    if (type1 is FutureOrType || type2 is FutureOrType) {
+      if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
+        return type2;
+      }
+      if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+        return type1;
+      }
+      if (type1 is FutureOrType && type2 is FutureOrType) {
+        return new FutureOrType(
+            getStandardUpperBound(
+                type1.typeArgument, type2.typeArgument, clientLibrary),
+            uniteNullabilities(
+                type1.declaredNullability, type2.declaredNullability));
+      }
+    }
+
+    // UP(T1, T2) = T2 if T1 <: T2
+    //   Note that both types must be class types at this point.
+    assert(type1 is InterfaceType,
+        "Expected type1 to be an interface type, got '${type1.runtimeType}'.");
+    assert(type2 is InterfaceType,
+        "Expected type2 to be an interface type, got '${type2.runtimeType}'.");
+
+    // We use the non-nullable variants of the two interfaces types to determine
+    // T1 <: T2 without using the nullability of the outermost type. The result
+    // uses [uniteNullabilities] to compute the resulting type if the subtype
+    // relation is established.
+    InterfaceType nonNonNullableType1 =
+        type1.withDeclaredNullability(Nullability.nonNullable);
+    InterfaceType nonNonNullableType2 =
+        type2.withDeclaredNullability(Nullability.nonNullable);
+
+    if (isSubtypeOf(nonNonNullableType1, nonNonNullableType2,
+        SubtypeCheckMode.withNullabilities)) {
+      return type2.withDeclaredNullability(
+          uniteNullabilities(type1.nullability, type2.nullability));
+    }
+
+    // UP(T1, T2) = T1 if T2 <: T1
+    //   Note that both types must be class types at this point.
+    if (isSubtypeOf(nonNonNullableType2, nonNonNullableType1,
+        SubtypeCheckMode.withNullabilities)) {
+      return type1.withDeclaredNullability(uniteNullabilities(
+          type1.declaredNullability, type2.declaredNullability));
+    }
+
+    // UP(C<T0, ..., Tn>, C<S0, ..., Sn>) = C<R0,..., Rn> where Ri is UP(Ti, Si)
+    if (type1 is InterfaceType && type2 is InterfaceType) {
+      Class klass = type1.classNode;
+      if (type2.classNode == klass) {
+        int n = klass.typeParameters.length;
+        List<DartType> leftArguments = type1.typeArguments;
+        List<DartType> rightArguments = type2.typeArguments;
+        List<DartType> typeArguments = new List<DartType>(n);
+        for (int i = 0; i < n; ++i) {
+          int variance = klass.typeParameters[i].variance;
+          if (variance == Variance.contravariant) {
+            typeArguments[i] = _getNullabilityAwareStandardLowerBound(
+                leftArguments[i], rightArguments[i], clientLibrary);
+          } else if (variance == Variance.invariant) {
+            if (!areMutualSubtypes(leftArguments[i], rightArguments[i],
+                SubtypeCheckMode.withNullabilities)) {
+              return hierarchy.getLegacyLeastUpperBound(
+                  type1, type2, clientLibrary);
+            }
+          } else {
+            typeArguments[i] = _getNullabilityAwareStandardUpperBound(
+                leftArguments[i], rightArguments[i], clientLibrary);
+          }
+        }
+        return new InterfaceType(
+            klass,
+            uniteNullabilities(
+                type1.declaredNullability, type2.declaredNullability),
+            typeArguments);
+      }
+    }
+
+    // UP(C0<T0, ..., Tn>, C1<S0, ..., Sk>)
+    //   = least upper bound of two interfaces as in Dart 1.
+    return hierarchy.getLegacyLeastUpperBound(type1, type2, clientLibrary);
+  }
+
+  /// Computes the nullability-aware lower bound of two function types.
+  ///
+  /// The algorithm is defined as follows:
+  /// DOWN(
+  ///   <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k) -> T0,
+  ///   <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1l) -> T1)
+  /// =
+  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
+  /// if:
+  ///   each B0i and B1i are equal types (syntactically),
+  ///   q is max(k, l),
+  ///   R0 is DOWN(T0, T1),
+  ///   B2i is B0i,
+  ///   P2i is UP(P0i, P1i) for i <= than min(k, l),
+  ///   P2i is P0i for k < i <= q,
+  ///   P2i is P1i for l < i <= q, and
+  ///   P2i is optional if P0i or P1i is optional.
+  ///
+  /// DOWN(
+  ///   <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k, Named0) -> T0,
+  ///   <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1k, Named1) -> T1)
+  /// =
+  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
+  /// if:
+  ///   each B0i and B1i are equal types (syntactically),
+  ///   R0 is DOWN(T0, T1),
+  ///   B2i is B0i,
+  ///   P2i is UP(P0i, P1i),
+  ///   Named2 contains R2i xi for each xi in both Named0 and Named1,
+  ///     where R0i xi is in Named0,
+  ///     where R1i xi is in Named1,
+  ///     and R2i is UP(R0i, R1i),
+  ///     and R2i xi is required if xi is required in both Named0 and Named1,
+  ///   Named2 contains R0i xi for each xi in Named0 and not Named1,
+  ///     where xi is optional in Named2,
+  ///   Named2 contains R1i xi for each xi in Named1 and not Named0, and
+  ///     where xi is optional in Named2.
+  /// DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
+  DartType _getNullabilityAwareFunctionStandardLowerBound(
+      FunctionType f, FunctionType g, Library clientLibrary) {
+    bool haveNamed =
+        f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
+    bool haveOptionalPositional =
+        f.requiredParameterCount < f.positionalParameters.length ||
+            g.requiredParameterCount < g.positionalParameters.length;
+
+    // The fallback result for whenever the following rule applies:
+    //     DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
+    final DartType fallbackResult = new NeverType(
+        intersectNullabilities(f.declaredNullability, g.declaredNullability));
+
+    if (haveNamed && haveOptionalPositional) return fallbackResult;
+    if (haveNamed &&
+        f.positionalParameters.length != g.positionalParameters.length) {
+      return fallbackResult;
+    }
+
+    int m = f.typeParameters.length;
+    bool boundsMatch = false;
+    Substitution substitution = Substitution.empty;
+    if (g.typeParameters.length == m) {
+      boundsMatch = true;
+      if (m != 0) {
+        Map<TypeParameter, DartType> substitutionMap =
+            <TypeParameter, DartType>{};
+        for (int i = 0; i < m; ++i) {
+          substitutionMap[g.typeParameters[i]] =
+              new TypeParameterType.forAlphaRenaming(
+                  g.typeParameters[i], f.typeParameters[i]);
+        }
+        substitution = Substitution.fromMap(substitutionMap);
+        for (int i = 0; i < m && boundsMatch; ++i) {
+          // TODO(dmitryas): Figure out if a procedure for syntactic equality
+          // should be used instead.
+          if (!areMutualSubtypes(
+              f.typeParameters[i].bound,
+              substitution.substituteType(g.typeParameters[i].bound),
+              SubtypeCheckMode.withNullabilities)) {
+            boundsMatch = false;
+          }
+        }
+      }
+    }
+    if (!boundsMatch) return fallbackResult;
+    int maxPos =
+        math.max(f.positionalParameters.length, g.positionalParameters.length);
+    int minPos =
+        math.min(f.positionalParameters.length, g.positionalParameters.length);
+
+    List<TypeParameter> typeParameters = f.typeParameters;
+
+    List<DartType> positionalParameters =
+        new List<DartType>.filled(maxPos, null);
+    for (int i = 0; i < minPos; ++i) {
+      positionalParameters[i] = _getNullabilityAwareStandardUpperBound(
+          f.positionalParameters[i],
+          substitution.substituteType(g.positionalParameters[i]),
+          clientLibrary);
+    }
+    for (int i = minPos; i < f.positionalParameters.length; ++i) {
+      positionalParameters[i] = f.positionalParameters[i];
+    }
+    for (int i = minPos; i < g.positionalParameters.length; ++i) {
+      positionalParameters[i] =
+          substitution.substituteType(g.positionalParameters[i]);
+    }
+
+    List<NamedType> namedParameters = <NamedType>[];
+    {
+      // Assuming that the named parameters of both types are sorted
+      // lexicographically.
+      int i = 0;
+      int j = 0;
+      while (i < f.namedParameters.length && j < g.namedParameters.length) {
+        NamedType named1 = f.namedParameters[i];
+        NamedType named2 = g.namedParameters[j];
+        int order = named1.name.compareTo(named2.name);
+        NamedType named;
+        if (order < 0) {
+          named = new NamedType(named1.name, named1.type, isRequired: false);
+          ++i;
+        } else if (order > 0) {
+          named = !named2.isRequired
+              ? named2
+              : new NamedType(
+                  named2.name, substitution.substituteType(named2.type),
+                  isRequired: false);
+          ++j;
+        } else {
+          named = new NamedType(
+              named1.name,
+              _getNullabilityAwareStandardUpperBound(named1.type,
+                  substitution.substituteType(named2.type), clientLibrary),
+              isRequired: named1.isRequired && named2.isRequired);
+          ++i;
+          ++j;
+        }
+        namedParameters.add(named);
+      }
+      while (i < f.namedParameters.length) {
+        NamedType named1 = f.namedParameters[i];
+        namedParameters.add(!named1.isRequired
+            ? named1
+            : new NamedType(named1.name, named1.type, isRequired: false));
+        ++i;
+      }
+      while (j < g.namedParameters.length) {
+        NamedType named2 = g.namedParameters[j];
+        namedParameters.add(new NamedType(
+            named2.name, substitution.substituteType(named2.type),
+            isRequired: false));
+        ++j;
+      }
+    }
+
+    DartType returnType = _getNullabilityAwareStandardLowerBound(
+        f.returnType, substitution.substituteType(g.returnType), clientLibrary);
+
+    return new FunctionType(positionalParameters, returnType,
+        intersectNullabilities(f.declaredNullability, g.declaredNullability),
+        namedParameters: namedParameters,
+        typeParameters: typeParameters,
+        requiredParameterCount: minPos);
+  }
+
+  /// Computes the nullability-aware lower bound of two function types.
+  ///
+  /// UP(
+  ///   <X0 extends B00, ... Xm extends B0m>(P00, ... P0k) -> T0,
+  ///   <X0 extends B10, ... Xm extends B1m>(P10, ... P1l) -> T1)
+  /// =
+  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
+  /// if:
+  ///   each B0i and B1i are equal types (syntactically)
+  ///   Both have the same number of required positional parameters
+  ///   q is min(k, l)
+  ///   R0 is UP(T0, T1)
+  ///   B2i is B0i
+  ///   P2i is DOWN(P0i, P1i)
+  /// UP(
+  ///   <X0 extends B00, ... Xm extends B0m>(P00, ... P0k, Named0) -> T0,
+  ///   <X0 extends B10, ... Xm extends B1m>(P10, ... P1k, Named1) -> T1)
+  /// =
+  ///   <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
+  /// if:
+  ///   each B0i and B1i are equal types (syntactically)
+  ///   All positional parameters are required
+  ///   R0 is UP(T0, T1)
+  ///   B2i is B0i
+  ///   P2i is DOWN(P0i, P1i)
+  ///   Named0 contains R0i xi
+  ///       if R1i xi is a required named parameter in Named1
+  ///   Named1 contains R1i xi
+  ///       if R0i xi is a required named parameter in Named0
+  ///   Named2 contains exactly R2i xi
+  ///       for each xi in both Named0 and Named1
+  ///     where R0i xi is in Named0
+  ///     where R1i xi is in Named1
+  ///     and R2i is DOWN(R0i, R1i)
+  ///     and R2i xi is required
+  ///         if xi is required in either Named0 or Named1
+  /// UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
+  DartType _getNullabilityAwareFunctionStandardUpperBound(
+      FunctionType f, FunctionType g, Library clientLibrary) {
+    bool haveNamed =
+        f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
+    bool haveOptionalPositional =
+        f.requiredParameterCount < f.positionalParameters.length ||
+            g.requiredParameterCount < g.positionalParameters.length;
+
+    // The return value for whenever the following applies:
+    //     UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
+    final DartType fallbackResult = coreTypes.functionRawType(
+        uniteNullabilities(f.declaredNullability, g.declaredNullability));
+
+    if (haveNamed && haveOptionalPositional) return fallbackResult;
+    if (!haveNamed && f.requiredParameterCount != g.requiredParameterCount) {
+      return fallbackResult;
+    }
+    // Here we perform a quick check on the function types to figure out if we
+    // can compute a non-trivial upper bound for them.  The check isn't merged
+    // with the computation of the non-trivial upper bound itself to avoid
+    // performing unnecessary computations.
+    if (haveNamed) {
+      if (f.positionalParameters.length != g.positionalParameters.length) {
+        return fallbackResult;
+      }
+      // Assuming that the named parameters are sorted lexicographically in
+      // both type1 and type2.
+      int i = 0;
+      int j = 0;
+      while (i < f.namedParameters.length && j < g.namedParameters.length) {
+        NamedType named1 = f.namedParameters[i];
+        NamedType named2 = g.namedParameters[j];
+        int order = named1.name.compareTo(named2.name);
+        if (order < 0) {
+          if (named1.isRequired) return fallbackResult;
+          ++i;
+        } else if (order > 0) {
+          if (named2.isRequired) return fallbackResult;
+          ++j;
+        } else {
+          ++i;
+          ++j;
+        }
+      }
+      while (i < f.namedParameters.length) {
+        if (f.namedParameters[i].isRequired) return fallbackResult;
+        ++i;
+      }
+      while (j < g.namedParameters.length) {
+        if (g.namedParameters[j].isRequired) return fallbackResult;
+        ++j;
+      }
+    }
+
+    int m = f.typeParameters.length;
+    bool boundsMatch = false;
+    Substitution substitution = Substitution.empty;
+    if (g.typeParameters.length == m) {
+      boundsMatch = true;
+      if (m != 0) {
+        Map<TypeParameter, DartType> substitutionMap =
+            <TypeParameter, DartType>{};
+        for (int i = 0; i < m; ++i) {
+          substitutionMap[g.typeParameters[i]] =
+              new TypeParameterType.forAlphaRenaming(
+                  g.typeParameters[i], f.typeParameters[i]);
+        }
+        substitution = Substitution.fromMap(substitutionMap);
+        for (int i = 0; i < m && boundsMatch; ++i) {
+          // TODO(dmitryas): Figure out if a procedure for syntactic
+          // equality should be used instead.
+          if (!areMutualSubtypes(
+              f.typeParameters[i].bound,
+              substitution.substituteType(g.typeParameters[i].bound),
+              SubtypeCheckMode.withNullabilities)) {
+            boundsMatch = false;
+          }
+        }
+      }
+    }
+    if (!boundsMatch) return fallbackResult;
+    int minPos =
+        math.min(f.positionalParameters.length, g.positionalParameters.length);
+
+    List<TypeParameter> typeParameters = f.typeParameters;
+
+    List<DartType> positionalParameters =
+        new List<DartType>.filled(minPos, null);
+    for (int i = 0; i < minPos; ++i) {
+      positionalParameters[i] = _getNullabilityAwareStandardLowerBound(
+          f.positionalParameters[i],
+          substitution.substituteType(g.positionalParameters[i]),
+          clientLibrary);
+    }
+
+    List<NamedType> namedParameters = <NamedType>[];
+    {
+      // Assuming that the named parameters of both types are sorted
+      // lexicographically.
+      int i = 0;
+      int j = 0;
+      while (i < f.namedParameters.length && j < g.namedParameters.length) {
+        NamedType named1 = f.namedParameters[i];
+        NamedType named2 = g.namedParameters[j];
+        int order = named1.name.compareTo(named2.name);
+        if (order < 0) {
+          ++i;
+        } else if (order > 0) {
+          ++j;
+        } else {
+          namedParameters.add(new NamedType(
+              named1.name,
+              _getNullabilityAwareStandardLowerBound(named1.type,
+                  substitution.substituteType(named2.type), clientLibrary),
+              isRequired: named1.isRequired || named2.isRequired));
+          ++i;
+          ++j;
+        }
+      }
+    }
+
+    DartType returnType = _getNullabilityAwareStandardUpperBound(
+        f.returnType, substitution.substituteType(g.returnType), clientLibrary);
+
+    return new FunctionType(positionalParameters, returnType,
+        uniteNullabilities(f.declaredNullability, g.declaredNullability),
+        namedParameters: namedParameters,
+        typeParameters: typeParameters,
+        requiredParameterCount: f.requiredParameterCount);
+  }
+
+  DartType _getNullabilityAwareTypeParameterStandardUpperBound(
+      TypeParameterType type1, DartType type2, Library clientLibrary) {
+    if (type1.promotedBound == null) {
+      // UP(X1 extends B1, T2) =
+      //   T2 if X1 <: T2
+      //   otherwise X1 if T2 <: X1
+      //   otherwise UP(B1[Object/X1], T2)
+      if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
+        return type2.withDeclaredNullability(uniteNullabilities(
+            type1.declaredNullability, type2.declaredNullability));
+      }
+      if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+        return type1.withDeclaredNullability(uniteNullabilities(
+            type1.declaredNullability, type2.declaredNullability));
+      }
+      Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
+        type1.parameter: coreTypes.objectNonNullableRawType
+      };
+      return _getNullabilityAwareStandardUpperBound(
+              substitute(type1.parameter.bound, substitution),
+              type2,
+              clientLibrary)
+          .withDeclaredNullability(uniteNullabilities(
+              type1.declaredNullability, type2.declaredNullability));
+    } else {
+      // UP(X1 & B1, T2) =
+      //   T2 if X1 <: T2
+      //   otherwise X1 if T2 <: X1
+      //   otherwise UP(B1[Object/X1], T2)
+      DartType demoted =
+          new TypeParameterType(type1.parameter, type1.declaredNullability);
+      if (isSubtypeOf(demoted, type2, SubtypeCheckMode.withNullabilities)) {
+        return type2.withDeclaredNullability(uniteNullabilities(
+            type1.declaredNullability, type2.declaredNullability));
+      }
+      if (isSubtypeOf(type2, demoted, SubtypeCheckMode.withNullabilities)) {
+        return demoted.withDeclaredNullability(uniteNullabilities(
+            type1.declaredNullability, type2.declaredNullability));
+      }
+      Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
+        type1.parameter: coreTypes.objectNonNullableRawType
+      };
+      return _getNullabilityAwareStandardUpperBound(
+              substitute(type1.promotedBound, substitution),
+              type2,
+              clientLibrary)
+          .withDeclaredNullability(uniteNullabilities(
+              type1.declaredNullability, type2.declaredNullability));
+    }
+  }
+
+  DartType _getNullabilityObliviousStandardUpperBound(
+      DartType type1, DartType type2, Library clientLibrary) {
+    /*assert(type1 == legacyErasure(coreTypes, type1),
+        "Non-legacy type $type1 in inference.");
+    assert(type2 == legacyErasure(coreTypes, type2),
+        "Non-legacy type $type2 in inference.");*/
+    // For all types T, SUB(T,T) = T.  Note that we don't test for equality
+    // because we don't want to make the algorithm quadratic.  This is ok
+    // because the check is not needed for correctness; it's just a speed
+    // optimization.
+    if (identical(type1, type2)) {
+      return type1;
+    }
+
+    return getNullabilityObliviousStandardUpperBoundInternal(
+        type1, type2, clientLibrary);
+  }
+
+  DartType getNullabilityObliviousStandardUpperBoundInternal(
+      DartType type1, DartType type2, Library clientLibrary) {
+    // SUB(void, T) = SUB(T, void) = void.
+    if (type1 is VoidType) {
+      return type1;
+    }
+    if (type2 is VoidType) {
+      return type2;
+    }
+
+    // SUB(dynamic, T) = SUB(T, dynamic) = dynamic if T is not void.
+    if (type1 is DynamicType) {
+      return type1;
+    }
+    if (type2 is DynamicType) {
+      return type2;
+    }
+
+    // SUB(Object, T) = SUB(T, Object) = Object if T is not void or dynamic.
+    if (type1 == coreTypes.objectLegacyRawType) {
+      return type1;
+    }
+    if (type2 == coreTypes.objectLegacyRawType) {
+      return type2;
+    }
+
+    // SUB(bottom, T) = SUB(T, bottom) = T.
+    if (type1 is BottomType) return type2;
+    if (type2 is BottomType) return type1;
+    if (type1 == coreTypes.nullType) return type2;
+    if (type2 == coreTypes.nullType) return type1;
+
+    if (type1 is TypeParameterType || type2 is TypeParameterType) {
+      return _getNullabilityObliviousTypeParameterStandardUpperBound(
+          type1, type2, clientLibrary);
+    }
+
+    // The standard upper bound of a function type and an interface type T is
+    // the standard upper bound of Function and T.
+    if (type1 is FunctionType &&
+        (type2 is InterfaceType || type2 is FutureOrType)) {
+      type1 = coreTypes.functionLegacyRawType;
+    }
+    if (type2 is FunctionType &&
+        (type1 is InterfaceType || type2 is FutureOrType)) {
+      type2 = coreTypes.functionLegacyRawType;
+    }
+
+    // At this point type1 and type2 should both either be interface types or
+    // function types.
+    if (type1 is InterfaceType && type2 is InterfaceType) {
+      return _getInterfaceStandardUpperBound(type1, type2, clientLibrary);
+    }
+
+    if (type1 is FunctionType && type2 is FunctionType) {
+      return _getNullabilityObliviousFunctionStandardUpperBound(
+          type1, type2, clientLibrary);
+    }
+
+    if (type1 is FutureOrType || type2 is FutureOrType) {
+      if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
+        return type2;
+      }
+      if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
+        return type1;
+      }
+      if (type1 is FutureOrType && type2 is FutureOrType) {
+        return new FutureOrType(
+            getStandardUpperBound(
+                type1.typeArgument, type2.typeArgument, clientLibrary),
+            uniteNullabilities(
+                type1.declaredNullability, type2.declaredNullability));
+      }
+    }
+
+    if (type1 is InvalidType || type2 is InvalidType) {
+      return const InvalidType();
+    }
+
+    // Should never happen. As a defensive measure, return the dynamic type.
+    assert(false, "type1 = $type1; type2 = $type2");
+    return const DynamicType();
+  }
+
+  /// Compute the standard lower bound of function types [f] and [g].
+  ///
+  /// The spec rules for SLB on function types, informally, are pretty simple:
+  ///
+  /// - If a parameter is required in both, it stays required.
+  ///
+  /// - If a positional parameter is optional or missing in one, it becomes
+  ///   optional.  (This is because we're trying to build a function type which
+  ///   is a subtype of both [f] and [g], meaning it accepts all possible inputs
+  ///   that [f] and [g] accept.)
+  ///
+  /// - Named parameters are unioned together.
+  ///
+  /// - For any parameter that exists in both functions, use the SUB of them as
+  ///   the resulting parameter type.
+  ///
+  /// - Use the SLB of their return types.
+  DartType _getNullabilityObliviousFunctionStandardLowerBound(
+      FunctionType f, FunctionType g, Library clientLibrary) {
+    // TODO(rnystrom,paulberry): Right now, this assumes f and g do not have any
+    // type parameters. Revisit that in the presence of generic methods.
+
+    // Calculate the SUB of each corresponding pair of parameters.
+    int totalPositional =
+        math.max(f.positionalParameters.length, g.positionalParameters.length);
+    List<DartType> positionalParameters = new List<DartType>(totalPositional);
+    for (int i = 0; i < totalPositional; i++) {
+      if (i < f.positionalParameters.length) {
+        DartType fType = f.positionalParameters[i];
+        if (i < g.positionalParameters.length) {
+          DartType gType = g.positionalParameters[i];
+          positionalParameters[i] =
+              getStandardUpperBound(fType, gType, clientLibrary);
+        } else {
+          positionalParameters[i] = fType;
+        }
+      } else {
+        positionalParameters[i] = g.positionalParameters[i];
+      }
+    }
+
+    // Parameters that are required in both functions are required in the
+    // result.  Parameters that are optional or missing in either end up
+    // optional.
+    int requiredParameterCount =
+        math.min(f.requiredParameterCount, g.requiredParameterCount);
+    bool hasPositional = requiredParameterCount < totalPositional;
+
+    // Union the named parameters together.
+    List<NamedType> namedParameters = [];
+    {
+      int i = 0;
+      int j = 0;
+      while (true) {
+        if (i < f.namedParameters.length) {
+          if (j < g.namedParameters.length) {
+            String fName = f.namedParameters[i].name;
+            String gName = g.namedParameters[j].name;
+            int order = fName.compareTo(gName);
+            if (order < 0) {
+              namedParameters.add(f.namedParameters[i++]);
+            } else if (order > 0) {
+              namedParameters.add(g.namedParameters[j++]);
+            } else {
+              namedParameters.add(new NamedType(
+                  fName,
+                  getStandardUpperBound(f.namedParameters[i++].type,
+                      g.namedParameters[j++].type, clientLibrary)));
+            }
+          } else {
+            namedParameters.addAll(f.namedParameters.skip(i));
+            break;
+          }
+        } else {
+          namedParameters.addAll(g.namedParameters.skip(j));
+          break;
+        }
+      }
+    }
+    bool hasNamed = namedParameters.isNotEmpty;
+
+    // Edge case. Dart does not support functions with both optional positional
+    // and named parameters. If we would synthesize that, give up.
+    if (hasPositional && hasNamed) return const BottomType();
+
+    // Calculate the SLB of the return type.
+    DartType returnType =
+        getStandardLowerBound(f.returnType, g.returnType, clientLibrary);
+    return new FunctionType(positionalParameters, returnType,
+        intersectNullabilities(f.declaredNullability, g.declaredNullability),
+        namedParameters: namedParameters,
+        requiredParameterCount: requiredParameterCount);
+  }
+
+  /// Compute the standard upper bound of function types [f] and [g].
+  ///
+  /// The rules for SUB on function types, informally, are pretty simple:
+  ///
+  /// - If the functions don't have the same number of required parameters,
+  ///   always return `Function`.
+  ///
+  /// - Discard any optional named or positional parameters the two types do not
+  ///   have in common.
+  ///
+  /// - Compute the SLB of each corresponding pair of parameter types, and the
+  ///   SUB of the return types.  Return a function type with those types.
+  DartType _getNullabilityObliviousFunctionStandardUpperBound(
+      FunctionType f, FunctionType g, Library clientLibrary) {
+    // TODO(rnystrom): Right now, this assumes f and g do not have any type
+    // parameters. Revisit that in the presence of generic methods.
+
+    // If F and G differ in their number of required parameters, then the
+    // standard upper bound of F and G is Function.
+    // TODO(paulberry): We could do better here, e.g.:
+    //   SUB(([int]) -> void, (int) -> void) = (int) -> void
+    if (f.requiredParameterCount != g.requiredParameterCount) {
+      return new InterfaceType(
+          coreTypes.functionClass,
+          uniteNullabilities(f.declaredNullability, g.declaredNullability),
+          const <DynamicType>[]);
+    }
+    int requiredParameterCount = f.requiredParameterCount;
+
+    // Calculate the SLB of each corresponding pair of parameters.
+    // Ignore any extra optional positional parameters if one has more than the
+    // other.
+    int totalPositional =
+        math.min(f.positionalParameters.length, g.positionalParameters.length);
+    List<DartType> positionalParameters = new List<DartType>(totalPositional);
+    for (int i = 0; i < totalPositional; i++) {
+      positionalParameters[i] = getStandardLowerBound(
+          f.positionalParameters[i], g.positionalParameters[i], clientLibrary);
+    }
+
+    // Intersect the named parameters.
+    List<NamedType> namedParameters = [];
+    {
+      int i = 0;
+      int j = 0;
+      while (true) {
+        if (i < f.namedParameters.length) {
+          if (j < g.namedParameters.length) {
+            String fName = f.namedParameters[i].name;
+            String gName = g.namedParameters[j].name;
+            int order = fName.compareTo(gName);
+            if (order < 0) {
+              i++;
+            } else if (order > 0) {
+              j++;
+            } else {
+              namedParameters.add(new NamedType(
+                  fName,
+                  getStandardLowerBound(f.namedParameters[i++].type,
+                      g.namedParameters[j++].type, clientLibrary)));
+            }
+          } else {
+            break;
+          }
+        } else {
+          break;
+        }
+      }
+    }
+
+    // Calculate the SUB of the return type.
+    DartType returnType =
+        getStandardUpperBound(f.returnType, g.returnType, clientLibrary);
+    return new FunctionType(positionalParameters, returnType,
+        uniteNullabilities(f.declaredNullability, g.declaredNullability),
+        namedParameters: namedParameters,
+        requiredParameterCount: requiredParameterCount);
+  }
+
+  DartType _getInterfaceStandardUpperBound(
+      InterfaceType type1, InterfaceType type2, Library clientLibrary) {
+    // This currently does not implement a very complete standard upper bound
+    // algorithm, but handles a couple of the very common cases that are
+    // causing pain in real code.  The current algorithm is:
+    // 1. If either of the types is a supertype of the other, return it.
+    //    This is in fact the best result in this case.
+    // 2. If the two types have the same class element and is implicitly or
+    //    explicitly covariant, then take the pointwise standard upper bound of
+    //    the type arguments. This is again the best result, except that the
+    //    recursive calls may not return the true standard upper bounds.  The
+    //    result is guaranteed to be a well-formed type under the assumption
+    //    that the input types were well-formed (and assuming that the
+    //    recursive calls return well-formed types).
+    //    If the variance of the type parameter is contravariant, we take the
+    //    standard lower bound of the type arguments. If the variance of the
+    //    type parameter is invariant, we verify if the type arguments satisfy
+    //    subtyping in both directions, then choose a bound.
+    // 3. Otherwise return the spec-defined standard upper bound.  This will
+    //    be an upper bound, might (or might not) be least, and might
+    //    (or might not) be a well-formed type.
+    if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
+      return type2;
+    }
+    if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+      return type1;
+    }
+    if (identical(type1.classNode, type2.classNode)) {
+      List<DartType> tArgs1 = type1.typeArguments;
+      List<DartType> tArgs2 = type2.typeArguments;
+      List<TypeParameter> tParams = type1.classNode.typeParameters;
+
+      assert(tArgs1.length == tArgs2.length);
+      assert(tArgs1.length == tParams.length);
+      List<DartType> tArgs = new List(tArgs1.length);
+      for (int i = 0; i < tArgs1.length; i++) {
+        if (tParams[i].variance == Variance.contravariant) {
+          tArgs[i] = getStandardLowerBound(tArgs1[i], tArgs2[i], clientLibrary);
+        } else if (tParams[i].variance == Variance.invariant) {
+          if (!areMutualSubtypes(
+              tArgs1[i], tArgs2[i], SubtypeCheckMode.withNullabilities)) {
+            // No bound will be valid, find bound at the interface level.
+            return hierarchy.getLegacyLeastUpperBound(
+                type1, type2, clientLibrary);
+          }
+          // TODO (kallentu) : Fix asymmetric bounds behavior for invariant type
+          //  parameters.
+          tArgs[i] = tArgs1[i];
+        } else {
+          tArgs[i] = getStandardUpperBound(tArgs1[i], tArgs2[i], clientLibrary);
+        }
+      }
+      return new InterfaceType(
+          type1.classNode,
+          uniteNullabilities(
+              type1.declaredNullability, type2.declaredNullability),
+          tArgs);
+    }
+    return hierarchy.getLegacyLeastUpperBound(type1, type2, clientLibrary);
+  }
+
+  DartType _getNullabilityObliviousTypeParameterStandardUpperBound(
+      DartType type1, DartType type2, Library clientLibrary) {
+    // This currently just implements a simple standard upper bound to
+    // handle some common cases.  It also avoids some termination issues
+    // with the naive spec algorithm.  The standard upper bound of two types
+    // (at least one of which is a type parameter) is computed here as:
+    // 1. If either type is a supertype of the other, return it.
+    // 2. If the first type is a type parameter, replace it with its bound,
+    //    with recursive occurrences of itself replaced with Object.
+    //    The second part of this should ensure termination.  Informally,
+    //    each type variable instantiation in one of the arguments to the
+    //    standard upper bound algorithm now strictly reduces the number
+    //    of bound variables in scope in that argument position.
+    // 3. If the second type is a type parameter, do the symmetric operation
+    //    to #2.
+    //
+    // It's not immediately obvious why this is symmetric in the case that both
+    // of them are type parameters.  For #1, symmetry holds since subtype
+    // is antisymmetric.  For #2, it's clearly not symmetric if upper bounds of
+    // bottom are allowed.  Ignoring this (for various reasons, not least
+    // of which that there's no way to write it), there's an informal
+    // argument (that might even be right) that you will always either
+    // end up expanding both of them or else returning the same result no matter
+    // which order you expand them in.  A key observation is that
+    // identical(expand(type1), type2) => subtype(type1, type2)
+    // and hence the contra-positive.
+    //
+    // TODO(leafp): Think this through and figure out what's the right
+    // definition.  Be careful about termination.
+    //
+    // I suspect in general a reasonable algorithm is to expand the innermost
+    // type variable first.  Alternatively, you could probably choose to treat
+    // it as just an instance of the interface type upper bound problem, with
+    // the "inheritance" chain extended by the bounds placed on the variables.
+    if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
+      return type2;
+    }
+    if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
+      return type1;
+    }
+    if (type1 is TypeParameterType) {
+      // TODO(paulberry): Analyzer collapses simple bounds in one step, i.e. for
+      // C<T extends U, U extends List>, T gets resolved directly to List.  Do
+      // we need to replicate that behavior?
+      return getStandardUpperBound(
+          Substitution.fromMap({type1.parameter: coreTypes.objectLegacyRawType})
+              .substituteType(type1.parameter.bound),
+          type2,
+          clientLibrary);
+    } else if (type2 is TypeParameterType) {
+      return getStandardUpperBound(
+          type1,
+          Substitution.fromMap({type2.parameter: coreTypes.objectLegacyRawType})
+              .substituteType(type2.parameter.bound),
+          clientLibrary);
+    } else {
+      // We should only be called when at least one of the types is a
+      // TypeParameterType
+      assert(false);
+      return const DynamicType();
+    }
+  }
+}
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index a50dde0..88e6940 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -31,11 +31,28 @@
 
 import '../type_environment.dart' show IsSubtypeOf, SubtypeCheckMode;
 
-class Types {
+import '../src/standard_bounds.dart';
+
+class Types with StandardBounds {
+  @override
   final ClassHierarchyBase hierarchy;
 
   Types(this.hierarchy);
 
+  @override
+  CoreTypes get coreTypes => hierarchy.coreTypes;
+
+  bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
+    IsSubtypeOf result = performNullabilityAwareMutualSubtypesCheck(s, t);
+    switch (mode) {
+      case SubtypeCheckMode.ignoringNullabilities:
+        return result.isSubtypeWhenIgnoringNullabilities();
+      case SubtypeCheckMode.withNullabilities:
+        return result.isSubtypeWhenUsingNullabilities();
+    }
+    return throw new StateError("Unhandled subtype check mode '$mode'.");
+  }
+
   bool _isSubtypeFromMode(IsSubtypeOf isSubtypeOf, SubtypeCheckMode mode) {
     switch (mode) {
       case SubtypeCheckMode.withNullabilities:
@@ -48,6 +65,7 @@
   }
 
   /// Returns true if [s] is a subtype of [t].
+  @override
   bool isSubtypeOf(DartType s, DartType t, SubtypeCheckMode mode) {
     IsSubtypeOf result = performNullabilityAwareSubtypeCheck(s, t);
     return _isSubtypeFromMode(result, mode);
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 15e0289..314803a 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -325,7 +325,7 @@
         hierarchy.getDispatchTarget(lookupClass, new Name("noSuchMethod"));
     String methodNameUsed = (isGetter)
         ? "get:$methodName"
-        : (isSetter) ? "set:$methodName" : methodName;
+        : (isSetter) ? "set:$methodName=" : methodName;
     if (noSuchMethod != null &&
         noSuchMethod.function.positionalParameters.length == 1 &&
         noSuchMethod.function.namedParameters.isEmpty) {
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 662ebfd..4661aeb 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -4,6 +4,7 @@
 library kernel.type_algebra;
 
 import 'ast.dart';
+import 'core_types.dart';
 
 /// Returns a type where all occurrences of the given type parameters have been
 /// replaced with the corresponding types.
@@ -1021,3 +1022,77 @@
   @override
   bool visitVoidType(VoidType node) => true;
 }
+
+/// Removes the application of ? or * from the type.
+///
+/// Some types are nullable even without the application of the nullable type
+/// constructor at the top level, for example, Null or FutureOr<int?>.
+// TODO(dmitryas): Remove [coreTypes] parameter when NullType is landed.
+DartType unwrapNullabilityConstructor(DartType type, CoreTypes coreTypes) {
+  return type.accept1(const _NullabilityConstructorUnwrapper(), coreTypes);
+}
+
+/// Implementation of [unwrapNullabilityConstructor] as a visitor.
+///
+/// Implementing the function as a visitor makes the necessity of supporting a new implementation of [DartType] visible at compile time.
+// TODO(dmitryas): Remove CoreTypes as the second argument when NullType is landed.
+class _NullabilityConstructorUnwrapper
+    implements DartTypeVisitor1<DartType, CoreTypes> {
+  const _NullabilityConstructorUnwrapper();
+
+  @override
+  DartType defaultDartType(DartType node, CoreTypes coreTypes) {
+    throw new UnsupportedError(
+        "Unsupported operation: _NullabilityConstructorUnwrapper(${node.runtimeType})");
+  }
+
+  @override
+  DartType visitBottomType(BottomType node, CoreTypes coreTypes) => node;
+
+  @override
+  DartType visitDynamicType(DynamicType node, CoreTypes coreTypes) => node;
+
+  @override
+  DartType visitFunctionType(FunctionType node, CoreTypes coreTypes) {
+    return node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitFutureOrType(FutureOrType node, CoreTypes coreTypes) {
+    return node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitInterfaceType(InterfaceType node, CoreTypes coreTypes) {
+    return node == coreTypes.nullType
+        ? node
+        : node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitInvalidType(InvalidType node, CoreTypes coreTypes) => node;
+
+  @override
+  DartType visitNeverType(NeverType node, CoreTypes coreTypes) {
+    return node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitTypeParameterType(TypeParameterType node, CoreTypes coreTypes) {
+    if (node.promotedBound != null) {
+      // Intersection types don't have their own nullabilities.
+      return node;
+    } else {
+      return node.withDeclaredNullability(
+          TypeParameterType.computeNullabilityFromBound(node.parameter));
+    }
+  }
+
+  @override
+  DartType visitTypedefType(TypedefType node, CoreTypes coreTypes) {
+    return node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitVoidType(VoidType node, CoreTypes coreTypes) => node;
+}
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index d5a0a2e..5db606b 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -249,7 +249,7 @@
     while (type is TypeParameterType) {
       type = (type as TypeParameterType).bound;
     }
-    if (type is BottomType) {
+    if (type is BottomType || type is NeverType || type == coreTypes.nullType) {
       // The bottom type is a subtype of all types, so it should be allowed.
       return Substitution.bottomForClass(superclass);
     }
@@ -632,11 +632,12 @@
       checkUnresolvedInvocation(receiver, node);
       return handleDynamicCall(receiver, node.arguments);
     } else if (target is Procedure &&
-        environment.isOverloadedArithmeticOperator(target)) {
+        environment.isSpecialCasedBinaryOperator(target)) {
       assert(node.arguments.positional.length == 1);
       var receiver = visitExpression(node.receiver);
       var argument = visitExpression(node.arguments.positional[0]);
-      return environment.getTypeOfOverloadedArithmetic(receiver, argument);
+      return environment.getTypeOfSpecialCasedBinaryOperator(
+          receiver, argument);
     } else {
       return handleCall(node.arguments, target.getterType,
           receiver: getReceiverType(node, node.receiver, node.interfaceTarget));
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 14bb59d..04d02a6 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -165,49 +165,146 @@
     }
   }
 
-  /// True if [member] is a binary operator that returns an `int` if both
-  /// operands are `int`, and otherwise returns `double`.
-  ///
-  /// This is a case of type-based overloading, which in Dart is only supported
-  /// by giving special treatment to certain arithmetic operators.
-  bool isOverloadedArithmeticOperator(Procedure member) {
-    Class class_ = member.enclosingClass;
-    if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
-      String name = member.name.name;
-      return name == '+' ||
-          name == '-' ||
-          name == '*' ||
-          name == 'remainder' ||
-          name == '%';
+  /// True if [member] is a binary operator whose return type is defined by
+  /// the both operand types.
+  bool isSpecialCasedBinaryOperator(Procedure member,
+      {bool isNonNullableByDefault: false}) {
+    if (isNonNullableByDefault) {
+      Class class_ = member.enclosingClass;
+      // TODO(johnniwinther): Do we need to recognize backend implementation
+      //  methods?
+      if (class_ == coreTypes.intClass ||
+          class_ == coreTypes.numClass ||
+          class_ == coreTypes.doubleClass) {
+        String name = member.name.name;
+        return name == '+' ||
+            name == '-' ||
+            name == '*' ||
+            name == 'remainder' ||
+            name == '%';
+      }
+    } else {
+      Class class_ = member.enclosingClass;
+      if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
+        String name = member.name.name;
+        return name == '+' ||
+            name == '-' ||
+            name == '*' ||
+            name == 'remainder' ||
+            name == '%';
+      }
     }
     return false;
   }
 
-  /// Returns the static return type of an overloaded arithmetic operator
-  /// (see [isOverloadedArithmeticOperator]) given the static type of the
-  /// operands.
-  ///
-  /// If both types are `int`, the returned type is `int`.
-  /// If either type is `double`, the returned type is `double`.
-  /// If both types refer to the same type variable (typically with `num` as
-  /// the upper bound), then that type variable is returned.
-  /// Otherwise `num` is returned.
-  DartType getTypeOfOverloadedArithmetic(DartType type1, DartType type2) {
-    type1 = _resolveTypeParameterType(type1);
-    type2 = _resolveTypeParameterType(type2);
-
-    if (type1 == type2) return type1;
-
-    if (type1 is InterfaceType && type2 is InterfaceType) {
-      if (type1.classNode == type2.classNode) {
-        return type1;
-      }
-      if (type1.classNode == coreTypes.doubleClass ||
-          type2.classNode == coreTypes.doubleClass) {
-        return coreTypes.doubleRawType(type1.nullability);
+  /// True if [member] is a ternary operator whose return type is defined by
+  /// the least upper bound of the operand types.
+  bool isSpecialCasedTernaryOperator(Procedure member,
+      {bool isNonNullableByDefault: false}) {
+    if (isNonNullableByDefault) {
+      Class class_ = member.enclosingClass;
+      if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
+        String name = member.name.name;
+        return name == 'clamp';
       }
     }
+    return false;
+  }
 
+  /// Returns the static return type of a special cased binary operator
+  /// (see [isSpecialCasedBinaryOperator]) given the static type of the
+  /// operands.
+  DartType getTypeOfSpecialCasedBinaryOperator(DartType type1, DartType type2,
+      {bool isNonNullableByDefault: false}) {
+    if (isNonNullableByDefault) {
+      // Let e be an expression of one of the forms e1 + e2, e1 - e2, e1 * e2,
+      // e1 % e2 or e1.remainder(e2), where the static type of e1 is a non-Never
+      // type T and T <: num, and where the static type of e2 is S and S is
+      // assignable to num. Then:
+      if (type1 is! NeverType &&
+              isSubtypeOf(type1, coreTypes.numNonNullableRawType,
+                  SubtypeCheckMode.withNullabilities) &&
+              type2 is DynamicType ||
+          isSubtypeOf(type2, coreTypes.numNonNullableRawType,
+              SubtypeCheckMode.withNullabilities)) {
+        if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
+            SubtypeCheckMode.withNullabilities)) {
+          // If T <: double then the static type of e is double. This includes S
+          // being dynamic or Never.
+          return coreTypes.doubleNonNullableRawType;
+        } else if (type2 is! NeverType &&
+            isSubtypeOf(type2, coreTypes.doubleNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If S <: double and not S <:Never, then the static type of e is
+          // double.
+          return coreTypes.doubleNonNullableRawType;
+        } else if (isSubtypeOf(type1, coreTypes.intNonNullableRawType,
+                SubtypeCheckMode.withNullabilities) &&
+            type2 is! NeverType &&
+            isSubtypeOf(type2, coreTypes.intNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If T <: int , S <: int and not S <: Never, then the static type of
+          // e is int.
+          return coreTypes.intNonNullableRawType;
+        } else if (type2 is! NeverType &&
+            isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+          // Otherwise the static type of e is num.
+          return coreTypes.numNonNullableRawType;
+        }
+      }
+      // Otherwise the static type of e is num.
+      return coreTypes.numNonNullableRawType;
+    } else {
+      type1 = _resolveTypeParameterType(type1);
+      type2 = _resolveTypeParameterType(type2);
+
+      if (type1 == type2) return type1;
+
+      if (type1 is InterfaceType && type2 is InterfaceType) {
+        if (type1.classNode == type2.classNode) {
+          return type1;
+        }
+        if (type1.classNode == coreTypes.doubleClass ||
+            type2.classNode == coreTypes.doubleClass) {
+          return coreTypes.doubleRawType(type1.nullability);
+        }
+      }
+
+      return coreTypes.numRawType(type1.nullability);
+    }
+  }
+
+  DartType getTypeOfSpecialCasedTernaryOperator(
+      DartType type1, DartType type2, DartType type3, Library clientLibrary) {
+    if (clientLibrary.isNonNullableByDefault) {
+      // Let e be a normal invocation of the form e1.clamp(e2, e3), where the
+      // static types of e1, e2 and e3 are T1, T2 and T3 respectively, and where
+      // T1, T2, and T3 are all non-Never subtypes of num. Then:
+      if (type1 is! NeverType && type2 is! NeverType && type3 is! NeverType
+          /* We skip the check that all types are subtypes of num because, if
+          not, we'll compute the static type to be num, anyway.*/
+          ) {
+        if (isSubtypeOf(type1, coreTypes.intNonNullableRawType,
+                SubtypeCheckMode.withNullabilities) &&
+            isSubtypeOf(type2, coreTypes.intNonNullableRawType,
+                SubtypeCheckMode.withNullabilities) &&
+            isSubtypeOf(type3, coreTypes.intNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If T1, T2 and T3 are all subtypes of int, the static type of e is int.
+          return coreTypes.intNonNullableRawType;
+        } else if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
+                SubtypeCheckMode.withNullabilities) &&
+            isSubtypeOf(type2, coreTypes.doubleNonNullableRawType,
+                SubtypeCheckMode.withNullabilities) &&
+            isSubtypeOf(type3, coreTypes.doubleNonNullableRawType,
+                SubtypeCheckMode.withNullabilities)) {
+          // If T1, T2 and T3 are all subtypes of double, the static type of e is double.
+          return coreTypes.doubleNonNullableRawType;
+        }
+      }
+      // Otherwise the static type of e is num.
+      return coreTypes.numNonNullableRawType;
+    }
     return coreTypes.numRawType(type1.nullability);
   }
 
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 18fe5c2..52583d6 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -62,6 +62,7 @@
 compiler/test/sourcemaps/stacktrace_test: Slow, Pass
 dartdev/test/commands/analyze_test: Slow, Pass
 dartdev/test/commands/help_test: Slow, Pass
+dartdev/test/smoke/*: Slow, Pass
 dev_compiler/test/modular/*: Slow, Pass
 dev_compiler/test/options/*: Skip # test needs fixes
 dev_compiler/test/sourcemap/*: SkipByDesign # Skip sourcemap tests
diff --git a/pkg/vm/bin/dump_bytecode_ngrams.dart b/pkg/vm/bin/dump_bytecode_ngrams.dart
index dead72c..50ec2a4 100644
--- a/pkg/vm/bin/dump_bytecode_ngrams.dart
+++ b/pkg/vm/bin/dump_bytecode_ngrams.dart
@@ -36,11 +36,11 @@
 
 const int _badUsageExitCode = 1;
 
-int main(List<String> arguments) {
+void main(List<String> arguments) {
   final ArgResults options = _argParser.parse(arguments);
   if ((options.rest.length != 1) || (options['output'] == null)) {
     print(_usage);
-    return _badUsageExitCode;
+    io.exit(_badUsageExitCode);
   }
 
   final basicBlocks = options['basic-blocks'];
@@ -54,12 +54,11 @@
   if (!(new io.File(input).existsSync())) {
     print("The file '$input' does not exist");
     print(_usage);
-    return _badUsageExitCode;
+    io.exit(_badUsageExitCode);
   }
 
   NGramReader nGramReader = new NGramReader(input);
   nGramReader.readAllNGrams(windowSize,
       basicBlocks: basicBlocks, mergePushes: mergePushes);
   nGramReader.writeNGramStats(output, sort: sort, minCount: threshold);
-  return 0;
 }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 8bcbb48..82af071 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -233,7 +233,7 @@
     bool isGetter = false, isSetter = false, isMethod = false;
     if (name.startsWith("set:")) {
       isSetter = true;
-      name = name.substring(4) + "=";
+      name = name.substring(4);
     } else if (name.startsWith("get:")) {
       isGetter = true;
       name = name.substring(4);
diff --git a/runtime/bin/dartdev_isolate.cc b/runtime/bin/dartdev_isolate.cc
index 6e0ed3d..1f91437 100644
--- a/runtime/bin/dartdev_isolate.cc
+++ b/runtime/bin/dartdev_isolate.cc
@@ -56,7 +56,7 @@
           (strncmp(script_uri, "google3://", 10) != 0));
 }
 
-const char* DartDevIsolate::TryResolveDartDevSnapshotPath() {
+Utils::CStringUniquePtr DartDevIsolate::TryResolveDartDevSnapshotPath() {
   // |dir_prefix| includes the last path seperator.
   auto dir_prefix = EXEUtils::GetDirectoryPrefixFromExeName();
 
@@ -64,7 +64,7 @@
   char* snapshot_path =
       Utils::SCreate("%ssnapshots/dartdev.dart.snapshot", dir_prefix.get());
   if (File::Exists(nullptr, snapshot_path)) {
-    return snapshot_path;
+    return Utils::CreateCStringUniquePtr(snapshot_path);
   }
   free(snapshot_path);
 
@@ -72,12 +72,12 @@
   // directories. Try to use a snapshot rom a previously built SDK.
   snapshot_path = Utils::SCreate("%sdartdev.dart.snapshot", dir_prefix.get());
   if (File::Exists(nullptr, snapshot_path)) {
-    return snapshot_path;
+    return Utils::CreateCStringUniquePtr(snapshot_path);
   }
   free(snapshot_path);
 
   Syslog::PrintErr("Could not find DartDev snapshot.\n");
-  return nullptr;
+  return Utils::CreateCStringUniquePtr(nullptr);
 }
 
 void DartDevIsolate::DartDevRunner::Run(
@@ -102,9 +102,7 @@
     // Clear the DartDev dart_options and replace them with the processed
     // options provided by DartDev.
     dart_options_->Reset();
-    for (intptr_t i = 0; i < argc_; ++i) {
-      dart_options_->AddArguments(const_cast<const char**>(argv_.get()), argc_);
-    }
+    dart_options_->AddArguments(const_cast<const char**>(argv_.get()), argc_);
   }
 }
 
@@ -136,7 +134,6 @@
         }
         delete[] args;
       };
-
       argv_ =
           std::unique_ptr<char*[], void (*)(char**)>(new char*[argc_], deleter);
       for (intptr_t i = 0; i < argc_; ++i) {
@@ -176,7 +173,7 @@
 
   // TODO(bkonyi): bring up DartDev from kernel instead of a app-jit snapshot.
   // See https://github.com/dart-lang/sdk/issues/42804
-  const char* dartdev_path = DartDevIsolate::TryResolveDartDevSnapshotPath();
+  auto dartdev_path = DartDevIsolate::TryResolveDartDevSnapshotPath();
   if (dartdev_path == nullptr) {
     ProcessError("Failed to find DartDev snapshot.", kErrorExitCode);
     return;
@@ -192,9 +189,8 @@
 
   char* error;
   Dart_Isolate dartdev_isolate = runner->create_isolate_(
-      dartdev_path, "dartdev", nullptr, runner->packages_file_, &flags,
+      dartdev_path.get(), "dartdev", nullptr, runner->packages_file_, &flags,
       NULL /* callback_data */, const_cast<char**>(&error));
-  free(const_cast<char*>(dartdev_path));
 
   if (dartdev_isolate == nullptr) {
     ProcessError(error, kErrorExitCode);
diff --git a/runtime/bin/dartdev_isolate.h b/runtime/bin/dartdev_isolate.h
index e2ade66..ef6c780 100644
--- a/runtime/bin/dartdev_isolate.h
+++ b/runtime/bin/dartdev_isolate.h
@@ -13,6 +13,7 @@
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
 #include "platform/globals.h"
+#include "platform/utils.h"
 
 namespace dart {
 namespace bin {
@@ -83,7 +84,7 @@
  private:
   // Attempts to find the DartDev snapshot. If the snapshot cannot be found,
   // the VM will shutdown.
-  static const char* TryResolveDartDevSnapshotPath();
+  static Utils::CStringUniquePtr TryResolveDartDevSnapshotPath();
 
   static DartDevRunner runner_;
   static bool should_run_dart_dev_;
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 29a7c11..cbeb39a 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -1305,6 +1305,10 @@
     case Dart_TypedData_kUint64:
     case Dart_TypedData_kFloat64:
       return 8;
+    case Dart_TypedData_kInt32x4:
+    case Dart_TypedData_kFloat32x4:
+    case Dart_TypedData_kFloat64x2:
+      return 16;
     default:
       break;
   }
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index d4ac70f..ac8ff5c 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -1221,9 +1221,16 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   if (should_run_user_program) {
-    // Run the main isolate until we aren't told to restart.
-    while (RunMainIsolate(script_name, &dart_options)) {
-      Syslog::PrintErr("Restarting VM\n");
+    if (!Dart_IsPrecompiledRuntime() && Snapshot::IsAOTSnapshot(script_name)) {
+      Syslog::PrintErr(
+          "%s is an AOT snapshot and should be run with 'dartaotruntime'\n",
+          script_name);
+      Platform::Exit(kErrorExitCode);
+    } else {
+      // Run the main isolate until we aren't told to restart.
+      while (RunMainIsolate(script_name, &dart_options)) {
+        Syslog::PrintErr("Restarting VM\n");
+      }
     }
   }
 
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 2adc48e..ed6b491a 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -537,5 +537,24 @@
   }
 }
 
+bool Snapshot::IsAOTSnapshot(const char* snapshot_filename) {
+  // Header is simply "ELF" prefixed with the DEL character.
+  const char elf_header[] = {0x7F, 0x45, 0x4C, 0x46, 0x0};
+  const int64_t elf_header_len = strlen(elf_header);
+  File* file = File::Open(NULL, snapshot_filename, File::kRead);
+  if (file == nullptr) {
+    return false;
+  }
+  if (file->Length() < elf_header_len) {
+    file->Release();
+    return false;
+  }
+  auto buf = std::unique_ptr<char[]>(new char[elf_header_len]);
+  bool success = file->ReadFully(buf.get(), elf_header_len);
+  file->Release();
+  ASSERT(success);
+  return (strncmp(elf_header, buf.get(), elf_header_len) == 0);
+}
+
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/snapshot_utils.h b/runtime/bin/snapshot_utils.h
index 1b8c666..57d8929 100644
--- a/runtime/bin/snapshot_utils.h
+++ b/runtime/bin/snapshot_utils.h
@@ -34,6 +34,10 @@
   static void GenerateAppJIT(const char* snapshot_filename);
   static void GenerateAppAOTAsAssembly(const char* snapshot_filename);
 
+  // Returns true if snapshot_filename points to an AOT snapshot (aka,
+  // an ELF binary). May report false negatives.
+  static bool IsAOTSnapshot(const char* snapshot_filename);
+
   static AppSnapshot* TryReadAppendedAppSnapshotElf(const char* container_path);
   static AppSnapshot* TryReadAppSnapshot(
       const char* script_uri,
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 978d67b..bbd3d2ca 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -2358,7 +2358,9 @@
   Dart_TypedData_kUint64,
   Dart_TypedData_kFloat32,
   Dart_TypedData_kFloat64,
+  Dart_TypedData_kInt32x4,
   Dart_TypedData_kFloat32x4,
+  Dart_TypedData_kFloat64x2,
   Dart_TypedData_kInvalid
 } Dart_TypedData_Type;
 
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 7b86301..7dd5823 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -11,6 +11,7 @@
 #include "vm/native_entry.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
+#include "vm/resolver.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 
@@ -510,14 +511,11 @@
     function = Closure::Cast(receiver).function();
   } else {
     Class& cls = Class::Handle(receiver.clazz());
-    if (level != InvocationMirror::kSuper) {
-      function = cls.LookupDynamicFunction(method_name);
-    }
-    while (function.IsNull()) {
+    if (level == InvocationMirror::kSuper) {
       cls = cls.SuperClass();
-      if (cls.IsNull()) break;
-      function = cls.LookupDynamicFunction(method_name);
     }
+    function = Resolver::ResolveDynamicAnyArgs(zone, cls, method_name,
+                                               /*allow_add=*/false);
   }
   if (!function.IsNull()) {
     return function.UserVisibleSignature();
diff --git a/runtime/observatory/lib/service_html.dart b/runtime/observatory/lib/service_html.dart
index 60f552c..5c217d7 100644
--- a/runtime/observatory/lib/service_html.dart
+++ b/runtime/observatory/lib/service_html.dart
@@ -22,7 +22,14 @@
     // to DDS, but the dart:html WebSocket doesn't follow redirects. If the
     // 'implicit-redirect' protocol is provided, the VM service will manually
     // forward traffic to DDS.
-    _webSocket = new WebSocket(address, ['implicit-redirect']);
+
+    // TODO(bkonyi): uncomment when DDS is re-enabled.
+    // See https://github.com/dart-lang/sdk/issues/42727
+    // const protocols = ['implicit-redirect'];
+    _webSocket = new WebSocket(
+      address,
+      // protocols,
+    );
     _webSocket.onClose.listen((CloseEvent) => onClose());
     _webSocket.onError.listen((Event) => onError());
     _webSocket.onOpen.listen((Event) => onOpen());
diff --git a/runtime/observatory/lib/src/elements/allocation_profile.dart b/runtime/observatory/lib/src/elements/allocation_profile.dart
index 79139c3..ae66a6a8 100644
--- a/runtime/observatory/lib/src/elements/allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/allocation_profile.dart
@@ -222,9 +222,9 @@
               ..classes = ['compact']
               ..text = _isCompacted ? 'expand â–¼' : 'compact â–²'
               ..onClick.listen((_) {
-                    _isCompacted = !_isCompacted;
-                          _r.dirty();
-               }),
+                _isCompacted = !_isCompacted;
+                _r.dirty();
+              }),
             new HRElement()
           ],
         new DivElement()
@@ -365,35 +365,26 @@
                 _SortingField.newInternalSize, _SortingDirection.descending),
             _createHeaderButton(const ['bytes'], 'External',
                 _SortingField.newExternalSize, _SortingDirection.descending),
-            _createHeaderButton(const ['bytes'], 'Size',
-                _SortingField.newSize, _SortingDirection.descending),
-            _createHeaderButton(
-                const ['instances'], 'Instances',
-                _SortingField.newInstances,
+            _createHeaderButton(const ['bytes'], 'Size', _SortingField.newSize,
                 _SortingDirection.descending),
-
+            _createHeaderButton(const ['instances'], 'Instances',
+                _SortingField.newInstances, _SortingDirection.descending),
             _createHeaderButton(const ['bytes'], 'Internal',
                 _SortingField.oldInternalSize, _SortingDirection.descending),
             _createHeaderButton(const ['bytes'], 'External',
                 _SortingField.oldExternalSize, _SortingDirection.descending),
-            _createHeaderButton(const ['bytes'], 'Size',
-                _SortingField.oldSize, _SortingDirection.descending),
-            _createHeaderButton(
-                const ['instances'], 'Instances',
-                _SortingField.oldInstances,
+            _createHeaderButton(const ['bytes'], 'Size', _SortingField.oldSize,
                 _SortingDirection.descending),
-
+            _createHeaderButton(const ['instances'], 'Instances',
+                _SortingField.oldInstances, _SortingDirection.descending),
             _createHeaderButton(const ['bytes'], 'Internal',
                 _SortingField.internalSize, _SortingDirection.descending),
             _createHeaderButton(const ['bytes'], 'External',
                 _SortingField.externalSize, _SortingDirection.descending),
-            _createHeaderButton(const ['bytes'], 'Size',
-                _SortingField.size, _SortingDirection.descending),
-            _createHeaderButton(
-                const ['instances'], 'Instances',
-                _SortingField.instances,
+            _createHeaderButton(const ['bytes'], 'Size', _SortingField.size,
                 _SortingDirection.descending),
-
+            _createHeaderButton(const ['instances'], 'Instances',
+                _SortingField.instances, _SortingDirection.descending),
             _createHeaderButton(const ['name'], 'Class',
                 _SortingField.className, _SortingDirection.ascending)
           ],
@@ -564,28 +555,19 @@
     ].join(',');
   }
 
-  static int _getNewInstances(M.ClassHeapStats s) =>
-      s.newSpace.instances;
-  static int _getNewInternalSize(M.ClassHeapStats s) =>
-      s.newSpace.internalSize;
-  static int _getNewExternalSize(M.ClassHeapStats s) =>
-      s.newSpace.externalSize;
-  static int _getNewSize(M.ClassHeapStats s) =>
-      s.newSpace.size;
-  static int _getOldInstances(M.ClassHeapStats s) =>
-      s.oldSpace.instances;
-  static int _getOldInternalSize(M.ClassHeapStats s) =>
-      s.oldSpace.internalSize;
-  static int _getOldExternalSize(M.ClassHeapStats s) =>
-      s.oldSpace.externalSize;
-  static int _getOldSize(M.ClassHeapStats s) =>
-      s.oldSpace.size;
+  static int _getNewInstances(M.ClassHeapStats s) => s.newSpace.instances;
+  static int _getNewInternalSize(M.ClassHeapStats s) => s.newSpace.internalSize;
+  static int _getNewExternalSize(M.ClassHeapStats s) => s.newSpace.externalSize;
+  static int _getNewSize(M.ClassHeapStats s) => s.newSpace.size;
+  static int _getOldInstances(M.ClassHeapStats s) => s.oldSpace.instances;
+  static int _getOldInternalSize(M.ClassHeapStats s) => s.oldSpace.internalSize;
+  static int _getOldExternalSize(M.ClassHeapStats s) => s.oldSpace.externalSize;
+  static int _getOldSize(M.ClassHeapStats s) => s.oldSpace.size;
   static int _getInstances(M.ClassHeapStats s) =>
       s.newSpace.instances + s.oldSpace.instances;
   static int _getInternalSize(M.ClassHeapStats s) =>
       s.newSpace.internalSize + s.oldSpace.internalSize;
   static int _getExternalSize(M.ClassHeapStats s) =>
       s.newSpace.externalSize + s.oldSpace.externalSize;
-  static int _getSize(M.ClassHeapStats s) =>
-      s.newSpace.size + s.oldSpace.size;
+  static int _getSize(M.ClassHeapStats s) => s.newSpace.size + s.oldSpace.size;
 }
diff --git a/runtime/observatory/lib/src/elements/class_allocation_profile.dart b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
index 1f0013c..46cc688 100644
--- a/runtime/observatory/lib/src/elements/class_allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
@@ -49,7 +49,8 @@
     return e;
   }
 
-  ClassAllocationProfileElement.created() : super.created('class-allocation-profile');
+  ClassAllocationProfileElement.created()
+      : super.created('class-allocation-profile');
 
   @override
   void attached() {
diff --git a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
index 8f24d9c..7044f5c 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
@@ -65,7 +65,8 @@
     return e;
   }
 
-  CpuProfileVirtualTreeElement.created() : super.created('cpu-profile-virtual-tree');
+  CpuProfileVirtualTreeElement.created()
+      : super.created('cpu-profile-virtual-tree');
 
   @override
   attached() {
diff --git a/runtime/observatory/lib/src/elements/helpers/custom_element.dart b/runtime/observatory/lib/src/elements/helpers/custom_element.dart
index 90b0c71..2af0d6c 100644
--- a/runtime/observatory/lib/src/elements/helpers/custom_element.dart
+++ b/runtime/observatory/lib/src/elements/helpers/custom_element.dart
@@ -46,7 +46,8 @@
   }
 
   final HtmlElement element;
-  CustomElement.created(String elementClass) : element = document.createElement("shadow") {
+  CustomElement.created(String elementClass)
+      : element = document.createElement("shadow") {
     reverseElements[element] = this;
     element.classes = [elementClass];
 
diff --git a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
index f7abef6..7823a1d 100644
--- a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
+++ b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
@@ -33,7 +33,8 @@
     return e;
   }
 
-  IsolateSharedSummaryElement.created() : super.created('isolate-shared-summary');
+  IsolateSharedSummaryElement.created()
+      : super.created('isolate-shared-summary');
 
   @override
   void attached() {
diff --git a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
index 6dc78b5..fb1f262 100644
--- a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
+++ b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
@@ -85,7 +85,8 @@
     return e;
   }
 
-  MegamorphicCacheViewElement.created() : super.created('megamorphiccache-view');
+  MegamorphicCacheViewElement.created()
+      : super.created('megamorphiccache-view');
 
   @override
   attached() {
diff --git a/runtime/observatory/lib/src/elements/observatory_application.dart b/runtime/observatory/lib/src/elements/observatory_application.dart
index bb58e9e..1ba16ef 100644
--- a/runtime/observatory/lib/src/elements/observatory_application.dart
+++ b/runtime/observatory/lib/src/elements/observatory_application.dart
@@ -13,7 +13,8 @@
 class ObservatoryApplicationElement extends CustomElement {
   ObservatoryApplication app;
 
-  ObservatoryApplicationElement.created() : super.created('observatory-application');
+  ObservatoryApplicationElement.created()
+      : super.created('observatory-application');
 
   @override
   void attached() {
diff --git a/runtime/observatory/lib/src/elements/persistent_handles.dart b/runtime/observatory/lib/src/elements/persistent_handles.dart
index 468d700..72eef36 100644
--- a/runtime/observatory/lib/src/elements/persistent_handles.dart
+++ b/runtime/observatory/lib/src/elements/persistent_handles.dart
@@ -71,7 +71,8 @@
     return e;
   }
 
-  PersistentHandlesPageElement.created() : super.created('persistent-handles-page');
+  PersistentHandlesPageElement.created()
+      : super.created('persistent-handles-page');
 
   @override
   attached() {
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
index 1355521..0e0a674 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
@@ -34,7 +34,8 @@
     return e;
   }
 
-  SingleTargetCacheRefElement.created() : super.created('singletargetcache-ref');
+  SingleTargetCacheRefElement.created()
+      : super.created('singletargetcache-ref');
 
   @override
   void attached() {
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_view.dart b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
index ae96da9..f25a184 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_view.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
@@ -83,7 +83,10 @@
     return e;
   }
 
-  SingleTargetCacheViewElement.created() : super.created('singletargetcache-view',);
+  SingleTargetCacheViewElement.created()
+      : super.created(
+          'singletargetcache-view',
+        );
 
   @override
   attached() {
diff --git a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
index c478bf8..ff23373 100644
--- a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
+++ b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
@@ -86,7 +86,8 @@
     return e;
   }
 
-  StackTraceTreeConfigElement.created() : super.created('stack-trace-tree-config');
+  StackTraceTreeConfigElement.created()
+      : super.created('stack-trace-tree-config');
 
   @override
   void attached() {
diff --git a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
index 33a556e..340686a 100644
--- a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
+++ b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
@@ -49,7 +49,8 @@
     return e;
   }
 
-  StronglyReachableInstancesElement.created() : super.created('strongly-reachable-instances');
+  StronglyReachableInstancesElement.created()
+      : super.created('strongly-reachable-instances');
 
   @override
   void attached() {
diff --git a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
index 9f0d68e..740298f 100644
--- a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
+++ b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
@@ -82,7 +82,8 @@
     return e;
   }
 
-  SubtypeTestCacheViewElement.created() : super.created('subtypetestcache-view');
+  SubtypeTestCacheViewElement.created()
+      : super.created('subtypetestcache-view');
 
   @override
   attached() {
diff --git a/runtime/observatory/web/main.dart b/runtime/observatory/web/main.dart
index dec58d7..b09362d 100644
--- a/runtime/observatory/web/main.dart
+++ b/runtime/observatory/web/main.dart
@@ -7,7 +7,6 @@
 import 'package:observatory/elements.dart';
 import 'package:stack_trace/stack_trace.dart';
 
-
 main() async {
   Chain.capture(() async {
     Logger.root.level = Level.INFO;
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 50b0bf3..0ffe25e 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -157,6 +157,19 @@
   await (throwAsync().timeout(Duration(seconds: 1)));
 }
 
+// ----
+// Scenario: Future.wait:
+// ----
+
+Future awaitWait() async {
+  await Future.wait([
+    throwAsync(),
+    () async {
+      await Future.value();
+    }()
+  ]);
+}
+
 // Helpers:
 
 // We want lines that either start with a frame index or an async gap marker.
@@ -689,6 +702,48 @@
             r'^#6      _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
+
+  final awaitWaitExpected = const <String>[
+    r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
+    r'^^<asynchronous suspension>$',
+    r'^#1      awaitWait ',
+  ];
+  await doTestAwait(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#2      doTestAwait ',
+            r'^#3      doTestsCausal ',
+            r'^<asynchronous suspension>$',
+            r'^#4      main \(.+\)$',
+            r'^#5      _startIsolate.<anonymous closure> ',
+            r'^#6      _RawReceivePortImpl._handleMessage ',
+          ],
+      debugInfoFilename);
+  await doTestAwaitThen(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#2      doTestAwaitThen ',
+            r'^#3      doTestsCausal ',
+            r'^<asynchronous suspension>$',
+            r'^#4      main \(.+\)$',
+            r'^#5      _startIsolate.<anonymous closure> ',
+            r'^#6      _RawReceivePortImpl._handleMessage ',
+          ],
+      debugInfoFilename);
+  await doTestAwaitCatchError(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#2      doTestAwaitCatchError ',
+            r'^#3      doTestsCausal ',
+            r'^<asynchronous suspension>$',
+            r'^#4      main \(.+\)$',
+            r'^#5      _startIsolate.<anonymous closure> ',
+            r'^#6      _RawReceivePortImpl._handleMessage ',
+          ],
+      debugInfoFilename);
 }
 
 // For: --no-causal-async-stacks --no-lazy-async-stacks
@@ -1027,6 +1082,25 @@
       awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
   await doTestAwaitCatchError(
       awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+  final awaitWaitExpected = const <String>[
+    r'#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
+    r'^#1      _RootZone.runUnary ',
+    r'^#2      _FutureListener.handleValue ',
+    r'^#3      Future._propagateToListeners.handleValueCallback ',
+    r'^#4      Future._propagateToListeners ',
+    r'^#5      Future.(_addListener|_prependListeners).<anonymous closure> ',
+    r'^#6      _microtaskLoop ',
+    r'^#7      _startMicrotaskLoop ',
+    r'^#8      _runPendingImmediateCallback ',
+    r'^#9      _RawReceivePortImpl._handleMessage ',
+  ];
+  await doTestAwait(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+  await doTestAwaitThen(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+  await doTestAwaitCatchError(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
 }
 
 // For: --lazy-async-stacks
@@ -1319,4 +1393,35 @@
       debugInfoFilename);
   await doTestAwaitCatchError(
       awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+  final awaitWaitExpected = const <String>[
+    r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
+    r'^<asynchronous suspension>$',
+    r'^#1      Future.wait.<anonymous closure> \(dart:async/future.dart\)$',
+    r'^<asynchronous suspension>$',
+    r'^#2      awaitWait ',
+    r'^<asynchronous suspension>$',
+  ];
+  await doTestAwait(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#3      doTestAwait ',
+            r'^<asynchronous suspension>$',
+            r'^#4      doTestsLazy ',
+            r'^<asynchronous suspension>$',
+            r'^#5      main ',
+            r'^<asynchronous suspension>$',
+          ],
+      debugInfoFilename);
+  await doTestAwaitThen(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#3      doTestAwaitThen.<anonymous closure> ',
+            r'^<asynchronous suspension>$',
+          ],
+      debugInfoFilename);
+  await doTestAwaitCatchError(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
 }
diff --git a/runtime/tests/vm/dart/scavenger_abort_test.dart b/runtime/tests/vm/dart/scavenger_abort_test.dart
new file mode 100644
index 0000000..ee3b38d
--- /dev/null
+++ b/runtime/tests/vm/dart/scavenger_abort_test.dart
@@ -0,0 +1,158 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:io";
+import "package:expect/expect.dart";
+
+// The sizes of these classes are co-prime multiples of the allocation unit to
+// increase the likelihood that scavenging fails from fragmentation.
+
+// header + 13 fields = 7 allocation units
+class A {
+  dynamic field1;
+  dynamic field2;
+  dynamic field3;
+  dynamic field4;
+  dynamic field5;
+  dynamic field6;
+  dynamic field7;
+  dynamic field8;
+  dynamic field9;
+  dynamic field10;
+  dynamic field11;
+  dynamic field12;
+  dynamic field13;
+}
+
+// header + 17 fields = 9 allocation units
+class B {
+  dynamic field1;
+  dynamic field2;
+  dynamic field3;
+  dynamic field4;
+  dynamic field5;
+  dynamic field6;
+  dynamic field7;
+  dynamic field8;
+  dynamic field9;
+  dynamic field10;
+  dynamic field11;
+  dynamic field12;
+  dynamic field13;
+  dynamic field14;
+  dynamic field15;
+  dynamic field16;
+  dynamic field17;
+}
+
+// header + 19 fields = 10 allocation units
+class C {
+  dynamic field1;
+  dynamic field2;
+  dynamic field3;
+  dynamic field4;
+  dynamic field5;
+  dynamic field6;
+  dynamic field7;
+  dynamic field8;
+  dynamic field9;
+  dynamic field10;
+  dynamic field11;
+  dynamic field12;
+  dynamic field13;
+  dynamic field14;
+  dynamic field15;
+  dynamic field16;
+  dynamic field17;
+  dynamic field18;
+  dynamic field19;
+}
+
+makeA(n) {
+  var a = new A();
+  if (n > 0) {
+    a.field1 = makeB(n - 1);
+    a.field2 = makeC(n - 1);
+    a.field3 = makeB(n - 1);
+    a.field4 = makeC(n - 1);
+  }
+  return a;
+}
+
+makeB(n) {
+  var b = new B();
+  if (n > 0) {
+    b.field1 = makeC(n - 1);
+    b.field2 = makeA(n - 1);
+    b.field3 = makeC(n - 1);
+    b.field4 = makeA(n - 1);
+  }
+  return b;
+}
+
+makeC(n) {
+  var c = new C();
+  if (n > 0) {
+    c.field1 = makeA(n - 1);
+    c.field2 = makeB(n - 1);
+    c.field3 = makeA(n - 1);
+    c.field4 = makeB(n - 1);
+  }
+  return c;
+}
+
+readFields(x) {
+  print(x.field1);
+  print(x.field2);
+  print(x.field3);
+  print(x.field4);
+}
+
+main(List<String> argsIn) async {
+  if (argsIn.contains("--testee")) {
+    // Trigger OOM.
+    // Must read the fields to prevent the writes from being optimized away. If
+    // the writes are optimized away, most of the tree is collectible right away
+    // and we timeout instead of triggering OOM.
+    readFields(makeA(50));
+    readFields(makeB(50));
+    readFields(makeC(50));
+    return;
+  }
+
+  var exec = Platform.executable;
+  var args = Platform.executableArguments +
+      [
+        "--old_gen_heap_size=15" /*MB*/,
+        "--verbose_gc",
+        "--verify_after_gc",
+        "--verify_store_buffer",
+        Platform.script.toFilePath(),
+        "--testee"
+      ];
+  print("+ $exec ${args.join(' ')}");
+
+  var result = await Process.run(exec, args);
+  print("Command stdout:");
+  print(result.stdout);
+  print("Command stderr:");
+  print(result.stderr);
+
+  Expect.equals(255, result.exitCode,
+      "Should see runtime exception error code, not SEGV");
+
+  Expect.isTrue(
+      result.stderr.contains("Unhandled exception:\nOut of Memory") ||
+          result.stderr.contains("Unhandled exception:\r\nOut of Memory"),
+      "Should see the Dart OutOfMemoryError");
+
+  // --verbose_gc not available in product mode
+  if (!new bool.fromEnvironment("dart.vm.product")) {
+    Expect.isTrue(result.stderr.contains("Aborting scavenge"),
+        "Should abort scavenge at least once");
+  }
+
+  Expect.isFalse(result.stderr.contains("error: Out of memory"),
+      "Should not see the C++ OUT_OF_MEMORY()");
+}
diff --git a/runtime/tests/vm/dart/unboxed_implicit_accessors_test.dart b/runtime/tests/vm/dart/unboxed_implicit_accessors_test.dart
new file mode 100644
index 0000000..467c0ea
--- /dev/null
+++ b/runtime/tests/vm/dart/unboxed_implicit_accessors_test.dart
@@ -0,0 +1,71 @@
+// 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.
+
+final l = <I>[A(), B(42, 4.2)];
+final l2 = <I2>[A2(), B2(42, 4.2)];
+
+main() {
+  if (l[0].intValue != 23) throw 'a';
+  if (l[0].doubleValue != 2.3) throw 'b';
+  if (l[1].intValue != 42) throw 'c';
+  if (l[1].doubleValue != 4.2) throw 'd';
+
+  if (l2[0].intValue != null) throw 'a';
+  if (l2[0].doubleValue != null) throw 'b';
+  if (l2[1].intValue != 42) throw 'c';
+  if (l2[1].doubleValue != 4.2) throw 'd';
+
+  if (int.parse('1') == 1) {
+    l2[0].intValue = 24;
+    l2[0].doubleValue = 2.4;
+    l2[1].intValue = 24;
+    l2[1].doubleValue = 2.4;
+  } else {
+    (l2[0] as A2).intValue = null;
+    (l2[0] as A2).doubleValue = null;
+  }
+}
+
+abstract class I {
+  int? get intValue;
+  double? get doubleValue;
+}
+
+class A implements I {
+  int get intValue => 23;
+  double get doubleValue => 2.3;
+}
+
+class B implements I {
+  // Field as well as getter/setter will be unboxed.
+  final int? intValue;
+  // Field as well as getter/setter will be unboxed.
+  final double? doubleValue;
+  B(this.intValue, this.doubleValue);
+}
+
+abstract class I2 {
+  void set intValue(int? v) {}
+  void set doubleValue(double? v) {}
+
+  int? get intValue;
+  double? get doubleValue;
+}
+
+class A2 implements I2 {
+  void set intValue(int? v) {}
+  void set doubleValue(double? v) {}
+
+  int? get intValue => null;
+  double? get doubleValue => null;
+}
+
+class B2 implements I2 {
+  // Field itself will get unboxed, but getter/setter will be boxed.
+  int? intValue;
+  // Field itself will get unboxed, but getter/setter will be boxed.
+  double? doubleValue;
+
+  B2(this.intValue, this.doubleValue);
+}
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index ec787cf..6354b59 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -157,6 +157,19 @@
   await (throwAsync().timeout(Duration(seconds: 1)));
 }
 
+// ----
+// Scenario: Future.wait:
+// ----
+
+Future awaitWait() async {
+  await Future.wait([
+    throwAsync(),
+    () async {
+      await Future.value();
+    }()
+  ]);
+}
+
 // Helpers:
 
 // We want lines that either start with a frame index or an async gap marker.
@@ -689,6 +702,48 @@
             r'^#6      _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
+
+  final awaitWaitExpected = const <String>[
+    r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
+    r'^^<asynchronous suspension>$',
+    r'^#1      awaitWait ',
+  ];
+  await doTestAwait(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#2      doTestAwait ',
+            r'^#3      doTestsCausal ',
+            r'^<asynchronous suspension>$',
+            r'^#4      main \(.+\)$',
+            r'^#5      _startIsolate.<anonymous closure> ',
+            r'^#6      _RawReceivePortImpl._handleMessage ',
+          ],
+      debugInfoFilename);
+  await doTestAwaitThen(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#2      doTestAwaitThen ',
+            r'^#3      doTestsCausal ',
+            r'^<asynchronous suspension>$',
+            r'^#4      main \(.+\)$',
+            r'^#5      _startIsolate.<anonymous closure> ',
+            r'^#6      _RawReceivePortImpl._handleMessage ',
+          ],
+      debugInfoFilename);
+  await doTestAwaitCatchError(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#2      doTestAwaitCatchError ',
+            r'^#3      doTestsCausal ',
+            r'^<asynchronous suspension>$',
+            r'^#4      main \(.+\)$',
+            r'^#5      _startIsolate.<anonymous closure> ',
+            r'^#6      _RawReceivePortImpl._handleMessage ',
+          ],
+      debugInfoFilename);
 }
 
 // For: --no-causal-async-stacks --no-lazy-async-stacks
@@ -1027,6 +1082,25 @@
       awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
   await doTestAwaitCatchError(
       awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+  final awaitWaitExpected = const <String>[
+    r'#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
+    r'^#1      _RootZone.runUnary ',
+    r'^#2      _FutureListener.handleValue ',
+    r'^#3      Future._propagateToListeners.handleValueCallback ',
+    r'^#4      Future._propagateToListeners ',
+    r'^#5      Future.(_addListener|_prependListeners).<anonymous closure> ',
+    r'^#6      _microtaskLoop ',
+    r'^#7      _startMicrotaskLoop ',
+    r'^#8      _runPendingImmediateCallback ',
+    r'^#9      _RawReceivePortImpl._handleMessage ',
+  ];
+  await doTestAwait(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+  await doTestAwaitThen(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+  await doTestAwaitCatchError(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
 }
 
 // For: --lazy-async-stacks
@@ -1319,4 +1393,35 @@
       debugInfoFilename);
   await doTestAwaitCatchError(
       awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+  final awaitWaitExpected = const <String>[
+    r'^#0      throwAsync \(.*/utils.dart:21(:3)?\)$',
+    r'^<asynchronous suspension>$',
+    r'^#1      Future.wait.<anonymous closure> \(dart:async/future.dart\)$',
+    r'^<asynchronous suspension>$',
+    r'^#2      awaitWait ',
+    r'^<asynchronous suspension>$',
+  ];
+  await doTestAwait(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#3      doTestAwait ',
+            r'^<asynchronous suspension>$',
+            r'^#4      doTestsLazy ',
+            r'^<asynchronous suspension>$',
+            r'^#5      main ',
+            r'^<asynchronous suspension>$',
+          ],
+      debugInfoFilename);
+  await doTestAwaitThen(
+      awaitWait,
+      awaitWaitExpected +
+          const <String>[
+            r'^#3      doTestAwaitThen.<anonymous closure> ',
+            r'^<asynchronous suspension>$',
+          ],
+      debugInfoFilename);
+  await doTestAwaitCatchError(
+      awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
 }
diff --git a/runtime/tests/vm/dart_2/scavenger_abort_test.dart b/runtime/tests/vm/dart_2/scavenger_abort_test.dart
new file mode 100644
index 0000000..ee3b38d
--- /dev/null
+++ b/runtime/tests/vm/dart_2/scavenger_abort_test.dart
@@ -0,0 +1,158 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:io";
+import "package:expect/expect.dart";
+
+// The sizes of these classes are co-prime multiples of the allocation unit to
+// increase the likelihood that scavenging fails from fragmentation.
+
+// header + 13 fields = 7 allocation units
+class A {
+  dynamic field1;
+  dynamic field2;
+  dynamic field3;
+  dynamic field4;
+  dynamic field5;
+  dynamic field6;
+  dynamic field7;
+  dynamic field8;
+  dynamic field9;
+  dynamic field10;
+  dynamic field11;
+  dynamic field12;
+  dynamic field13;
+}
+
+// header + 17 fields = 9 allocation units
+class B {
+  dynamic field1;
+  dynamic field2;
+  dynamic field3;
+  dynamic field4;
+  dynamic field5;
+  dynamic field6;
+  dynamic field7;
+  dynamic field8;
+  dynamic field9;
+  dynamic field10;
+  dynamic field11;
+  dynamic field12;
+  dynamic field13;
+  dynamic field14;
+  dynamic field15;
+  dynamic field16;
+  dynamic field17;
+}
+
+// header + 19 fields = 10 allocation units
+class C {
+  dynamic field1;
+  dynamic field2;
+  dynamic field3;
+  dynamic field4;
+  dynamic field5;
+  dynamic field6;
+  dynamic field7;
+  dynamic field8;
+  dynamic field9;
+  dynamic field10;
+  dynamic field11;
+  dynamic field12;
+  dynamic field13;
+  dynamic field14;
+  dynamic field15;
+  dynamic field16;
+  dynamic field17;
+  dynamic field18;
+  dynamic field19;
+}
+
+makeA(n) {
+  var a = new A();
+  if (n > 0) {
+    a.field1 = makeB(n - 1);
+    a.field2 = makeC(n - 1);
+    a.field3 = makeB(n - 1);
+    a.field4 = makeC(n - 1);
+  }
+  return a;
+}
+
+makeB(n) {
+  var b = new B();
+  if (n > 0) {
+    b.field1 = makeC(n - 1);
+    b.field2 = makeA(n - 1);
+    b.field3 = makeC(n - 1);
+    b.field4 = makeA(n - 1);
+  }
+  return b;
+}
+
+makeC(n) {
+  var c = new C();
+  if (n > 0) {
+    c.field1 = makeA(n - 1);
+    c.field2 = makeB(n - 1);
+    c.field3 = makeA(n - 1);
+    c.field4 = makeB(n - 1);
+  }
+  return c;
+}
+
+readFields(x) {
+  print(x.field1);
+  print(x.field2);
+  print(x.field3);
+  print(x.field4);
+}
+
+main(List<String> argsIn) async {
+  if (argsIn.contains("--testee")) {
+    // Trigger OOM.
+    // Must read the fields to prevent the writes from being optimized away. If
+    // the writes are optimized away, most of the tree is collectible right away
+    // and we timeout instead of triggering OOM.
+    readFields(makeA(50));
+    readFields(makeB(50));
+    readFields(makeC(50));
+    return;
+  }
+
+  var exec = Platform.executable;
+  var args = Platform.executableArguments +
+      [
+        "--old_gen_heap_size=15" /*MB*/,
+        "--verbose_gc",
+        "--verify_after_gc",
+        "--verify_store_buffer",
+        Platform.script.toFilePath(),
+        "--testee"
+      ];
+  print("+ $exec ${args.join(' ')}");
+
+  var result = await Process.run(exec, args);
+  print("Command stdout:");
+  print(result.stdout);
+  print("Command stderr:");
+  print(result.stderr);
+
+  Expect.equals(255, result.exitCode,
+      "Should see runtime exception error code, not SEGV");
+
+  Expect.isTrue(
+      result.stderr.contains("Unhandled exception:\nOut of Memory") ||
+          result.stderr.contains("Unhandled exception:\r\nOut of Memory"),
+      "Should see the Dart OutOfMemoryError");
+
+  // --verbose_gc not available in product mode
+  if (!new bool.fromEnvironment("dart.vm.product")) {
+    Expect.isTrue(result.stderr.contains("Aborting scavenge"),
+        "Should abort scavenge at least once");
+  }
+
+  Expect.isFalse(result.stderr.contains("error: Out of memory"),
+      "Should not see the C++ OUT_OF_MEMORY()");
+}
diff --git a/runtime/tests/vm/dart_2/unboxed_implicit_accessors_test.dart b/runtime/tests/vm/dart_2/unboxed_implicit_accessors_test.dart
new file mode 100644
index 0000000..08eea3a
--- /dev/null
+++ b/runtime/tests/vm/dart_2/unboxed_implicit_accessors_test.dart
@@ -0,0 +1,71 @@
+// 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.
+
+final l = <I>[A(), B(42, 4.2)];
+final l2 = <I2>[A2(), B2(42, 4.2)];
+
+main() {
+  if (l[0].intValue != 23) throw 'a';
+  if (l[0].doubleValue != 2.3) throw 'b';
+  if (l[1].intValue != 42) throw 'c';
+  if (l[1].doubleValue != 4.2) throw 'd';
+
+  if (l2[0].intValue != null) throw 'a';
+  if (l2[0].doubleValue != null) throw 'b';
+  if (l2[1].intValue != 42) throw 'c';
+  if (l2[1].doubleValue != 4.2) throw 'd';
+
+  if (int.parse('1') == 1) {
+    l2[0].intValue = 24;
+    l2[0].doubleValue = 2.4;
+    l2[1].intValue = 24;
+    l2[1].doubleValue = 2.4;
+  } else {
+    (l2[0] as A2).intValue = null;
+    (l2[0] as A2).doubleValue = null;
+  }
+}
+
+abstract class I {
+  int get intValue;
+  double get doubleValue;
+}
+
+class A implements I {
+  int get intValue => 23;
+  double get doubleValue => 2.3;
+}
+
+class B implements I {
+  // Field as well as getter/setter will be unboxed.
+  final int intValue;
+  // Field as well as getter/setter will be unboxed.
+  final double doubleValue;
+  B(this.intValue, this.doubleValue);
+}
+
+abstract class I2 {
+  void set intValue(int v) {}
+  void set doubleValue(double v) {}
+
+  int get intValue;
+  double get doubleValue;
+}
+
+class A2 implements I2 {
+  void set intValue(int v) {}
+  void set doubleValue(double v) {}
+
+  int get intValue => null;
+  double get doubleValue => null;
+}
+
+class B2 implements I2 {
+  // Field itself will get unboxed, but getter/setter will be boxed.
+  int intValue;
+  // Field itself will get unboxed, but getter/setter will be boxed.
+  double doubleValue;
+
+  B2(this.intValue, this.doubleValue);
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index e18c310..13c1e72 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -88,11 +88,13 @@
 dart/causal_stacks/async_throws_stack_no_causal_test: SkipByDesign # --no-lazy... does nothing on precompiler.
 dart/causal_stacks/async_throws_stack_non_symbolic_test: SkipByDesign # --no-lazy... does nothing on precompiler.
 dart/causal_stacks/async_throws_stack_test: SkipByDesign # --no-lazy... does nothing on precompiler.
+dart/scavenger_abort_test: SkipSlow
 dart/v8_snapshot_profile_writer_test: Pass, Slow # Can be slow due to re-invoking the precompiler.
 dart_2/causal_stacks/async_throws_stack_no_causal_non_symbolic_test: SkipByDesign # --no-lazy... does nothing on precompiler.
 dart_2/causal_stacks/async_throws_stack_no_causal_test: SkipByDesign # --no-lazy... does nothing on precompiler.
 dart_2/causal_stacks/async_throws_stack_non_symbolic_test: SkipByDesign # --no-lazy... does nothing on precompiler.
 dart_2/causal_stacks/async_throws_stack_test: SkipByDesign # --no-lazy... does nothing on precompiler.
+dart_2/scavenger_abort_test: SkipSlow
 dart_2/v8_snapshot_profile_writer_test: Pass, Slow # Can be slow due to re-invoking the precompiler.
 
 [ $compiler != dartkp ]
diff --git a/runtime/vm/compiler/backend/block_builder.h b/runtime/vm/compiler/backend/block_builder.h
index 02ea193..99d3764 100644
--- a/runtime/vm/compiler/backend/block_builder.h
+++ b/runtime/vm/compiler/backend/block_builder.h
@@ -102,7 +102,7 @@
       // adjust reaching type. This is done manually because there is no type
       // propagation when building intrinsics.
       unboxed_value->AsUnbox()->value()->SetReachingType(
-          new CompileType(CompileType::FromCid(CidForRepresentation(rep))));
+          TypeForRepresentation(rep));
     }
     return unboxed_value;
   }
@@ -139,21 +139,22 @@
   }
 
  private:
-  static intptr_t CidForRepresentation(Representation rep) {
+  static CompileType* TypeForRepresentation(Representation rep) {
     switch (rep) {
       case kUnboxedDouble:
-        return kDoubleCid;
+        return new CompileType(CompileType::FromCid(kDoubleCid));
       case kUnboxedFloat32x4:
-        return kFloat32x4Cid;
+        return new CompileType(CompileType::FromCid(kFloat32x4Cid));
       case kUnboxedInt32x4:
-        return kInt32x4Cid;
+        return new CompileType(CompileType::FromCid(kInt32x4Cid));
       case kUnboxedFloat64x2:
-        return kFloat64x2Cid;
+        return new CompileType(CompileType::FromCid(kFloat64x2Cid));
       case kUnboxedUint32:
-        return kDynamicCid;  // smi or mint.
+      case kUnboxedInt64:
+        return new CompileType(CompileType::Int());
       default:
         UNREACHABLE();
-        return kIllegalCid;
+        return nullptr;
     }
   }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index bc98ea2..7d81c2b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -1279,58 +1279,24 @@
   set_intrinsic_slow_path_label(&exit);
 
   if (FLAG_intrinsify) {
-    // Intrinsification skips arguments checks, therefore disable if in checked
-    // mode or strong mode.
-    //
-    // Though for implicit getters, which have only the receiver as parameter,
-    // there are no checks necessary in any case and we can therefore intrinsify
-    // them even in checked mode and strong mode.
-    switch (parsed_function().function().kind()) {
-      case FunctionLayout::kImplicitGetter: {
-        Field& field = Field::Handle(function().accessor_field());
-        ASSERT(!field.IsNull());
-#if defined(DEBUG)
-        // HACK: Clone the field to ignore assertion in Field::guarded_cid().
-        // The assertion is intended to ensure that the background compiler sees
-        // consistent cids, but that's not important in this case because
-        // IsPotentialUnboxedField can go from true to false, but not false to
-        // true, and we only do this optimisation if it is false.
-        field = field.CloneFromOriginal();
-#endif
-
-        // Only intrinsify getter if the field cannot contain a mutable double.
-        // Reading from a mutable double box requires allocating a fresh double.
-        if (field.is_instance() && !field.needs_load_guard() &&
-            !field.is_late() && !IsPotentialUnboxedField(field)) {
-          SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
-          GenerateGetterIntrinsic(compiler::target::Field::OffsetOf(field));
-          SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
-          return true;
-        }
-        return false;
-      }
-      case FunctionLayout::kImplicitSetter:
-        break;
+    const auto& function = parsed_function().function();
+    if (function.IsMethodExtractor()) {
 #if !defined(TARGET_ARCH_IA32)
-      case FunctionLayout::kMethodExtractor: {
-        auto& extracted_method = Function::ZoneHandle(
-            parsed_function().function().extracted_method_closure());
-        auto& klass = Class::Handle(extracted_method.Owner());
-        const intptr_t type_arguments_field_offset =
-            compiler::target::Class::HasTypeArgumentsField(klass)
-                ? (compiler::target::Class::TypeArgumentsFieldOffset(klass) -
-                   kHeapObjectTag)
-                : 0;
+      auto& extracted_method =
+          Function::ZoneHandle(function.extracted_method_closure());
+      auto& klass = Class::Handle(extracted_method.Owner());
+      const intptr_t type_arguments_field_offset =
+          compiler::target::Class::HasTypeArgumentsField(klass)
+              ? (compiler::target::Class::TypeArgumentsFieldOffset(klass) -
+                 kHeapObjectTag)
+              : 0;
 
-        SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
-        GenerateMethodExtractorIntrinsic(extracted_method,
-                                         type_arguments_field_offset);
-        SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
-        return true;
-      }
+      SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
+      GenerateMethodExtractorIntrinsic(extracted_method,
+                                       type_arguments_field_offset);
+      SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
+      return true;
 #endif  // !defined(TARGET_ARCH_IA32)
-      default:
-        break;
     }
   }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 2706648..9efcd30 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -957,6 +957,7 @@
   friend class CheckStackOverflowSlowPath;  // For pending_deoptimization_env_.
   friend class CheckedSmiSlowPath;          // Same.
   friend class CheckedSmiComparisonSlowPath;  // Same.
+  friend class GraphInstrinsicCodeGenScope;   // For optimizing_.
 
   // Architecture specific implementation of simple native moves.
   void EmitNativeMoveArchitecture(const compiler::ffi::NativeLocation& dst,
@@ -1083,7 +1084,7 @@
   void GenerateMethodExtractorIntrinsic(const Function& extracted_method,
                                         intptr_t type_arguments_field_offset);
 
-  void GenerateGetterIntrinsic(intptr_t offset);
+  void GenerateGetterIntrinsic(const Function& accessor, const Field& field);
 
   // Perform a greedy local register allocation.  Consider all registers free.
   void AllocateRegistersLocally(Instruction* instr);
@@ -1206,7 +1207,7 @@
   // The table selectors of all dispatch table calls in the current function.
   GrowableArray<const compiler::TableSelector*> dispatch_table_call_targets_;
   GrowableArray<IndirectGotoInstr*> indirect_gotos_;
-  const bool is_optimizing_;
+  bool is_optimizing_;
   SpeculativeInliningPolicy* speculative_policy_;
   // Set to true if optimized code has IC calls.
   bool may_reoptimize_;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 13b6e62..65cba11 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -875,16 +875,6 @@
       compiler::target::Code::entry_point_offset(Code::EntryKind::kUnchecked)));
 }
 
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
-  // LR: return address.
-  // SP: receiver.
-  // Sequence node has one return node, its input is load field node.
-  __ Comment("Intrinsic Getter");
-  __ ldr(R0, compiler::Address(SP, 0 * compiler::target::kWordSize));
-  __ LoadFieldFromOffset(kWord, R0, R0, offset);
-  __ Ret();
-}
-
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
   if (CanOptimizeFunction() && function.IsOptimizable() &&
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 7bbe356..131308c 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -840,16 +840,6 @@
   __ br(R0);
 }
 
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
-  // LR: return address.
-  // SP: receiver.
-  // Sequence node has one return node, its input is load field node.
-  __ Comment("Intrinsic Getter");
-  __ LoadFromOffset(R0, SP, 0 * kWordSize);
-  __ LoadFieldFromOffset(R0, R0, offset);
-  __ ret();
-}
-
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
   if (CanOptimizeFunction() && function.IsOptimizable() &&
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index f5fd0a2..6b96aff 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -755,16 +755,6 @@
   }
 }
 
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
-  // TOS: return address.
-  // +1 : receiver.
-  // Sequence node has one return node, its input is load field node.
-  __ Comment("Intrinsic Getter");
-  __ movl(EAX, compiler::Address(ESP, 1 * kWordSize));
-  __ movl(EAX, compiler::FieldAddress(EAX, offset));
-  __ ret();
-}
-
 // NOTE: If the entry code shape changes, ReturnAddressLocator in profiler.cc
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 756778ee..cf229f3 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -847,16 +847,6 @@
       CODE_REG, Code::entry_point_offset(Code::EntryKind::kUnchecked)));
 }
 
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
-  // TOS: return address.
-  // +1 : receiver.
-  // Sequence node has one return node, its input is load field node.
-  __ Comment("Intrinsic Getter");
-  __ movq(RAX, compiler::Address(RSP, 1 * kWordSize));
-  __ movq(RAX, compiler::FieldAddress(RAX, offset));
-  __ ret();
-}
-
 // NOTE: If the entry code shape changes, ReturnAddressLocator in profiler.cc
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 308d0b9..e372b4a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -5534,7 +5534,7 @@
   return LoadFieldInstr::IsFixedLengthArrayCid(cid);
 }
 
-Definition* CheckArrayBoundInstr::Canonicalize(FlowGraph* flow_graph) {
+Definition* CheckBoundBase::Canonicalize(FlowGraph* flow_graph) {
   return IsRedundant() ? index()->definition() : this;
 }
 
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index f26a6ee..3ee05ef 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -8640,6 +8640,8 @@
   Value* length() const { return inputs_[kLengthPos]; }
   Value* index() const { return inputs_[kIndexPos]; }
 
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
   virtual CheckBoundBase* AsCheckBoundBase() { return this; }
   virtual const CheckBoundBase* AsCheckBoundBase() const { return this; }
   virtual Value* RedefinedValue() const;
@@ -8676,8 +8678,6 @@
 
   void mark_generalized() { generalized_ = true; }
 
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
   // Returns the length offset for array and string types.
   static intptr_t LengthOffsetFor(intptr_t class_id);
 
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 5b4b827..2607860 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -4960,24 +4960,35 @@
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
   // FLAG_use_bare_instructions mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
+  auto object_store = Isolate::Current()->object_store();
+  const bool stubs_in_vm_isolate =
+      object_store->allocate_mint_with_fpu_regs_stub()
+          ->ptr()
+          ->InVMIsolateHeap() ||
+      object_store->allocate_mint_without_fpu_regs_stub()
+          ->ptr()
+          ->InVMIsolateHeap();
+  const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
+                                     FLAG_use_bare_instructions &&
+                                     !stubs_in_vm_isolate;
   LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
       ValueFitsSmi()
           ? LocationSummary::kNoCall
-          : ((SlowPathSharingSupported(opt) && FLAG_use_bare_instructions &&
-              !Isolate::Current()
-                   ->object_store()
-                   ->allocate_mint_with_fpu_regs_stub()
-                   ->ptr()
-                   ->InVMIsolateHeap())
-                 ? LocationSummary::kCallOnSharedSlowPath
-                 : LocationSummary::kCallOnSlowPath));
+          : ((shared_slow_path_call ? LocationSummary::kCallOnSharedSlowPath
+                                    : LocationSummary::kCallOnSlowPath)));
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  if (!ValueFitsSmi()) {
-    summary->set_temp(0, Location::RegisterLocation(R1));
+  if (ValueFitsSmi()) {
+    summary->set_out(0, Location::RequiresRegister());
+  } else if (shared_slow_path_call) {
+    summary->set_out(0,
+                     Location::RegisterLocation(AllocateMintABI::kResultReg));
+    summary->set_temp(0, Location::RegisterLocation(AllocateMintABI::kTempReg));
+  } else {
+    summary->set_out(0, Location::RequiresRegister());
+    summary->set_temp(0, Location::RequiresRegister());
   }
-  summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
 }
 
@@ -5013,7 +5024,8 @@
         live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
                       : object_store->allocate_mint_without_fpu_regs_stub());
 
-    ASSERT(!locs()->live_registers()->ContainsRegister(R0));
+    ASSERT(!locs()->live_registers()->ContainsRegister(
+        AllocateMintABI::kResultReg));
     auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
     compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
                                locs(), DeoptId::kNone, extended_env);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index bf7a7f6..3102576 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -4168,16 +4168,14 @@
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
   // FLAG_use_bare_instructions mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
-  const bool stubs_in_vm_isolate = (Isolate::Current()
-                                        ->object_store()
-                                        ->allocate_mint_with_fpu_regs_stub()
-                                        ->ptr()
-                                        ->InVMIsolateHeap() ||
-                                    Isolate::Current()
-                                        ->object_store()
-                                        ->allocate_mint_without_fpu_regs_stub()
-                                        ->ptr()
-                                        ->InVMIsolateHeap());
+  auto object_store = Isolate::Current()->object_store();
+  const bool stubs_in_vm_isolate =
+      object_store->allocate_mint_with_fpu_regs_stub()
+          ->ptr()
+          ->InVMIsolateHeap() ||
+      object_store->allocate_mint_without_fpu_regs_stub()
+          ->ptr()
+          ->InVMIsolateHeap();
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
                                      FLAG_use_bare_instructions &&
                                      !stubs_in_vm_isolate;
@@ -4187,13 +4185,13 @@
           ? LocationSummary::kNoCall
           : shared_slow_path_call ? LocationSummary::kCallOnSharedSlowPath
                                   : LocationSummary::kCallOnSlowPath);
-
   summary->set_in(0, Location::RequiresRegister());
   if (ValueFitsSmi()) {
     summary->set_out(0, Location::RequiresRegister());
   } else if (shared_slow_path_call) {
-    summary->set_out(0, Location::RegisterLocation(R0));
-    summary->set_temp(0, Location::RegisterLocation(R1));
+    summary->set_out(0,
+                     Location::RegisterLocation(AllocateMintABI::kResultReg));
+    summary->set_temp(0, Location::RegisterLocation(AllocateMintABI::kTempReg));
   } else {
     summary->set_out(0, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
@@ -4216,28 +4214,25 @@
   __ b(&done, NO_OVERFLOW);
 
   Register temp = locs()->temp(0).reg();
-
   if (compiler->intrinsic_mode()) {
     __ TryAllocate(compiler->mint_class(),
                    compiler->intrinsic_slow_path_label(), out, temp);
-  } else {
-    if (locs()->call_on_shared_slow_path()) {
-      auto object_store = compiler->isolate()->object_store();
-      const bool live_fpu_regs =
-          locs()->live_registers()->FpuRegisterCount() > 0;
-      const auto& stub = Code::ZoneHandle(
-          compiler->zone(),
-          live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
-                        : object_store->allocate_mint_without_fpu_regs_stub());
+  } else if (locs()->call_on_shared_slow_path()) {
+    auto object_store = compiler->isolate()->object_store();
+    const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0;
+    const auto& stub = Code::ZoneHandle(
+        compiler->zone(),
+        live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
+                      : object_store->allocate_mint_without_fpu_regs_stub());
 
-      ASSERT(!locs()->live_registers()->ContainsRegister(R0));
-      auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
-      compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
-                                 locs(), DeoptId::kNone, extended_env);
-    } else {
-      BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
-                                      out, temp);
-    }
+    ASSERT(!locs()->live_registers()->ContainsRegister(
+        AllocateMintABI::kResultReg));
+    auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
+    compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
+                               locs(), DeoptId::kNone, extended_env);
+  } else {
+    BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
+                                    temp);
   }
 
   __ StoreToOffset(in, out, Mint::value_offset() - kHeapObjectTag);
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index f15c658..128012a 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -4446,15 +4446,37 @@
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps,
-                      ValueFitsSmi() ? LocationSummary::kNoCall
-                                     : LocationSummary::kCallOnSlowPath);
+  // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
+  // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+  // replaced with isolate-specific stubs.
+  auto object_store = Isolate::Current()->object_store();
+  const bool stubs_in_vm_isolate =
+      object_store->allocate_mint_with_fpu_regs_stub()
+          ->ptr()
+          ->InVMIsolateHeap() ||
+      object_store->allocate_mint_without_fpu_regs_stub()
+          ->ptr()
+          ->InVMIsolateHeap();
+  const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
+                                     FLAG_use_bare_instructions &&
+                                     !stubs_in_vm_isolate;
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps,
+      ValueFitsSmi()
+          ? LocationSummary::kNoCall
+          : ((shared_slow_path_call ? LocationSummary::kCallOnSharedSlowPath
+                                    : LocationSummary::kCallOnSlowPath)));
   summary->set_in(0, Location::RequiresRegister());
-  if (!ValueFitsSmi()) {
+  if (ValueFitsSmi()) {
+    summary->set_out(0, Location::RequiresRegister());
+  } else if (shared_slow_path_call) {
+    summary->set_out(0,
+                     Location::RegisterLocation(AllocateMintABI::kResultReg));
+    summary->set_temp(0, Location::RegisterLocation(AllocateMintABI::kTempReg));
+  } else {
+    summary->set_out(0, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
   }
-  summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
@@ -4463,17 +4485,39 @@
   const Register value = locs()->in(0).reg();
   __ MoveRegister(out, value);
   __ SmiTag(out);
-  if (!ValueFitsSmi()) {
-    const Register temp = locs()->temp(0).reg();
-    compiler::Label done;
-    // If the value doesn't fit in a smi, the tagging changes the sign,
-    // which causes the overflow flag to be set.
-    __ j(NO_OVERFLOW, &done);
+  if (ValueFitsSmi()) {
+    return;
+  }
+  // If the value doesn't fit in a smi, the tagging changes the sign,
+  // which causes the overflow flag to be set.
+  compiler::Label done;
+  __ j(NO_OVERFLOW, &done);
+
+  const Register temp = locs()->temp(0).reg();
+  if (compiler->intrinsic_mode()) {
+    __ TryAllocate(compiler->mint_class(),
+                   compiler->intrinsic_slow_path_label(),
+                   /*near_jump=*/true, out, temp);
+  } else if (locs()->call_on_shared_slow_path()) {
+    auto object_store = compiler->isolate()->object_store();
+    const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0;
+    const auto& stub = Code::ZoneHandle(
+        compiler->zone(),
+        live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
+                      : object_store->allocate_mint_without_fpu_regs_stub());
+
+    ASSERT(!locs()->live_registers()->ContainsRegister(
+        AllocateMintABI::kResultReg));
+    auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
+    compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
+                               locs(), DeoptId::kNone, extended_env);
+  } else {
     BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
                                     temp);
-    __ movq(compiler::FieldAddress(out, Mint::value_offset()), value);
-    __ Bind(&done);
   }
+
+  __ movq(compiler::FieldAddress(out, Mint::value_offset()), value);
+  __ Bind(&done);
 }
 
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 13529c2..fd73901 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -25,13 +25,11 @@
   // and non-generic-covariant parameters. The same applies to type parameters
   // bounds for type parameters of generic functions.
   //
-  // In JIT mode we dynamically generate trampolines (dynamic invocation
-  // forwarders) that perform type checks when arriving to a method from a
-  // dynamic call-site.
+  // Normally dynamic call sites will call dyn:* forwarders which perform type
+  // checks.
   //
-  // In AOT mode we don't dynamically generate such trampolines but instead rely
-  // on a static analysis to discover which methods can be invoked dynamically,
-  // and generate the necessary trampolines during precompilation.
+  // Though for some kinds of methods (e.g. ffi trampolines called from native
+  // code) we do have to perform type checks for all parameters.
   return !method.CanReceiveDynamicInvocation();
 }
 
@@ -409,7 +407,7 @@
     }
     case FunctionLayout::kNoSuchMethodDispatcher:
     case FunctionLayout::kInvokeFieldDispatcher:
-    case FunctionLayout::kFfiTrampoline:
+    case FunctionLayout::kFfiTrampoline: {
       for (intptr_t i = 0; i < function.NumParameters(); ++i) {
         LocalVariable* variable = MakeVariable(
             TokenPosition::kNoSource, TokenPosition::kNoSource,
@@ -433,6 +431,7 @@
         --depth_.catch_;
       }
       break;
+    }
     case FunctionLayout::kSignatureFunction:
     case FunctionLayout::kIrregexpFunction:
       UNREACHABLE();
@@ -443,6 +442,7 @@
   if (parsed_function_->function().MayHaveUncheckedEntryPoint()) {
     scope_->AddVariable(parsed_function_->EnsureEntryPointsTemp());
   }
+
   parsed_function_->AllocateVariables();
 
   return result_;
@@ -633,6 +633,13 @@
     LocalVariable* future = scope_->LookupVariable(Symbols::_future(), true);
     ASSERT(future != nullptr);
     future->set_is_chained_future();
+    future->set_expected_context_index(Context::kFutureTimeoutFutureIndex);
+  } else if (function.recognized_kind() == MethodRecognizer::kFutureWait &&
+             depth_.function_ == 1) {
+    LocalVariable* future = scope_->LookupVariable(Symbols::_future(), true);
+    ASSERT(future != nullptr);
+    future->set_is_chained_future();
+    future->set_expected_context_index(Context::kFutureWaitFutureIndex);
   }
 }
 
@@ -1313,7 +1320,8 @@
     variable->set_is_late();
     variable->set_late_init_offset(initializer_offset);
   }
-  // Lift the two special async vars out of the function body scope, into the
+
+  // Lift the special async vars out of the function body scope, into the
   // outer function declaration scope.
   // This way we can allocate them in the outermost context at fixed indices,
   // allowing support for --lazy-async-stacks implementation to find awaiters.
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index fc8fa3d..3f77aa2 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -13,6 +13,7 @@
 #include "vm/compiler/backend/linearscan.h"
 #include "vm/compiler/backend/range_analysis.h"
 #include "vm/compiler/compiler_pass.h"
+#include "vm/compiler/intrinsifier.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/cpu.h"
 #include "vm/flag_list.h"
@@ -22,9 +23,29 @@
 DECLARE_FLAG(bool, print_flow_graph);
 DECLARE_FLAG(bool, print_flow_graph_optimized);
 
+class GraphInstrinsicCodeGenScope {
+ public:
+  explicit GraphInstrinsicCodeGenScope(FlowGraphCompiler* compiler)
+      : compiler_(compiler), old_is_optimizing_(compiler->is_optimizing()) {
+    compiler_->is_optimizing_ = true;
+  }
+  ~GraphInstrinsicCodeGenScope() {
+    compiler_->is_optimizing_ = old_is_optimizing_;
+  }
+
+ private:
+  FlowGraphCompiler* compiler_;
+  bool old_is_optimizing_;
+};
+
 namespace compiler {
 
 static void EmitCodeFor(FlowGraphCompiler* compiler, FlowGraph* graph) {
+  // For graph intrinsics we run the linearscan register allocator, which will
+  // pass opt=true for MakeLocationSummary. We therefore also have to ensure
+  // `compiler->is_optimizing()` is set to true during EmitNativeCode.
+  GraphInstrinsicCodeGenScope optimizing_scope(compiler);
+
   // The FlowGraph here is constructed by the intrinsics builder methods, and
   // is different from compiler->flow_graph(), the original method's flow graph.
   compiler->assembler()->Comment("Graph intrinsic begin");
@@ -75,6 +96,7 @@
   FlowGraph* graph =
       new FlowGraph(parsed_function, graph_entry, block_id, prologue_info);
   const Function& function = parsed_function.function();
+
   switch (function.recognized_kind()) {
 #define EMIT_CASE(class_name, function_name, enum_name, fp)                    \
   case MethodRecognizer::k##enum_name:                                         \
@@ -82,9 +104,15 @@
     break;
 
     GRAPH_INTRINSICS_LIST(EMIT_CASE);
-    default:
-      return false;
 #undef EMIT_CASE
+    default:
+      if (function.IsImplicitGetterFunction()) {
+        if (!Build_ImplicitGetter(graph)) return false;
+      } else if (function.IsImplicitSetterFunction()) {
+        if (!Build_ImplicitSetter(graph)) return false;
+      } else {
+        return false;
+      }
   }
 
   if (FLAG_support_il_printer && FLAG_print_flow_graph &&
@@ -1054,5 +1082,94 @@
                                   flow_graph);
 }
 
+bool GraphIntrinsifier::Build_ImplicitGetter(FlowGraph* flow_graph) {
+  // This code will only be invoked if our assumptions have been met (see
+  // [Intrinsifier::CanIntrinsifyFieldAccessor])
+  auto zone = flow_graph->zone();
+  const auto& function = flow_graph->function();
+  ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+
+  auto& field = Field::Handle(zone, function.accessor_field());
+  if (Field::ShouldCloneFields()) {
+    field = field.CloneFromOriginal();
+  }
+  ASSERT(field.is_instance() && !field.is_late() && !field.needs_load_guard());
+
+  const auto& slot = Slot::Get(field, &flow_graph->parsed_function());
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  auto normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  auto receiver = builder.AddParameter(0, /*with_frame=*/false);
+  auto field_value = builder.AddDefinition(new (zone) LoadFieldInstr(
+      new (zone) Value(receiver), slot, builder.TokenPos()));
+  builder.AddReturn(new (zone) Value(field_value));
+  return true;
+}
+
+bool GraphIntrinsifier::Build_ImplicitSetter(FlowGraph* flow_graph) {
+  // This code will only be invoked if our assumptions have been met (see
+  // [Intrinsifier::CanIntrinsifyFieldAccessor])
+  auto zone = flow_graph->zone();
+  const auto& function = flow_graph->function();
+  ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+
+  auto& field = Field::Handle(zone, function.accessor_field());
+  if (Field::ShouldCloneFields()) {
+    field = field.CloneFromOriginal();
+  }
+  ASSERT(field.is_instance() && !field.is_final());
+  ASSERT(!function.HasUnboxedParameters() ||
+         FlowGraphCompiler::IsUnboxedField(field));
+
+  const auto& slot = Slot::Get(field, &flow_graph->parsed_function());
+
+  const auto barrier_mode = FlowGraphCompiler::IsUnboxedField(field)
+                                ? kNoStoreBarrier
+                                : kEmitStoreBarrier;
+
+  flow_graph->CreateCommonConstants();
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  auto normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  auto receiver = builder.AddParameter(0, /*with_frame=*/false);
+  auto value = builder.AddParameter(1, /*with_frame=*/false);
+
+  if (!function.HasUnboxedParameters() &&
+      FlowGraphCompiler::IsUnboxedField(field)) {
+    // We do not support storing to possibly guarded fields in JIT in graph
+    // intrinsics.
+    ASSERT(FLAG_precompiled_mode);
+
+    Representation representation = kNoRepresentation;
+    switch (field.guarded_cid()) {
+      case kDoubleCid:
+        representation = kUnboxedDouble;
+        break;
+      case kFloat32x4Cid:
+        representation = kUnboxedFloat32x4;
+        break;
+      case kFloat64x2Cid:
+        representation = kUnboxedFloat64x2;
+        break;
+      default:
+        ASSERT(field.is_non_nullable_integer());
+        representation = kUnboxedInt64;
+        break;
+    }
+    value = builder.AddUnboxInstr(representation, new Value(value),
+                                  /*is_checked=*/true);
+  }
+
+  builder.AddInstruction(new (zone) StoreInstanceFieldInstr(
+      slot, new (zone) Value(receiver), new (zone) Value(value), barrier_mode,
+      builder.TokenPos()));
+
+  builder.AddReturn(new (zone) Value(flow_graph->constant_null()));
+  return true;
+}
+
 }  // namespace compiler
 }  // namespace dart
diff --git a/runtime/vm/compiler/graph_intrinsifier.h b/runtime/vm/compiler/graph_intrinsifier.h
index c122b5c..3104d2f 100644
--- a/runtime/vm/compiler/graph_intrinsifier.h
+++ b/runtime/vm/compiler/graph_intrinsifier.h
@@ -48,6 +48,9 @@
   GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
 
 #undef DECLARE_FUNCTION
+
+  static bool Build_ImplicitGetter(FlowGraph* flow_graph);
+  static bool Build_ImplicitSetter(FlowGraph* flow_graph);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index e14922b..7277c21 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -45,7 +45,7 @@
     }
     return false;
   }
-  if (!function.is_intrinsic()) {
+  if (!function.is_intrinsic() && !CanIntrinsifyFieldAccessor(function)) {
     if (FLAG_trace_intrinsifier) {
       THR_Print("No, not intrinsic function.\n");
     }
@@ -74,6 +74,85 @@
   return true;
 }
 
+bool Intrinsifier::CanIntrinsifyFieldAccessor(const Function& function) {
+  const bool is_getter = function.IsImplicitGetterFunction();
+  const bool is_setter = function.IsImplicitSetterFunction();
+  if (!is_getter && !is_setter) return false;
+
+  Field& field = Field::Handle(function.accessor_field());
+  ASSERT(!field.IsNull());
+
+  // The checks further down examine the field and its guard.
+  //
+  // In JIT mode we only intrinsify the field accessor if there is no active
+  // guard, meaning the state transition has reached its final `kDynamicCid`
+  // state (where it stays).
+  //
+  // If we intrinsify, the intrinsified code therefore does not depend on the
+  // field guard and we do not add it to the guarded fields via
+  // [ParsedFunction::AddToGuardedFields].
+  if (Field::ShouldCloneFields()) {
+    field = field.CloneFromOriginal();
+  }
+
+  // We only graph intrinsify implicit instance getters/setter for now.
+  if (!field.is_instance()) return false;
+
+  if (is_getter) {
+    // We don't support complex getter cases.
+    if (field.is_late() || field.needs_load_guard()) return false;
+
+    if (FlowGraphCompiler::IsPotentialUnboxedField(field)) {
+      if (function.HasUnboxedReturnValue()) {
+        // In AOT mode: Unboxed fields contain the unboxed value and can be
+        // returned in unboxed form.
+        ASSERT(FLAG_precompiled_mode);
+      } else {
+        // In JIT mode: Unboxed fields contain a mutable box which we cannot
+        // return.
+        return false;
+      }
+    } else {
+      // If the field is boxed, then the getter cannot return an unboxed value
+      // either (if it could, we would know the field itself can be unboxed).
+      RELEASE_ASSERT(!function.HasUnboxedReturnValue());
+    }
+  } else {
+    ASSERT(is_setter);
+
+    // We don't support complex setter cases.
+    if (field.is_final()) {
+      RELEASE_ASSERT(field.is_late());
+      return false;
+    }
+
+    // We only support cases where there is no need to check for argument types.
+    //
+    // Normally we have to check the parameter type.
+    ASSERT(function.NeedsArgumentTypeChecks());
+    // Dynamic call sites will go to dyn:set:* instead.
+    ASSERT(!function.CanReceiveDynamicInvocation());
+    // Covariant parameter types have to be checked, which we don't support.
+    if (field.is_covariant() || field.is_generic_covariant_impl()) return false;
+
+    // If the incoming value is unboxed we only support real unboxed fields to
+    // avoid the need for boxing (which we cannot do in the intrinsic).
+    if (function.HasUnboxedParameters()) {
+      ASSERT(FLAG_precompiled_mode);
+      if (!FlowGraphCompiler::IsUnboxedField(field)) {
+        return false;
+      }
+    }
+
+    // We don't support field guards in graph intrinsic stores.
+    if (!FLAG_precompiled_mode && field.guarded_cid() != kDynamicCid) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
 struct IntrinsicDesc {
   const char* class_name;
   const char* function_name;
diff --git a/runtime/vm/compiler/intrinsifier.h b/runtime/vm/compiler/intrinsifier.h
index f8895a4..835f73f 100644
--- a/runtime/vm/compiler/intrinsifier.h
+++ b/runtime/vm/compiler/intrinsifier.h
@@ -34,7 +34,9 @@
   static void InitializeState();
 
  private:
+  friend class GraphIntrinsifier;  // For CanIntrinsifyFieldAccessor.
   static bool CanIntrinsify(const Function& function);
+  static bool CanIntrinsifyFieldAccessor(const Function& function);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.cc b/runtime/vm/compiler/jit/jit_call_specializer.cc
index 688084b..6ce72c4 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.cc
+++ b/runtime/vm/compiler/jit/jit_call_specializer.cc
@@ -30,15 +30,12 @@
 #define I (isolate())
 #define Z (zone())
 
-static bool ShouldCloneFields() {
-  return Compiler::IsBackgroundCompilation() ||
-         FLAG_force_clone_compiler_objects;
-}
-
 JitCallSpecializer::JitCallSpecializer(
     FlowGraph* flow_graph,
     SpeculativeInliningPolicy* speculative_policy)
-    : CallSpecializer(flow_graph, speculative_policy, ShouldCloneFields()) {}
+    : CallSpecializer(flow_graph,
+                      speculative_policy,
+                      Field::ShouldCloneFields()) {}
 
 bool JitCallSpecializer::IsAllowedForInlining(intptr_t deopt_id) const {
   return true;
diff --git a/runtime/vm/compiler/offsets_extractor.cc b/runtime/vm/compiler/offsets_extractor.cc
index 80a6870..a75c847 100644
--- a/runtime/vm/compiler/offsets_extractor.cc
+++ b/runtime/vm/compiler/offsets_extractor.cc
@@ -53,9 +53,6 @@
                "_element_size = "                                              \
             << Class::ArrayTraits::kElementSize << ";\n";
 
-#define PRINT_ARRAY_STRUCTFIELD_OFFSET(Class, Name, ElementOffsetName,         \
-                                       FieldOffset)
-
 #define PRINT_SIZEOF(Class, Name, What)                                        \
   std::cout << "static constexpr dart::compiler::target::word AOT_" #Class     \
                "_" #Name " = "                                                 \
@@ -81,8 +78,6 @@
                "_" #Name " = "                                                 \
             << Class::Name << ";\n";
 
-#define PRECOMP_NO_CHECK(Code)
-
 #else  // defined(DART_PRECOMPILED_RUNTIME)
 
 #define PRINT_FIELD_OFFSET(Class, Name)                                        \
@@ -98,9 +93,6 @@
                "_element_size = "                                              \
             << Class::ArrayTraits::kElementSize << ";\n";
 
-#define PRINT_ARRAY_STRUCTFIELD_OFFSET(Class, Name, ElementOffsetName,         \
-                                       FieldOffset)
-
 #define PRINT_SIZEOF(Class, Name, What)                                        \
   std::cout << "static constexpr dart::compiler::target::word " #Class         \
                "_" #Name " = "                                                 \
@@ -126,21 +118,19 @@
                "_" #Name " = "                                                 \
             << Class::Name << ";\n";
 
-#define PRECOMP_NO_CHECK(Code) Code
+    JIT_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
+                     PRINT_RANGE, PRINT_CONSTANT)
 
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-    OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT,
-                 PRINT_ARRAY_STRUCTFIELD_OFFSET, PRINT_SIZEOF, PRINT_RANGE,
-                 PRINT_CONSTANT, PRECOMP_NO_CHECK)
+    COMMON_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
+                        PRINT_RANGE, PRINT_CONSTANT)
 
 #undef PRINT_FIELD_OFFSET
 #undef PRINT_ARRAY_LAYOUT
-#undef PRINT_ARRAY_STRUCTFIELD_OFFSET
 #undef PRINT_SIZEOF
 #undef PRINT_RANGE
 #undef PRINT_CONSTANT
-#undef PRECOMP_NO_CHECK
   }
 };
 
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index d497854..c05d57b 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -178,6 +178,7 @@
   V(::, reachabilityFence, ReachabilityFence, 0xad39d0a6)                      \
   V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x78f44c3c)                          \
   V(_Future, timeout, FutureTimeout, 0x010f8ad4)                               \
+  V(Future, wait, FutureWait, 0x486414a9)                                      \
 
 // List of intrinsics:
 // (class-name, function-name, intrinsification method, fingerprint).
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 16b4c0c..8a16400 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -508,6 +508,10 @@
   return TranslateOffsetInWords(dart::Context::variable_offset(n));
 }
 
+#define DEFINE_CONSTANT(Class, Name) const word Class::Name = Class##_##Name;
+
+#if defined(TARGET_ARCH_IA32)
+
 #define DEFINE_FIELD(clazz, name)                                              \
   word clazz::name() { return clazz##_##name; }
 
@@ -516,50 +520,120 @@
     return clazz##_elements_start_offset + index * clazz##_element_size;       \
   }
 
-#define DEFINE_ARRAY_STRUCTFIELD(clazz, name, element_offset, field_offset)    \
-  word clazz::name(intptr_t index) {                                           \
-    return element_offset(index) + field_offset;                               \
-  }
-
-#if defined(TARGET_ARCH_IA32)
-
 #define DEFINE_SIZEOF(clazz, name, what)                                       \
   word clazz::name() { return clazz##_##name; }
 
-#else
-
-#define DEFINE_SIZEOF(clazz, name, what)                                       \
-  word clazz::name() {                                                         \
-    return FLAG_precompiled_mode ? AOT_##clazz##_##name : clazz##_##name;      \
-  }
-
-#endif  //  defined(TARGET_ARCH_IA32)
-
 #define DEFINE_RANGE(Class, Getter, Type, First, Last, Filter)                 \
   word Class::Getter(Type index) {                                             \
     return Class##_##Getter[static_cast<intptr_t>(index) -                     \
                             static_cast<intptr_t>(First)];                     \
   }
 
-#define DEFINE_CONSTANT(Class, Name) const word Class::Name = Class##_##Name;
+JIT_OFFSETS_LIST(DEFINE_FIELD,
+                 DEFINE_ARRAY,
+                 DEFINE_SIZEOF,
+                 DEFINE_RANGE,
+                 DEFINE_CONSTANT)
 
-#define PRECOMP_NO_CHECK(Code) Code
+COMMON_OFFSETS_LIST(DEFINE_FIELD,
+                    DEFINE_ARRAY,
+                    DEFINE_SIZEOF,
+                    DEFINE_RANGE,
+                    DEFINE_CONSTANT)
 
-OFFSETS_LIST(DEFINE_FIELD,
-             DEFINE_ARRAY,
-             DEFINE_ARRAY_STRUCTFIELD,
-             DEFINE_SIZEOF,
-             DEFINE_RANGE,
-             DEFINE_CONSTANT,
-             PRECOMP_NO_CHECK)
+#else
+
+#define DEFINE_JIT_FIELD(clazz, name)                                          \
+  word clazz::name() {                                                         \
+    if (FLAG_precompiled_mode) {                                               \
+      FATAL1("Use JIT-only field %s in precompiled mode", #clazz "::" #name);  \
+    }                                                                          \
+    return clazz##_##name;                                                     \
+  }
+
+#define DEFINE_JIT_ARRAY(clazz, name)                                          \
+  word clazz::name(intptr_t index) {                                           \
+    if (FLAG_precompiled_mode) {                                               \
+      FATAL1("Use of JIT-only array %s in precompiled mode",                   \
+             #clazz "::" #name);                                               \
+    }                                                                          \
+    return clazz##_elements_start_offset + index * clazz##_element_size;       \
+  }
+
+#define DEFINE_JIT_SIZEOF(clazz, name, what)                                   \
+  word clazz::name() {                                                         \
+    if (FLAG_precompiled_mode) {                                               \
+      FATAL1("Use of JIT-only sizeof %s in precompiled mode",                  \
+             #clazz "::" #name);                                               \
+    }                                                                          \
+    return clazz##_##name;                                                     \
+  }
+
+#define DEFINE_JIT_RANGE(Class, Getter, Type, First, Last, Filter)             \
+  word Class::Getter(Type index) {                                             \
+    if (FLAG_precompiled_mode) {                                               \
+      FATAL1("Use of JIT-only range %s in precompiled mode",                   \
+             #Class "::" #Getter);                                             \
+    }                                                                          \
+    return Class##_##Getter[static_cast<intptr_t>(index) -                     \
+                            static_cast<intptr_t>(First)];                     \
+  }
+
+JIT_OFFSETS_LIST(DEFINE_JIT_FIELD,
+                 DEFINE_JIT_ARRAY,
+                 DEFINE_JIT_SIZEOF,
+                 DEFINE_JIT_RANGE,
+                 DEFINE_CONSTANT)
+
+#undef DEFINE_JIT_FIELD
+#undef DEFINE_JIT_ARRAY
+#undef DEFINE_JIT_SIZEOF
+#undef DEFINE_JIT_RANGE
+
+#define DEFINE_FIELD(clazz, name)                                              \
+  word clazz::name() {                                                         \
+    return FLAG_precompiled_mode ? AOT_##clazz##_##name : clazz##_##name;      \
+  }
+
+#define DEFINE_ARRAY(clazz, name)                                              \
+  word clazz::name(intptr_t index) {                                           \
+    if (FLAG_precompiled_mode) {                                               \
+      return AOT_##clazz##_elements_start_offset +                             \
+             index * AOT_##clazz##_element_size;                               \
+    } else {                                                                   \
+      return clazz##_elements_start_offset + index * clazz##_element_size;     \
+    }                                                                          \
+  }
+
+#define DEFINE_SIZEOF(clazz, name, what)                                       \
+  word clazz::name() {                                                         \
+    return FLAG_precompiled_mode ? AOT_##clazz##_##name : clazz##_##name;      \
+  }
+
+#define DEFINE_RANGE(Class, Getter, Type, First, Last, Filter)                 \
+  word Class::Getter(Type index) {                                             \
+    if (FLAG_precompiled_mode) {                                               \
+      return AOT_##Class##_##Getter[static_cast<intptr_t>(index) -             \
+                                    static_cast<intptr_t>(First)];             \
+    } else {                                                                   \
+      return Class##_##Getter[static_cast<intptr_t>(index) -                   \
+                              static_cast<intptr_t>(First)];                   \
+    }                                                                          \
+  }
+
+COMMON_OFFSETS_LIST(DEFINE_FIELD,
+                    DEFINE_ARRAY,
+                    DEFINE_SIZEOF,
+                    DEFINE_RANGE,
+                    DEFINE_CONSTANT)
+
+#endif
 
 #undef DEFINE_FIELD
 #undef DEFINE_ARRAY
-#undef DEFINE_ARRAY_STRUCTFIELD
 #undef DEFINE_SIZEOF
 #undef DEFINE_RANGE
 #undef DEFINE_CONSTANT
-#undef PRECOMP_NO_CHECK
 
 const word StoreBufferBlock::kSize = dart::StoreBufferBlock::kSize;
 
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 0f16b0f..d222e0f 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -18,6 +18,10 @@
 #if !defined(PRODUCT)
 
 #if defined(TARGET_ARCH_ARM)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    76;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -118,8 +122,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 44;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     4;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -137,8 +139,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 20;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 36;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 40;
@@ -510,6 +510,10 @@
 #endif  // defined(TARGET_ARCH_ARM)
 
 #if defined(TARGET_ARCH_X64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    132;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 32;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -612,8 +616,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 88;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    132;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     8;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -631,8 +633,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 40;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 80;
@@ -1010,6 +1010,10 @@
 #endif  // defined(TARGET_ARCH_X64)
 
 #if defined(TARGET_ARCH_IA32)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    76;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -1110,8 +1114,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 44;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     4;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -1129,8 +1131,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 20;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 36;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 40;
@@ -1499,6 +1499,10 @@
 #endif  // defined(TARGET_ARCH_IA32)
 
 #if defined(TARGET_ARCH_ARM64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    132;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 32;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -1601,8 +1605,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 88;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    132;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     8;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -1620,8 +1622,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 40;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 80;
@@ -2002,6 +2002,10 @@
 #else  // !defined(PRODUCT)
 
 #if defined(TARGET_ARCH_ARM)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    76;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -2100,8 +2104,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 44;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     4;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -2119,8 +2121,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 20;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 36;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 40;
@@ -2488,6 +2488,10 @@
 #endif  // defined(TARGET_ARCH_ARM)
 
 #if defined(TARGET_ARCH_X64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    132;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 32;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -2588,8 +2592,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 88;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    132;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     8;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -2607,8 +2609,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 40;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 80;
@@ -2982,6 +2982,10 @@
 #endif  // defined(TARGET_ARCH_X64)
 
 #if defined(TARGET_ARCH_IA32)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    76;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -3080,8 +3084,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 44;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     4;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -3099,8 +3101,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 20;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 36;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 40;
@@ -3465,6 +3465,10 @@
 #endif  // defined(TARGET_ARCH_IA32)
 
 #if defined(TARGET_ARCH_ARM64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+    132;
+static constexpr dart::compiler::target::word
+    ICData_receivers_static_type_offset = 32;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -3565,8 +3569,6 @@
 static constexpr dart::compiler::target::word Function_code_offset = 88;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    132;
 static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
     8;
 static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -3584,8 +3586,6 @@
 static constexpr dart::compiler::target::word ICData_owner_offset = 40;
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
 static constexpr dart::compiler::target::word
-    ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
     Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
     Isolate_cached_class_table_table_offset = 80;
@@ -4059,6 +4059,13 @@
     AOT_Field_initializer_function_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_Field_host_offset_or_field_id_offset = 20;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_in_object_offset_offset = 44;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_offset = 24;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
@@ -4077,6 +4084,8 @@
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
 static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 12;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 16;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_Isolate_shared_class_table_offset = 36;
 static constexpr dart::compiler::target::word
@@ -4596,6 +4605,13 @@
     AOT_Field_initializer_function_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
@@ -4614,6 +4630,8 @@
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
 static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
@@ -5139,6 +5157,13 @@
     AOT_Field_initializer_function_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
@@ -5157,6 +5182,8 @@
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
 static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
@@ -5679,6 +5706,13 @@
     AOT_Field_initializer_function_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_Field_host_offset_or_field_id_offset = 20;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_in_object_offset_offset = 44;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_offset = 24;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
@@ -5697,6 +5731,8 @@
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
 static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 12;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 16;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_Isolate_shared_class_table_offset = 36;
 static constexpr dart::compiler::target::word
@@ -6209,6 +6245,13 @@
     AOT_Field_initializer_function_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
@@ -6227,6 +6270,8 @@
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
 static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
@@ -6745,6 +6790,13 @@
     AOT_Field_initializer_function_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+    AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
@@ -6763,6 +6815,8 @@
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
 static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
 static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Isolate_shared_class_table_offset = 72;
 static constexpr dart::compiler::target::word
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index d241c74..67b3283 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -21,16 +21,17 @@
 // FIELD(Class, Name) Offset of a field within a class.
 // ARRAY(Class, Name) Offset of the first element and the size of the elements
 //     in an array of this class.
-// ARRAY_STRUCTFIELD(Class, Name, Element, Field) Offset of a field within a
-//     struct in an array of that struct, relative to the start of the array.
 // SIZEOF(Class, Name, What) Size of an object.
 // RANGE(Class, Name, Type, First, Last, Filter) An array of offsets generated
 //     by passing a value of the given Type in the range from First to Last to
 //     Class::Name() if Filter returns true for that value.
 // CONSTANT(Class, Name) Miscellaneous constant.
-// PRECOMP_NO_CHECK(Code) Don't check this offset in the precompiled runtime.
-#define OFFSETS_LIST(FIELD, ARRAY, ARRAY_STRUCTFIELD, SIZEOF, RANGE, CONSTANT, \
-                     PRECOMP_NO_CHECK)                                         \
+//
+// COMMON_OFFSETS_LIST is for declarations that are valid in all contexts.
+// JIT_OFFSETS_LIST is for declarations that are only valid in JIT mode.
+// A declaration that is not valid in product mode can be wrapped with
+// NOT_IN_PRODUCT().
+#define COMMON_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, RANGE, CONSTANT)             \
   ARRAY(ObjectPool, element_offset)                                            \
   CONSTANT(Array, kMaxElements)                                                \
   CONSTANT(Array, kMaxNewSpaceElements)                                        \
@@ -85,15 +86,14 @@
   FIELD(Float64x2, value_offset)                                               \
   FIELD(Field, initializer_function_offset)                                    \
   FIELD(Field, host_offset_or_field_id_offset)                                 \
-  PRECOMP_NO_CHECK(FIELD(Field, guarded_cid_offset))                           \
-  PRECOMP_NO_CHECK(FIELD(Field, guarded_list_length_in_object_offset_offset))  \
-  PRECOMP_NO_CHECK(FIELD(Field, guarded_list_length_offset))                   \
-  PRECOMP_NO_CHECK(FIELD(Field, is_nullable_offset))                           \
-  PRECOMP_NO_CHECK(FIELD(Field, kind_bits_offset))                             \
+  FIELD(Field, guarded_cid_offset)                                             \
+  FIELD(Field, guarded_list_length_in_object_offset_offset)                    \
+  FIELD(Field, guarded_list_length_offset)                                     \
+  FIELD(Field, is_nullable_offset)                                             \
+  FIELD(Field, kind_bits_offset)                                               \
   FIELD(Function, code_offset)                                                 \
   RANGE(Function, entry_point_offset, CodeEntryKind, CodeEntryKind::kNormal,   \
         CodeEntryKind::kUnchecked, [](CodeEntryKind value) { return true; })   \
-  PRECOMP_NO_CHECK(FIELD(Function, usage_counter_offset))                      \
   FIELD(FutureOr, type_arguments_offset)                                       \
   FIELD(GrowableObjectArray, data_offset)                                      \
   FIELD(GrowableObjectArray, length_offset)                                    \
@@ -103,9 +103,8 @@
   FIELD(ICData, NumArgsTestedMask)                                             \
   FIELD(ICData, NumArgsTestedShift)                                            \
   FIELD(ICData, entries_offset)                                                \
-  PRECOMP_NO_CHECK(FIELD(ICData, owner_offset))                                \
-  PRECOMP_NO_CHECK(FIELD(ICData, state_bits_offset))                           \
-  NOT_IN_PRECOMPILED_RUNTIME(FIELD(ICData, receivers_static_type_offset))      \
+  FIELD(ICData, owner_offset)                                                  \
+  FIELD(ICData, state_bits_offset)                                             \
   FIELD(Isolate, shared_class_table_offset)                                    \
   FIELD(Isolate, cached_class_table_table_offset)                              \
   FIELD(Isolate, current_tag_offset)                                           \
@@ -355,4 +354,8 @@
   SIZEOF(WeakSerializationReference, InstanceSize,                             \
          WeakSerializationReferenceLayout)
 
+#define JIT_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, RANGE, CONSTANT)                \
+  FIELD(Function, usage_counter_offset)                                        \
+  FIELD(ICData, receivers_static_type_offset)
+
 #endif  // RUNTIME_VM_COMPILER_RUNTIME_OFFSETS_LIST_H_
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 2ef0df4..deb8784 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -195,7 +195,7 @@
   }
   __ LeaveStubFrame();
   __ PopRegisters(all_registers);
-  __ Pop(LR);
+  __ Drop(1);  // We use the LR restored via LeaveStubFrame.
   __ bx(LR);
 }
 
@@ -208,7 +208,7 @@
   ASSERT(!store_runtime_result_in_r0 || allow_return);
   auto perform_runtime_call = [&]() {
     if (store_runtime_result_in_r0) {
-      __ PushRegister(LR);  // Push an even register.
+      __ PushRegister(LR);
     }
     __ CallRuntime(*target, /*argument_count=*/0);
     if (store_runtime_result_in_r0) {
@@ -1205,12 +1205,13 @@
   // For test purpose call allocation stub without inline allocation attempt.
   if (!FLAG_use_slow_path) {
     Label slow_case;
-    __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
-                   /*temp_reg=*/R1);
+    __ TryAllocate(compiler::MintClass(), &slow_case,
+                   AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
     __ Ret();
 
     __ Bind(&slow_case);
   }
+  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
@@ -1224,12 +1225,13 @@
   // For test purpose call allocation stub without inline allocation attempt.
   if (!FLAG_use_slow_path) {
     Label slow_case;
-    __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
-                   /*temp_reg=*/R1);
+    __ TryAllocate(compiler::MintClass(), &slow_case,
+                   AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
     __ Ret();
 
     __ Bind(&slow_case);
   }
+  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
@@ -2201,6 +2203,10 @@
     Assembler* assembler) {
   Register ic_reg = R9;
   Register func_reg = R8;
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
   if (FLAG_trace_optimized_ic_calls) {
     __ EnterStubFrame();
     __ PushList((1 << R9) | (1 << R8));  // Preserve.
@@ -2219,6 +2225,10 @@
 // Loads function into 'temp_reg'.
 void StubCodeCompiler::GenerateUsageCounterIncrement(Assembler* assembler,
                                                      Register temp_reg) {
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
   if (FLAG_optimization_counter_threshold >= 0) {
     Register ic_reg = R9;
     Register func_reg = temp_reg;
@@ -2333,6 +2343,11 @@
     Optimized optimized,
     CallType type,
     Exactness exactness) {
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
+
   const bool save_entry_point = kind == Token::kILLEGAL;
   if (save_entry_point) {
     GenerateRecordEntryPoint(assembler);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 8050974..db103f75 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -209,7 +209,7 @@
   }
   __ LeaveStubFrame();
   __ PopRegisters(all_registers);
-  __ Pop(LR);
+  __ Drop(1);  // We use the LR restored via LeaveStubFrame.
   __ ret(LR);
 }
 
@@ -1331,12 +1331,13 @@
   // For test purpose call allocation stub without inline allocation attempt.
   if (!FLAG_use_slow_path) {
     Label slow_case;
-    __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
-                   /*temp_reg=*/R1);
+    __ TryAllocate(compiler::MintClass(), &slow_case,
+                   AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
     __ Ret();
 
     __ Bind(&slow_case);
   }
+  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
@@ -1349,12 +1350,13 @@
   // For test purpose call allocation stub without inline allocation attempt.
   if (!FLAG_use_slow_path) {
     Label slow_case;
-    __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
-                   /*temp_reg=*/R1);
+    __ TryAllocate(compiler::MintClass(), &slow_case,
+                   AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
     __ Ret();
 
     __ Bind(&slow_case);
   }
+  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
@@ -2348,6 +2350,10 @@
     Assembler* assembler) {
   Register ic_reg = R5;
   Register func_reg = R6;
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
   if (FLAG_trace_optimized_ic_calls) {
     __ EnterStubFrame();
     __ Push(R6);        // Preserve.
@@ -2370,6 +2376,10 @@
 // Loads function into 'temp_reg'.
 void StubCodeCompiler::GenerateUsageCounterIncrement(Assembler* assembler,
                                                      Register temp_reg) {
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
   if (FLAG_optimization_counter_threshold >= 0) {
     Register ic_reg = R5;
     Register func_reg = temp_reg;
@@ -2487,6 +2497,11 @@
     CallType type,
     Exactness exactness) {
   const bool save_entry_point = kind == Token::kILLEGAL;
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
+
   if (save_entry_point) {
     GenerateRecordEntryPoint(assembler);
   }
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 7096c77..a4a6045 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -194,14 +194,11 @@
     return;
   }
   __ LeaveStubFrame();
-
-  // Drop "official" return address -- we can just use the one stored above the
-  // saved registers.
-  __ Drop(1);
-
+  // Copy up the return address (in case it was changed).
+  __ popq(TMP);
+  __ movq(Address(RSP, kAllSavedRegistersSlots * target::kWordSize), TMP);
   __ PopRegisters(kDartAvailableCpuRegs,
                   save_fpu_registers ? kAllFpuRegistersList : 0);
-
   __ ret();
 }
 
@@ -209,9 +206,20 @@
                                bool save_fpu_registers,
                                const RuntimeEntry* target,
                                intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return) {
+                               bool allow_return,
+                               bool store_runtime_result_in_rax = false) {
   auto perform_runtime_call = [&]() {
+    if (store_runtime_result_in_rax) {
+      __ PushImmediate(Immediate(0));
+    }
     __ CallRuntime(*target, /*argument_count=*/0);
+    if (store_runtime_result_in_rax) {
+      __ PopRegister(RAX);
+      __ movq(Address(RBP,
+                      target::kWordSize *
+                          StubCodeCompiler::WordOffsetFromFpToCpuRegister(RAX)),
+              RAX);
+    }
   };
   GenerateSharedStubGeneric(assembler, save_fpu_registers,
                             self_code_stub_offset_from_thread, allow_return,
@@ -1241,12 +1249,40 @@
 
 void StubCodeCompiler::GenerateAllocateMintSharedWithFPURegsStub(
     Assembler* assembler) {
-  __ Stop("Unimplemented");
+  // For test purpose call allocation stub without inline allocation attempt.
+  if (!FLAG_use_slow_path) {
+    Label slow_case;
+    __ TryAllocate(compiler::MintClass(), &slow_case, /*near_jump=*/true,
+                   AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
+    __ Ret();
+
+    __ Bind(&slow_case);
+  }
+  COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+  GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
+                     &kAllocateMintRuntimeEntry,
+                     target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
+                     /*allow_return=*/true,
+                     /*store_runtime_result_in_rax=*/true);
 }
 
 void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
     Assembler* assembler) {
-  __ Stop("Unimplemented");
+  // For test purpose call allocation stub without inline allocation attempt.
+  if (!FLAG_use_slow_path) {
+    Label slow_case;
+    __ TryAllocate(compiler::MintClass(), &slow_case, /*near_jump=*/true,
+                   AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
+    __ Ret();
+
+    __ Bind(&slow_case);
+  }
+  COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
+      target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
+      /*allow_return=*/true,
+      /*store_runtime_result_in_rax=*/true);
 }
 
 // Called when invoking Dart code from C++ (VM code).
@@ -2240,6 +2276,10 @@
 // function and not the top-scope function.
 void StubCodeCompiler::GenerateOptimizedUsageCounterIncrement(
     Assembler* assembler) {
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
   Register ic_reg = RBX;
   Register func_reg = RDI;
   if (FLAG_trace_optimized_ic_calls) {
@@ -2261,6 +2301,10 @@
 // Loads function into 'temp_reg', preserves 'ic_reg'.
 void StubCodeCompiler::GenerateUsageCounterIncrement(Assembler* assembler,
                                                      Register temp_reg) {
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
   if (FLAG_optimization_counter_threshold >= 0) {
     Register ic_reg = RBX;
     Register func_reg = temp_reg;
@@ -2380,6 +2424,11 @@
     Optimized optimized,
     CallType type,
     Exactness exactness) {
+  if (FLAG_precompiled_mode) {
+    __ Breakpoint();
+    return;
+  }
+
   const bool save_entry_point = kind == Token::kILLEGAL;
   if (save_entry_point) {
     GenerateRecordEntryPoint(assembler);
@@ -2558,8 +2607,8 @@
             FieldAddress(RBX, target::ICData::receivers_static_type_offset()));
     __ movq(RCX, FieldAddress(RCX, target::Type::arguments_offset()));
     // RAX contains an offset to type arguments in words as a smi,
-    // hence TIMES_4. RDX is guaranteed to be non-smi because it is expected to
-    // have type arguments.
+    // hence TIMES_4. RDX is guaranteed to be non-smi because it is expected
+    // to have type arguments.
     __ cmpq(RCX, FieldAddress(RDX, RAX, TIMES_4, 0));
     __ j(EQUAL, &call_target_function_through_unchecked_entry);
 
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 7a34b6e..ea46f78a 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -387,6 +387,12 @@
   static const Register kIndexReg = R1;
 };
 
+// ABI for AllocateMint*Stub.
+struct AllocateMintABI {
+  static const Register kResultReg = R0;
+  static const Register kTempReg = R1;
+};
+
 // TODO(regis): Add ABIs for type testing stubs and is-type test stubs instead
 // of reusing the constants of the instantiation stubs ABI.
 
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 1568201..2ce6ac37 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -219,6 +219,12 @@
   static const Register kIndexReg = R1;
 };
 
+// ABI for AllocateMint*Stub.
+struct AllocateMintABI {
+  static const Register kResultReg = R0;
+  static const Register kTempReg = R1;
+};
+
 // TODO(regis): Add ABIs for type testing stubs and is-type test stubs instead
 // of reusing the constants of the instantiation stubs ABI.
 
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 84d27c1..d696eac 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -200,6 +200,12 @@
   static const Register kIndexReg = RBX;
 };
 
+// ABI for AllocateMint*Stub.
+struct AllocateMintABI {
+  static const Register kResultReg = RAX;
+  static const Register kTempReg = RBX;
+};
+
 // Registers used inside the implementation of type testing stubs.
 struct TTSInternalRegs {
   static const Register kInstanceTypeArgumentsReg = RSI;
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 99aa048..72d86d6 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -106,26 +106,48 @@
     ok = false;                                                                \
   }
 
-#define CHECK_FIELD(Class, Name) CHECK_OFFSET(Class::Name(), Class##_##Name)
+#if defined(DART_PRECOMPILED_RUNTIME)
+#define CHECK_FIELD(Class, Name)                                               \
+  CHECK_OFFSET(Class::Name(), AOT_##Class##_##Name);
 #define CHECK_ARRAY(Class, Name)                                               \
   CHECK_OFFSET(Class::ArrayTraits::elements_start_offset(),                    \
-               Class##_elements_start_offset)                                  \
-  CHECK_OFFSET(Class::ArrayTraits::kElementSize, Class##_element_size)
-#define CHECK_ARRAY_STRUCTFIELD(Class, Name, ElementOffsetName, FieldOffset)
-
-#if defined(DART_PRECOMPILED_RUNTIME)
+               AOT_##Class##_elements_start_offset);                           \
+  CHECK_OFFSET(Class::ArrayTraits::kElementSize, AOT_##Class##_element_size)
 #define CHECK_SIZEOF(Class, Name, What)                                        \
-  CHECK_OFFSET(sizeof(What), AOT_##Class##_##Name)
+  CHECK_OFFSET(sizeof(What), AOT_##Class##_##Name);
+#define CHECK_RANGE(Class, Getter, Type, First, Last, Filter)                  \
+  for (intptr_t i = static_cast<intptr_t>(First);                              \
+       i <= static_cast<intptr_t>(Last); i++) {                                \
+    if (Filter(static_cast<Type>(i))) {                                        \
+      CHECK_OFFSET(Class::Getter(static_cast<Type>(i)),                        \
+                   AOT_##Class##_##Getter[i]);                                 \
+    }                                                                          \
+  }
+#define CHECK_CONSTANT(Class, Name)                                            \
+  CHECK_OFFSET(Class::Name, AOT_##Class##_##Name);
 #else
+#define CHECK_FIELD(Class, Name) CHECK_OFFSET(Class::Name(), Class##_##Name);
+#define CHECK_ARRAY(Class, Name)                                               \
+  CHECK_OFFSET(Class::ArrayTraits::elements_start_offset(),                    \
+               Class##_elements_start_offset);                                 \
+  CHECK_OFFSET(Class::ArrayTraits::kElementSize, Class##_element_size);
 #define CHECK_SIZEOF(Class, Name, What)                                        \
-  CHECK_OFFSET(sizeof(What), Class##_##Name)
-#endif
+  CHECK_OFFSET(sizeof(What), Class##_##Name);
+#define CHECK_RANGE(Class, Getter, Type, First, Last, Filter)                  \
+  for (intptr_t i = static_cast<intptr_t>(First);                              \
+       i <= static_cast<intptr_t>(Last); i++) {                                \
+    if (Filter(static_cast<Type>(i))) {                                        \
+      CHECK_OFFSET(Class::Getter(static_cast<Type>(i)), Class##_##Getter[i]);  \
+    }                                                                          \
+  }
+#define CHECK_CONSTANT(Class, Name) CHECK_OFFSET(Class::Name, Class##_##Name);
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-#define CHECK_RANGE(Class, Name, Type, First, Last, Filter)
-#define CHECK_CONSTANT(Class, Name) CHECK_OFFSET(Class::Name, Class##_##Name)
+  COMMON_OFFSETS_LIST(CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF, CHECK_RANGE,
+                      CHECK_CONSTANT)
 
-  OFFSETS_LIST(CHECK_FIELD, CHECK_ARRAY, CHECK_ARRAY_STRUCTFIELD, CHECK_SIZEOF,
-               CHECK_RANGE, CHECK_CONSTANT, NOT_IN_PRECOMPILED_RUNTIME)
+  NOT_IN_PRECOMPILED_RUNTIME(JIT_OFFSETS_LIST(
+      CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF, CHECK_RANGE, CHECK_CONSTANT))
 
   if (!ok) {
     FATAL(
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index d77f84c..1b04132 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -3820,11 +3820,21 @@
     case kExternalTypedDataFloat64ArrayCid:
       type = Dart_TypedData_kFloat64;
       break;
+    case kTypedDataInt32x4ArrayCid:
+    case kTypedDataInt32x4ArrayViewCid:
+    case kExternalTypedDataInt32x4ArrayCid:
+      type = Dart_TypedData_kInt32x4;
+      break;
     case kTypedDataFloat32x4ArrayCid:
     case kTypedDataFloat32x4ArrayViewCid:
     case kExternalTypedDataFloat32x4ArrayCid:
       type = Dart_TypedData_kFloat32x4;
       break;
+    case kTypedDataFloat64x2ArrayCid:
+    case kTypedDataFloat64x2ArrayViewCid:
+    case kExternalTypedDataFloat64x2ArrayCid:
+      type = Dart_TypedData_kFloat64x2;
+      break;
     default:
       type = Dart_TypedData_kInvalid;
       break;
@@ -4000,8 +4010,12 @@
       return NewTypedData(T, kTypedDataFloat32ArrayCid, length);
     case Dart_TypedData_kFloat64:
       return NewTypedData(T, kTypedDataFloat64ArrayCid, length);
+    case Dart_TypedData_kInt32x4:
+      return NewTypedData(T, kTypedDataInt32x4ArrayCid, length);
     case Dart_TypedData_kFloat32x4:
       return NewTypedData(T, kTypedDataFloat32x4ArrayCid, length);
+    case Dart_TypedData_kFloat64x2:
+      return NewTypedData(T, kTypedDataFloat64x2ArrayCid, length);
     default:
       return Api::NewError("%s expects argument 'type' to be of 'TypedData'",
                            CURRENT_FUNC);
@@ -4077,10 +4091,18 @@
       return NewExternalTypedData(T, kExternalTypedDataFloat64ArrayCid, data,
                                   length, peer, external_allocation_size,
                                   callback);
+    case Dart_TypedData_kInt32x4:
+      return NewExternalTypedData(T, kExternalTypedDataInt32x4ArrayCid, data,
+                                  length, peer, external_allocation_size,
+                                  callback);
     case Dart_TypedData_kFloat32x4:
       return NewExternalTypedData(T, kExternalTypedDataFloat32x4ArrayCid, data,
                                   length, peer, external_allocation_size,
                                   callback);
+    case Dart_TypedData_kFloat64x2:
+      return NewExternalTypedData(T, kExternalTypedDataFloat64x2ArrayCid, data,
+                                  length, peer, external_allocation_size,
+                                  callback);
     default:
       return Api::NewError(
           "%s expects argument 'type' to be of"
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index f5814c4..613614e 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -139,6 +139,10 @@
     case Dart_TypedData_kUint64:
     case Dart_TypedData_kFloat64:
       return 8;
+    case Dart_TypedData_kInt32x4:
+    case Dart_TypedData_kFloat32x4:
+    case Dart_TypedData_kFloat64x2:
+      return 16;
     default:
       break;
   }
@@ -636,7 +640,10 @@
   V(Int64, int64_t)                                                            \
   V(Uint64, uint64_t)                                                          \
   V(Float32, float)                                                            \
-  V(Float64, double)
+  V(Float64, double)                                                           \
+  V(Int32x4, simd128_value_t)                                                  \
+  V(Float32x4, simd128_value_t)                                                \
+  V(Float64x2, simd128_value_t)
 
 #define EMIT_TYPED_DATA_CASES(type, c_type)                                    \
   case kTypedData##type##ArrayCid:                                             \
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index aa310f9..f60c17b 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -245,38 +245,31 @@
       break;
     }
 
+    cls = instance.clazz();
     // Find a call getter, if any, in the class hierarchy.
-    for (cls = instance.clazz(); !cls.IsNull(); cls = cls.SuperClass()) {
-      function = cls.LookupDynamicFunction(getter_name);
-      if (function.IsNull()) {
-        continue;
-      }
-
-      if (!OSThread::Current()->HasStackHeadroom()) {
-        const Instance& exception =
-            Instance::Handle(zone, isolate->object_store()->stack_overflow());
-        return UnhandledException::New(exception, StackTrace::Handle(zone));
-      }
-
-      const Array& getter_arguments = Array::Handle(zone, Array::New(1));
-      getter_arguments.SetAt(0, instance);
-      const Object& getter_result = Object::Handle(
-          zone, DartEntry::InvokeFunction(function, getter_arguments));
-      if (getter_result.IsError()) {
-        return getter_result.raw();
-      }
-      ASSERT(getter_result.IsNull() || getter_result.IsInstance());
-
-      // We have a new possibly compatible callable, so set the first argument
-      // accordingly so it gets picked up in the main loop.
-      arguments.SetAt(receiver_index, getter_result);
+    function = Resolver::ResolveDynamicAnyArgs(zone, cls, getter_name,
+                                               /*allow_add=*/false);
+    if (function.IsNull()) {
       break;
     }
-
-    // No call getter was found in the hierarchy, so stop the search.
-    if (cls.IsNull()) {
-      break;
+    if (!OSThread::Current()->HasStackHeadroom()) {
+      const Instance& exception =
+          Instance::Handle(zone, isolate->object_store()->stack_overflow());
+      return UnhandledException::New(exception, StackTrace::Handle(zone));
     }
+
+    const Array& getter_arguments = Array::Handle(zone, Array::New(1));
+    getter_arguments.SetAt(0, instance);
+    const Object& getter_result = Object::Handle(
+        zone, DartEntry::InvokeFunction(function, getter_arguments));
+    if (getter_result.IsError()) {
+      return getter_result.raw();
+    }
+    ASSERT(getter_result.IsNull() || getter_result.IsInstance());
+
+    // We have a new possibly compatible callable, so set the first argument
+    // accordingly so it gets picked up in the main loop.
+    arguments.SetAt(receiver_index, getter_result);
   }
 
   // No compatible callable was found.
diff --git a/runtime/vm/heap/become.h b/runtime/vm/heap/become.h
index ef76a45..3958c8d 100644
--- a/runtime/vm/heap/become.h
+++ b/runtime/vm/heap/become.h
@@ -86,11 +86,11 @@
   // (used for morphic instances during reload).
   static void MakeDummyObject(const Instance& instance);
 
- private:
   // Update any references pointing to forwarding objects to point the
   // forwarding objects' targets.
   static void FollowForwardingPointers(Thread* thread);
 
+ private:
   static void CrashDump(ObjectPtr before_obj, ObjectPtr after_obj);
 };
 
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 83ff8a8..8c89691 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -68,6 +68,7 @@
       gc_new_space_in_progress_(false),
       gc_old_space_in_progress_(false),
       last_gc_was_old_space_(false),
+      assume_scavenge_will_fail_(false),
       gc_on_nth_allocation_(kNoForcedGarbageCollection) {
   UpdateGlobalMaxUsed();
   for (int sel = 0; sel < kNumWeakSelectors; sel++) {
@@ -92,7 +93,7 @@
   if (LIKELY(addr != 0)) {
     return addr;
   }
-  if (new_space_.GrowthControlState()) {
+  if (!assume_scavenge_will_fail_ && new_space_.GrowthControlState()) {
     // This call to CollectGarbage might end up "reusing" a collection spawned
     // from a different thread and will be racing to allocate the requested
     // memory with other threads being released after the collection.
@@ -400,6 +401,7 @@
   ASSERT(gc_old_space_in_progress_);
   gc_old_space_in_progress_ = false;
   last_gc_was_old_space_ = true;
+  assume_scavenge_will_fail_ = false;
   ml.NotifyAll();
 }
 
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index f780ea1..bb6652e 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -416,6 +416,7 @@
   bool gc_new_space_in_progress_;
   bool gc_old_space_in_progress_;
   bool last_gc_was_old_space_;
+  bool assume_scavenge_will_fail_;
 
   static const intptr_t kNoForcedGarbageCollection = -1;
 
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 0fb6cb9..cfed7d7 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -15,6 +15,7 @@
 #include "vm/heap/weak_table.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
+#include "vm/longjump.h"
 #include "vm/object.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_set.h"
@@ -178,43 +179,69 @@
   void ProcessRoots() {
     thread_ = Thread::Current();
     page_space_->AcquireLock(freelist_);
-    scavenger_->IterateRoots(this);
+
+    LongJumpScope jump;
+    if (setjmp(*jump.Set()) == 0) {
+      scavenger_->IterateRoots(this);
+    } else {
+      ASSERT(scavenger_->abort_);
+      thread_->ClearStickyError();
+    }
   }
 
   void ProcessSurvivors() {
-    // Iterate until all work has been drained.
-    do {
-      ProcessToSpace();
-      ProcessPromotedList();
-    } while (HasWork());
+    LongJumpScope jump;
+    if (setjmp(*jump.Set()) == 0) {
+      // Iterate until all work has been drained.
+      do {
+        ProcessToSpace();
+        ProcessPromotedList();
+      } while (HasWork());
+    } else {
+      ASSERT(scavenger_->abort_);
+      thread_->ClearStickyError();
+    }
   }
 
   void ProcessAll() {
-    do {
-      ProcessSurvivors();
-      ProcessWeakProperties();
-    } while (HasWork());
+    LongJumpScope jump;
+    if (setjmp(*jump.Set()) == 0) {
+      do {
+        do {
+          ProcessToSpace();
+          ProcessPromotedList();
+        } while (HasWork());
+        ProcessWeakProperties();
+      } while (HasWork());
+    } else {
+      ASSERT(scavenger_->abort_);
+      thread_->ClearStickyError();
+    }
   }
 
   inline void ProcessWeakProperties();
 
   bool HasWork() {
+    if (scavenger_->abort_) return false;
     return (scan_ != tail_) || (scan_ != nullptr && !scan_->IsResolved()) ||
            !promoted_list_.IsEmpty();
   }
 
   void Finalize() {
-    ASSERT(!HasWork());
+    if (scavenger_->abort_) {
+      promoted_list_.AbandonWork();
+    } else {
+      ASSERT(!HasWork());
 
-    for (NewPage* page = head_; page != nullptr; page = page->next()) {
-      ASSERT(page->IsResolved());
-      page->RecordSurvivors();
+      for (NewPage* page = head_; page != nullptr; page = page->next()) {
+        ASSERT(page->IsResolved());
+        page->RecordSurvivors();
+      }
+
+      promoted_list_.Finalize();
+
+      MournWeakProperties();
     }
-
-    promoted_list_.Finalize();
-
-    MournWeakProperties();
-
     page_space_->ReleaseLock(freelist_);
     thread_ = nullptr;
   }
@@ -278,7 +305,7 @@
           // To-space was exhausted by fragmentation and old-space could not
           // grow.
           if (UNLIKELY(new_addr == 0)) {
-            OUT_OF_MEMORY();
+            AbortScavenge();
           }
         }
       }
@@ -375,6 +402,14 @@
 
   DART_NOINLINE inline uword TryAllocateCopySlow(intptr_t size);
 
+  DART_NOINLINE DART_NORETURN void AbortScavenge() {
+    if (FLAG_verbose_gc) {
+      OS::PrintErr("Aborting scavenge\n");
+    }
+    scavenger_->abort_ = true;
+    thread_->long_jump_base()->Jump(1, Object::out_of_memory_error());
+  }
+
   inline void ProcessToSpace();
   DART_FORCE_INLINE intptr_t ProcessCopied(ObjectPtr raw_obj);
   inline void ProcessPromotedList();
@@ -587,9 +622,7 @@
         VirtualMemory::AllocateAligned(size, alignment, is_executable, name);
   }
   if (memory == nullptr) {
-    // TODO(koda): We could try to recover (collect old space, wait for another
-    // isolate to finish scavenge, etc.).
-    OUT_OF_MEMORY();
+    return nullptr;  // Out of memory.
   }
 
 #if defined(DEBUG)
@@ -639,6 +672,9 @@
     return nullptr;  // Full.
   }
   NewPage* page = NewPage::Allocate();
+  if (page == nullptr) {
+    return nullptr;  // Out of memory;
+  }
   capacity_in_words_ += kNewPageSizeInWords;
   if (link) {
     if (head_ == nullptr) {
@@ -705,7 +741,8 @@
       scavenge_words_per_micro_(kConservativeInitialScavengeSpeed),
       idle_scavenge_threshold_in_words_(0),
       external_size_(0),
-      failed_to_promote_(false) {
+      failed_to_promote_(false),
+      abort_(false) {
   // Verify assumptions about the first word in objects which the scavenger is
   // going to use for forwarding pointers.
   ASSERT(Object::tags_offset() == 0);
@@ -1137,6 +1174,8 @@
 
 template <bool parallel>
 void ScavengerVisitorBase<parallel>::ProcessWeakProperties() {
+  if (scavenger_->abort_) return;
+
   // Finished this round of scavenging. Process the pending weak properties
   // for which the keys have become reachable. Potentially this adds more
   // objects to the to space.
@@ -1285,6 +1324,8 @@
 
 template <bool parallel>
 void ScavengerVisitorBase<parallel>::MournWeakProperties() {
+  ASSERT(!scavenger_->abort_);
+
   // The queued weak properties at this point do not refer to reachable keys,
   // so we clear their key and value fields.
   WeakPropertyPtr cur_weak = delayed_weak_properties_;
@@ -1447,6 +1488,7 @@
 
   // Prepare for a scavenge.
   failed_to_promote_ = false;
+  abort_ = false;
   root_slices_started_ = 0;
   intptr_t abandoned_bytes = 0;  // TODO(rmacnak): Count fragmentation?
   SpaceUsage usage_before = GetCurrentUsage();
@@ -1466,6 +1508,11 @@
   } else {
     bytes_promoted = ParallelScavenge(from);
   }
+  if (abort_) {
+    ReverseScavenge(&from);
+    bytes_promoted = 0;
+  }
+  ASSERT(promotion_stack_.IsEmpty());
   MournWeakHandles();
   MournWeakTables();
 
@@ -1544,6 +1591,65 @@
   return bytes_promoted;
 }
 
+void Scavenger::ReverseScavenge(SemiSpace** from) {
+  Thread* thread = Thread::Current();
+  TIMELINE_FUNCTION_GC_DURATION(thread, "ReverseScavenge");
+
+  class ReverseFromForwardingVisitor : public ObjectVisitor {
+    uword ReadHeader(ObjectPtr raw_obj) {
+      return reinterpret_cast<std::atomic<uword>*>(
+                 ObjectLayout::ToAddr(raw_obj))
+          ->load(std::memory_order_relaxed);
+    }
+    void WriteHeader(ObjectPtr raw_obj, uword header) {
+      reinterpret_cast<std::atomic<uword>*>(ObjectLayout::ToAddr(raw_obj))
+          ->store(header, std::memory_order_relaxed);
+    }
+    void VisitObject(ObjectPtr from_obj) {
+      uword from_header = ReadHeader(from_obj);
+      if (IsForwarding(from_header)) {
+        ObjectPtr to_obj = ForwardedObj(from_header);
+        uword to_header = ReadHeader(to_obj);
+        intptr_t size = to_obj->ptr()->HeapSize();
+
+        // Reset the ages bits in case this was a promotion.
+        uint32_t tags = static_cast<uint32_t>(to_header);
+        tags = ObjectLayout::OldBit::update(false, tags);
+        tags = ObjectLayout::OldAndNotRememberedBit::update(false, tags);
+        tags = ObjectLayout::NewBit::update(true, tags);
+        tags = ObjectLayout::OldAndNotMarkedBit::update(false, tags);
+        uword original_header =
+            (to_header & ~static_cast<uword>(0xFFFFFFFF)) | tags;
+
+        WriteHeader(from_obj, original_header);
+
+        ForwardingCorpse::AsForwarder(ObjectLayout::ToAddr(to_obj), size)
+            ->set_target(from_obj);
+      }
+    }
+  };
+
+  ReverseFromForwardingVisitor visitor;
+  for (NewPage* page = (*from)->head(); page != nullptr; page = page->next()) {
+    page->VisitObjects(&visitor);
+  }
+
+  // Swap from-space and to-space. The abandoned to-space will be deleted in
+  // the epilogue.
+  SemiSpace* temp = to_;
+  to_ = *from;
+  *from = temp;
+
+  promotion_stack_.Reset();
+
+  // This also rebuilds the remembered set.
+  Become::FollowForwardingPointers(thread);
+
+  // Don't scavenge again until the next old-space GC has occurred. Prevents
+  // performing one scavenge per allocation as the heap limit is approached.
+  heap_->assume_scavenge_will_fail_ = true;
+}
+
 void Scavenger::WriteProtect(bool read_only) {
   ASSERT(!scavenging_);
   to_->WriteProtect(read_only);
diff --git a/runtime/vm/heap/scavenger.h b/runtime/vm/heap/scavenger.h
index f7874e9..9f84dcd 100644
--- a/runtime/vm/heap/scavenger.h
+++ b/runtime/vm/heap/scavenger.h
@@ -394,6 +394,7 @@
   SemiSpace* Prologue();
   intptr_t ParallelScavenge(SemiSpace* from);
   intptr_t SerialScavenge(SemiSpace* from);
+  void ReverseScavenge(SemiSpace** from);
   void IterateIsolateRoots(ObjectPointerVisitor* visitor);
   template <bool parallel>
   void IterateStoreBuffers(ScavengerVisitorBase<parallel>* visitor);
@@ -441,7 +442,8 @@
   // The total size of external data associated with objects in this scavenger.
   RelaxedAtomic<intptr_t> external_size_;
 
-  bool failed_to_promote_;
+  RelaxedAtomic<bool> failed_to_promote_;
+  RelaxedAtomic<bool> abort_;
 
   bool growth_control_;
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 9616065..e06504c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1125,6 +1125,9 @@
   error_str = String::New("Background Compilation Failed", Heap::kOld);
   *background_compilation_error_ =
       LanguageError::New(error_str, Report::kBailout, Heap::kOld);
+  error_str = String::New("Out of memory", Heap::kOld);
+  *out_of_memory_error_ =
+      LanguageError::New(error_str, Report::kBailout, Heap::kOld);
 
   // Allocate the parameter arrays for method extractor types and names.
   *extractor_parameter_types_ = Array::New(1, Heap::kOld);
@@ -1215,6 +1218,8 @@
   ASSERT(speculative_inlining_error_->IsLanguageError());
   ASSERT(!background_compilation_error_->IsSmi());
   ASSERT(background_compilation_error_->IsLanguageError());
+  ASSERT(!out_of_memory_error_->IsSmi());
+  ASSERT(out_of_memory_error_->IsLanguageError());
   ASSERT(!vm_isolate_snapshot_object_table_->IsSmi());
   ASSERT(vm_isolate_snapshot_object_table_->IsArray());
   ASSERT(!extractor_parameter_types_->IsSmi());
@@ -2645,8 +2650,11 @@
           Instance::Handle(thread->isolate()->object_store()->out_of_memory());
       Exceptions::Throw(thread, exception);
       UNREACHABLE();
+    } else if (thread->long_jump_base() != nullptr) {
+      Report::LongJump(Object::out_of_memory_error());
+      UNREACHABLE();
     } else {
-      // No Dart to propagate an exception to.
+      // Nowhere to propagate an exception to.
       OUT_OF_MEMORY();
     }
   }
@@ -9867,6 +9875,11 @@
       signature_type_name.IsNull() ? "null" : signature_type_name.ToCString());
 }
 
+bool Field::ShouldCloneFields() {
+  return Compiler::IsBackgroundCompilation() ||
+         FLAG_force_clone_compiler_objects;
+}
+
 FieldPtr Field::CloneFromOriginal() const {
   return this->Clone(*this);
 }
@@ -18730,24 +18743,23 @@
 bool Instance::IsCallable(Function* function) const {
   Class& cls = Class::Handle(clazz());
   if (cls.IsClosureClass()) {
-    if (function != NULL) {
+    if (function != nullptr) {
       *function = Closure::Cast(*this).function();
     }
     return true;
   }
   // Try to resolve a "call" method.
-  Function& call_function = Function::Handle();
-  do {
-    call_function = cls.LookupDynamicFunction(Symbols::Call());
-    if (!call_function.IsNull()) {
-      if (function != NULL) {
-        *function = call_function.raw();
-      }
-      return true;
-    }
-    cls = cls.SuperClass();
-  } while (!cls.IsNull());
-  return false;
+  Zone* zone = Thread::Current()->zone();
+  Function& call_function = Function::Handle(
+      zone, Resolver::ResolveDynamicAnyArgs(zone, cls, Symbols::Call(),
+                                            /*allow_add=*/false));
+  if (call_function.IsNull()) {
+    return false;
+  }
+  if (function != nullptr) {
+    *function = call_function.raw();
+  }
+  return true;
 }
 
 InstancePtr Instance::New(const Class& cls, Heap::Space space) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index cd5126d..ed97d50 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -449,6 +449,7 @@
   V(LanguageError, branch_offset_error)                                        \
   V(LanguageError, speculative_inlining_error)                                 \
   V(LanguageError, background_compilation_error)                               \
+  V(LanguageError, out_of_memory_error)                                        \
   V(Array, vm_isolate_snapshot_object_table)                                   \
   V(Type, dynamic_type)                                                        \
   V(Type, void_type)                                                           \
@@ -3956,6 +3957,10 @@
     return !raw_ptr()->owner_->IsField();
   }
 
+  // Returns whether fields must be cloned via [CloneFromOriginal] for the
+  // current compilation thread.
+  static bool ShouldCloneFields();
+
   // Returns a field cloned from 'this'. 'this' is set as the
   // original field of result.
   FieldPtr CloneFromOriginal() const;
@@ -6804,7 +6809,10 @@
   static const intptr_t kAwaitJumpVarIndex = 0;
   static const intptr_t kAsyncCompleterIndex = 1;
   static const intptr_t kControllerIndex = 1;
-  static const intptr_t kChainedFutureIndex = 2;
+  // Expected context index of chained futures in recognized async functions.
+  // These are used to unwind async stacks.
+  static const intptr_t kFutureTimeoutFutureIndex = 2;
+  static const intptr_t kFutureWaitFutureIndex = 2;
 
   static intptr_t variable_offset(intptr_t context_index) {
     return OFFSET_OF_RETURNED_VALUE(ContextLayout, data) +
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 3231fda..319cff6 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -247,16 +247,30 @@
   }
   if (id != -1) {
     ASSERT(selector != NULL);
-    jsobj.AddFixedServiceId("classes/%" Pd "/%s/%" Pd "", cls.id(), selector,
-                            id);
+    if (cls.IsTopLevel()) {
+      const auto& library = Library::Handle(cls.library());
+      const auto& private_key = String::Handle(library.private_key());
+      jsobj.AddFixedServiceId("libraries/%s/%s/%" Pd "",
+                              private_key.ToCString(), selector, id);
+    } else {
+      jsobj.AddFixedServiceId("classes/%" Pd "/%s/%" Pd "", cls.id(), selector,
+                              id);
+    }
     return;
   }
   // Regular functions known to their owner use their name (percent-encoded).
   String& name = String::Handle(f.name());
   if (cls.LookupFunction(name) == f.raw()) {
     const char* encoded_name = String::EncodeIRI(name);
-    jsobj.AddFixedServiceId("classes/%" Pd "/functions/%s", cls.id(),
-                            encoded_name);
+    if (cls.IsTopLevel()) {
+      const auto& library = Library::Handle(cls.library());
+      const auto& private_key = String::Handle(library.private_key());
+      jsobj.AddFixedServiceId("libraries/%s/functions/%s",
+                              private_key.ToCString(), encoded_name);
+    } else {
+      jsobj.AddFixedServiceId("classes/%" Pd "/functions/%s", cls.id(),
+                              encoded_name);
+    }
     return;
   }
   // Oddball functions (not known to their owner) fall back to use the object
@@ -356,8 +370,15 @@
   String& field_name = String::Handle(name());
   const char* encoded_field_name = String::EncodeIRI(field_name);
   AddCommonObjectProperties(&jsobj, "Field", ref);
-  jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s", cls.id(),
-                          encoded_field_name);
+  if (cls.IsTopLevel()) {
+    const auto& library = Library::Handle(cls.library());
+    const auto& private_key = String::Handle(library.private_key());
+    jsobj.AddFixedServiceId("libraries/%s/fields/%s", private_key.ToCString(),
+                            encoded_field_name);
+  } else {
+    jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s", cls.id(),
+                            encoded_field_name);
+  }
 
   const char* user_name = UserVisibleNameCString();
   const String& vm_name = String::Handle(name());
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index c8a92c5..4b7e6ad 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -562,17 +562,10 @@
   ArgumentsDescriptor args_desc(descriptor);
   ASSERT(!receiver.IsClosure());  // Interpreter tests for closure.
   Class& cls = Class::Handle(zone, receiver.clazz());
-  Function& call_function = Function::Handle(zone);
-  do {
-    call_function = cls.LookupDynamicFunction(Symbols::Call());
-    if (!call_function.IsNull()) {
-      if (!call_function.AreValidArguments(args_desc, NULL)) {
-        call_function = Function::null();
-      }
-      break;
-    }
-    cls = cls.SuperClass();
-  } while (!cls.IsNull());
+  Function& call_function = Function::Handle(
+      zone,
+      Resolver::ResolveDynamicForReceiverClass(cls, Symbols::Call(), args_desc,
+                                               /*allow_add=*/false));
   arguments.SetReturn(call_function);
 }
 
@@ -1491,8 +1484,8 @@
     cls = table->At(cid);
     if (cls.is_abstract()) continue;
     if (!cls.is_allocated()) continue;
-    other_target =
-        Resolver::ResolveDynamicAnyArgs(zone, cls, name, false /* allow_add */);
+    other_target = Resolver::ResolveDynamicAnyArgs(zone, cls, name,
+                                                   /*allow_add=*/false);
     if (other_target.raw() != target.raw()) {
       return false;
     }
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index cff9a82..e8e2ba6 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -249,7 +249,8 @@
   if (chained_future != nullptr) {
     AllocateContextVariable(chained_future, &context_owner);
     *found_captured_variables = true;
-    ASSERT(chained_future->index().value() == Context::kChainedFutureIndex);
+    ASSERT(chained_future->index().value() ==
+           chained_future->expected_context_index());
   }
 
   while (pos < num_parameters) {
@@ -279,7 +280,7 @@
     LocalVariable* variable = VariableAt(pos);
     if (variable->owner() == this) {
       if (variable->is_captured()) {
-        // Skip the two variables already pre-allocated above.
+        // Skip the variables already pre-allocated above.
         if (variable != await_jump_var && variable != async_completer &&
             variable != controller && variable != chained_future) {
           AllocateContextVariable(variable, &context_owner);
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index f31a3a0..a9761d7 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -94,6 +94,7 @@
         is_explicit_covariant_parameter_(false),
         is_late_(false),
         is_chained_future_(false),
+        expected_context_index_(-1),
         late_init_offset_(0),
         type_check_mode_(kDoTypeCheck),
         index_() {
@@ -135,6 +136,11 @@
   bool is_chained_future() const { return is_chained_future_; }
   void set_is_chained_future() { is_chained_future_ = true; }
 
+  intptr_t expected_context_index() const { return expected_context_index_; }
+  void set_expected_context_index(int index) {
+    expected_context_index_ = index;
+  }
+
   intptr_t late_init_offset() const { return late_init_offset_; }
   void set_late_init_offset(intptr_t late_init_offset) {
     late_init_offset_ = late_init_offset;
@@ -225,6 +231,7 @@
   bool is_explicit_covariant_parameter_;
   bool is_late_;
   bool is_chained_future_;
+  intptr_t expected_context_index_;
   intptr_t late_init_offset_;
   TypeCheckMode type_check_mode_;
   VariableIndex index_;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 9d6b227..3b7af8f 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -1697,6 +1697,84 @@
   return ring->GetObjectForId(id, kind);
 }
 
+static ObjectPtr LookupClassMembers(Thread* thread,
+                                    const Class& klass,
+                                    char** parts,
+                                    int num_parts) {
+  auto isolate = thread->isolate();
+  auto zone = thread->zone();
+
+  if (num_parts != 4) {
+    return Object::sentinel().raw();
+  }
+
+  const char* encoded_id = parts[3];
+  auto& id = String::Handle(String::New(encoded_id));
+  id = String::DecodeIRI(id);
+  if (id.IsNull()) {
+    return Object::sentinel().raw();
+  }
+
+  if (strcmp(parts[2], "fields") == 0) {
+    // Field ids look like: "classes/17/fields/name"
+    const auto& field = Field::Handle(klass.LookupField(id));
+    if (field.IsNull()) {
+      return Object::sentinel().raw();
+    }
+    return field.raw();
+  }
+  if (strcmp(parts[2], "functions") == 0) {
+    // Function ids look like: "classes/17/functions/name"
+    const auto& function = Function::Handle(klass.LookupFunction(id));
+    if (function.IsNull()) {
+      return Object::sentinel().raw();
+    }
+    return function.raw();
+  }
+  if (strcmp(parts[2], "implicit_closures") == 0) {
+    // Function ids look like: "classes/17/implicit_closures/11"
+    intptr_t id;
+    if (!GetIntegerId(parts[3], &id)) {
+      return Object::sentinel().raw();
+    }
+    const auto& func =
+        Function::Handle(zone, klass.ImplicitClosureFunctionFromIndex(id));
+    if (func.IsNull()) {
+      return Object::sentinel().raw();
+    }
+    return func.raw();
+  }
+  if (strcmp(parts[2], "dispatchers") == 0) {
+    // Dispatcher Function ids look like: "classes/17/dispatchers/11"
+    intptr_t id;
+    if (!GetIntegerId(parts[3], &id)) {
+      return Object::sentinel().raw();
+    }
+    const auto& func =
+        Function::Handle(zone, klass.InvocationDispatcherFunctionFromIndex(id));
+    if (func.IsNull()) {
+      return Object::sentinel().raw();
+    }
+    return func.raw();
+  }
+  if (strcmp(parts[2], "closures") == 0) {
+    // Closure ids look like: "classes/17/closures/11"
+    intptr_t id;
+    if (!GetIntegerId(parts[3], &id)) {
+      return Object::sentinel().raw();
+    }
+    Function& func = Function::Handle(zone);
+    func = isolate->ClosureFunctionFromIndex(id);
+    if (func.IsNull()) {
+      return Object::sentinel().raw();
+    }
+    return func.raw();
+  }
+
+  UNREACHABLE();
+  return Object::sentinel().raw();
+}
+
 static ObjectPtr LookupHeapObjectLibraries(Isolate* isolate,
                                            char** parts,
                                            int num_parts) {
@@ -1724,9 +1802,30 @@
   if (!lib_found) {
     return Object::sentinel().raw();
   }
+
+  const auto& klass = Class::Handle(lib.toplevel_class());
+  ASSERT(!klass.IsNull());
+
   if (num_parts == 2) {
     return lib.raw();
   }
+  if (strcmp(parts[2], "fields") == 0) {
+    // Library field ids look like: "libraries/17/fields/name"
+    return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+  }
+  if (strcmp(parts[2], "functions") == 0) {
+    // Library function ids look like: "libraries/17/functions/name"
+    return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+  }
+  if (strcmp(parts[2], "closures") == 0) {
+    // Library function ids look like: "libraries/17/closures/name"
+    return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+  }
+  if (strcmp(parts[2], "implicit_closures") == 0) {
+    // Library function ids look like: "libraries/17/implicit_closures/name"
+    return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+  }
+
   if (strcmp(parts[2], "scripts") == 0) {
     // Script ids look like "libraries/35/scripts/library%2Furl.dart/12345"
     if (num_parts != 5) {
@@ -1783,86 +1882,19 @@
   }
   if (strcmp(parts[2], "closures") == 0) {
     // Closure ids look like: "classes/17/closures/11"
-    if (num_parts != 4) {
-      return Object::sentinel().raw();
-    }
-    intptr_t id;
-    if (!GetIntegerId(parts[3], &id)) {
-      return Object::sentinel().raw();
-    }
-    Function& func = Function::Handle(zone);
-    func = isolate->ClosureFunctionFromIndex(id);
-    if (func.IsNull()) {
-      return Object::sentinel().raw();
-    }
-    return func.raw();
-
+    return LookupClassMembers(thread, cls, parts, num_parts);
   } else if (strcmp(parts[2], "fields") == 0) {
     // Field ids look like: "classes/17/fields/name"
-    if (num_parts != 4) {
-      return Object::sentinel().raw();
-    }
-    const char* encoded_id = parts[3];
-    String& id = String::Handle(zone, String::New(encoded_id));
-    id = String::DecodeIRI(id);
-    if (id.IsNull()) {
-      return Object::sentinel().raw();
-    }
-    Field& field = Field::Handle(zone, cls.LookupField(id));
-    if (field.IsNull()) {
-      return Object::sentinel().raw();
-    }
-    return field.raw();
-
+    return LookupClassMembers(thread, cls, parts, num_parts);
   } else if (strcmp(parts[2], "functions") == 0) {
     // Function ids look like: "classes/17/functions/name"
-    if (num_parts != 4) {
-      return Object::sentinel().raw();
-    }
-    const char* encoded_id = parts[3];
-    String& id = String::Handle(zone, String::New(encoded_id));
-    id = String::DecodeIRI(id);
-    if (id.IsNull()) {
-      return Object::sentinel().raw();
-    }
-    Function& func = Function::Handle(zone, cls.LookupFunction(id));
-    if (func.IsNull()) {
-      return Object::sentinel().raw();
-    }
-    return func.raw();
-
+    return LookupClassMembers(thread, cls, parts, num_parts);
   } else if (strcmp(parts[2], "implicit_closures") == 0) {
     // Function ids look like: "classes/17/implicit_closures/11"
-    if (num_parts != 4) {
-      return Object::sentinel().raw();
-    }
-    intptr_t id;
-    if (!GetIntegerId(parts[3], &id)) {
-      return Object::sentinel().raw();
-    }
-    Function& func = Function::Handle(zone);
-    func = cls.ImplicitClosureFunctionFromIndex(id);
-    if (func.IsNull()) {
-      return Object::sentinel().raw();
-    }
-    return func.raw();
-
+    return LookupClassMembers(thread, cls, parts, num_parts);
   } else if (strcmp(parts[2], "dispatchers") == 0) {
     // Dispatcher Function ids look like: "classes/17/dispatchers/11"
-    if (num_parts != 4) {
-      return Object::sentinel().raw();
-    }
-    intptr_t id;
-    if (!GetIntegerId(parts[3], &id)) {
-      return Object::sentinel().raw();
-    }
-    Function& func = Function::Handle(zone);
-    func = cls.InvocationDispatcherFunctionFromIndex(id);
-    if (func.IsNull()) {
-      return Object::sentinel().raw();
-    }
-    return func.raw();
-
+    return LookupClassMembers(thread, cls, parts, num_parts);
   } else if (strcmp(parts[2], "types") == 0) {
     // Type ids look like: "classes/17/types/11"
     if (num_parts != 4) {
@@ -2707,7 +2739,8 @@
         cls = instance.clazz();
         isStatic = false;
       }
-      if (cls.id() < kInstanceCid || cls.id() == kTypeArgumentsCid) {
+      if (!cls.IsTopLevel() &&
+          (cls.id() < kInstanceCid || cls.id() == kTypeArgumentsCid)) {
         js->PrintError(
             kInvalidParams,
             "Expressions can be evaluated only with regular Dart instances");
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 5668365..ed50a53 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -1703,7 +1703,7 @@
   static const char* kScriptChars =
       "import 'dart:typed_data';\n"
       "getTypedDataList() {\n"
-      "  var list = List<dynamic>.filled(10, null);\n"
+      "  var list = List<dynamic>.filled(13, null);\n"
       "  var index = 0;\n"
       "  list[index++] = Int8List(256);\n"
       "  list[index++] = Uint8List(256);\n"
@@ -1715,10 +1715,13 @@
       "  list[index++] = Uint64List(256);\n"
       "  list[index++] = Float32List(256);\n"
       "  list[index++] = Float64List(256);\n"
+      "  list[index++] = Int32x4List(256);\n"
+      "  list[index++] = Float32x4List(256);\n"
+      "  list[index++] = Float64x2List(256);\n"
       "  return list;\n"
       "}\n"
       "getTypedDataViewList() {\n"
-      "  var list = List<dynamic>.filled(30, null);\n"
+      "  var list = List<dynamic>.filled(45, null);\n"
       "  var index = 0;\n"
       "  list[index++] = Int8List.view(Int8List(256).buffer);\n"
       "  list[index++] = Uint8List.view(Uint8List(256).buffer);\n"
@@ -1730,6 +1733,9 @@
       "  list[index++] = Uint64List.view(new Uint64List(256).buffer);\n"
       "  list[index++] = Float32List.view(new Float32List(256).buffer);\n"
       "  list[index++] = Float64List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Int32x4List.view(new Int32x4List(256).buffer);\n"
+      "  list[index++] = Float32x4List.view(new Float32x4List(256).buffer);\n"
+      "  list[index++] = Float64x2List.view(new Float64x2List(256).buffer);\n"
 
       "  list[index++] = Int8List.view(new Int16List(256).buffer);\n"
       "  list[index++] = Uint8List.view(new Uint16List(256).buffer);\n"
@@ -1741,6 +1747,12 @@
       "  list[index++] = Uint8List.view(new Float32List(256).buffer);\n"
       "  list[index++] = Int8List.view(new Float64List(256).buffer);\n"
       "  list[index++] = Uint8List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Int32x4List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Int32x4List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Float32x4List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Float32x4List(256).buffer);\n"
+      "  list[index++] = Int8List.view(new Float64x2List(256).buffer);\n"
+      "  list[index++] = Uint8List.view(new Float64x2List(256).buffer);\n"
 
       "  list[index++] = Int16List.view(new Int8List(256).buffer);\n"
       "  list[index++] = Uint16List.view(new Uint8List(256).buffer);\n"
@@ -1752,10 +1764,16 @@
       "  list[index++] = Uint16List.view(new Float32List(256).buffer);\n"
       "  list[index++] = Int16List.view(new Float64List(256).buffer);\n"
       "  list[index++] = Uint16List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Int32x4List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Int32x4List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Float32x4List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Float32x4List(256).buffer);\n"
+      "  list[index++] = Int16List.view(new Float64x2List(256).buffer);\n"
+      "  list[index++] = Uint16List.view(new Float64x2List(256).buffer);\n"
       "  return list;\n"
       "}\n"
       "getMultipleTypedDataViewList() {\n"
-      "  var list = List<dynamic>.filled(10, null);\n"
+      "  var list = List<dynamic>.filled(13, null);\n"
       "  var index = 0;\n"
       "  var data = Uint8List(256).buffer;\n"
       "  list[index++] = Int8List.view(data);\n"
@@ -1768,6 +1786,9 @@
       "  list[index++] = Uint64List.view(data);\n"
       "  list[index++] = Float32List.view(data);\n"
       "  list[index++] = Float64List.view(data);\n"
+      "  list[index++] = Int32x4List.view(data);\n"
+      "  list[index++] = Float32x4List.view(data);\n"
+      "  list[index++] = Float64x2List.view(data);\n"
       "  return list;\n"
       "}\n";
 
@@ -1795,12 +1816,13 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-          {Dart_TypedData_kInt8, 256},     {Dart_TypedData_kUint8, 256},
-          {Dart_TypedData_kInt16, 512},    {Dart_TypedData_kUint16, 512},
-          {Dart_TypedData_kInt32, 1024},   {Dart_TypedData_kUint32, 1024},
-          {Dart_TypedData_kInt64, 2048},   {Dart_TypedData_kUint64, 2048},
-          {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
-          {Dart_TypedData_kInvalid, -1}};
+          {Dart_TypedData_kInt8, 256},       {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 512},      {Dart_TypedData_kUint16, 512},
+          {Dart_TypedData_kInt32, 1024},     {Dart_TypedData_kUint32, 1024},
+          {Dart_TypedData_kInt64, 2048},     {Dart_TypedData_kUint64, 2048},
+          {Dart_TypedData_kFloat32, 1024},   {Dart_TypedData_kFloat64, 2048},
+          {Dart_TypedData_kInt32x4, 4096},   {Dart_TypedData_kFloat32x4, 4096},
+          {Dart_TypedData_kFloat64x2, 4096}, {Dart_TypedData_kInvalid, -1}};
 
       int i = 0;
       while (expected[i].type != Dart_TypedData_kInvalid) {
@@ -1822,23 +1844,31 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-          {Dart_TypedData_kInt8, 256},     {Dart_TypedData_kUint8, 256},
-          {Dart_TypedData_kInt16, 512},    {Dart_TypedData_kUint16, 512},
-          {Dart_TypedData_kInt32, 1024},   {Dart_TypedData_kUint32, 1024},
-          {Dart_TypedData_kInt64, 2048},   {Dart_TypedData_kUint64, 2048},
-          {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
+          {Dart_TypedData_kInt8, 256},       {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 512},      {Dart_TypedData_kUint16, 512},
+          {Dart_TypedData_kInt32, 1024},     {Dart_TypedData_kUint32, 1024},
+          {Dart_TypedData_kInt64, 2048},     {Dart_TypedData_kUint64, 2048},
+          {Dart_TypedData_kFloat32, 1024},   {Dart_TypedData_kFloat64, 2048},
+          {Dart_TypedData_kInt32x4, 4096},   {Dart_TypedData_kFloat32x4, 4096},
+          {Dart_TypedData_kFloat64x2, 4096},
 
-          {Dart_TypedData_kInt8, 512},     {Dart_TypedData_kUint8, 512},
-          {Dart_TypedData_kInt8, 1024},    {Dart_TypedData_kUint8, 1024},
-          {Dart_TypedData_kInt8, 2048},    {Dart_TypedData_kUint8, 2048},
-          {Dart_TypedData_kInt8, 1024},    {Dart_TypedData_kUint8, 1024},
-          {Dart_TypedData_kInt8, 2048},    {Dart_TypedData_kUint8, 2048},
+          {Dart_TypedData_kInt8, 512},       {Dart_TypedData_kUint8, 512},
+          {Dart_TypedData_kInt8, 1024},      {Dart_TypedData_kUint8, 1024},
+          {Dart_TypedData_kInt8, 2048},      {Dart_TypedData_kUint8, 2048},
+          {Dart_TypedData_kInt8, 1024},      {Dart_TypedData_kUint8, 1024},
+          {Dart_TypedData_kInt8, 2048},      {Dart_TypedData_kUint8, 2048},
+          {Dart_TypedData_kInt8, 4096},      {Dart_TypedData_kUint8, 4096},
+          {Dart_TypedData_kInt8, 4096},      {Dart_TypedData_kUint8, 4096},
+          {Dart_TypedData_kInt8, 4096},      {Dart_TypedData_kUint8, 4096},
 
-          {Dart_TypedData_kInt16, 256},    {Dart_TypedData_kUint16, 256},
-          {Dart_TypedData_kInt16, 1024},   {Dart_TypedData_kUint16, 1024},
-          {Dart_TypedData_kInt16, 2048},   {Dart_TypedData_kUint16, 2048},
-          {Dart_TypedData_kInt16, 1024},   {Dart_TypedData_kUint16, 1024},
-          {Dart_TypedData_kInt16, 2048},   {Dart_TypedData_kUint16, 2048},
+          {Dart_TypedData_kInt16, 256},      {Dart_TypedData_kUint16, 256},
+          {Dart_TypedData_kInt16, 1024},     {Dart_TypedData_kUint16, 1024},
+          {Dart_TypedData_kInt16, 2048},     {Dart_TypedData_kUint16, 2048},
+          {Dart_TypedData_kInt16, 1024},     {Dart_TypedData_kUint16, 1024},
+          {Dart_TypedData_kInt16, 2048},     {Dart_TypedData_kUint16, 2048},
+          {Dart_TypedData_kInt16, 4096},     {Dart_TypedData_kUint16, 4096},
+          {Dart_TypedData_kInt16, 4096},     {Dart_TypedData_kUint16, 4096},
+          {Dart_TypedData_kInt16, 4096},     {Dart_TypedData_kUint16, 4096},
 
           {Dart_TypedData_kInvalid, -1}};
 
@@ -1862,12 +1892,13 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-          {Dart_TypedData_kInt8, 256},    {Dart_TypedData_kUint8, 256},
-          {Dart_TypedData_kInt16, 256},   {Dart_TypedData_kUint16, 256},
-          {Dart_TypedData_kInt32, 256},   {Dart_TypedData_kUint32, 256},
-          {Dart_TypedData_kInt64, 256},   {Dart_TypedData_kUint64, 256},
-          {Dart_TypedData_kFloat32, 256}, {Dart_TypedData_kFloat64, 256},
-          {Dart_TypedData_kInvalid, -1}};
+          {Dart_TypedData_kInt8, 256},      {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 256},     {Dart_TypedData_kUint16, 256},
+          {Dart_TypedData_kInt32, 256},     {Dart_TypedData_kUint32, 256},
+          {Dart_TypedData_kInt64, 256},     {Dart_TypedData_kUint64, 256},
+          {Dart_TypedData_kFloat32, 256},   {Dart_TypedData_kFloat64, 256},
+          {Dart_TypedData_kInt32x4, 256},   {Dart_TypedData_kFloat32x4, 256},
+          {Dart_TypedData_kFloat64x2, 256}, {Dart_TypedData_kInvalid, -1}};
 
       int i = 0;
       while (expected[i].type != Dart_TypedData_kInvalid) {
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index c2b7828..468edfc 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -131,8 +131,7 @@
         var_data_field(Field::Handle(zone)),
         state_field(Field::Handle(zone)),
         on_data_field(Field::Handle(zone)),
-        state_data_field(Field::Handle(zone)),
-        future_timeout_method_(Function::Handle(zone)) {
+        state_data_field(Field::Handle(zone)) {
     const auto& async_lib = Library::Handle(zone, Library::AsyncLibrary());
     // Look up classes:
     // - async:
@@ -197,11 +196,6 @@
     state_data_field =
         stream_iterator_class.LookupFieldAllowPrivate(Symbols::_stateData());
     ASSERT(!state_data_field.IsNull());
-
-    // Functions:
-    future_timeout_method_ =
-        future_impl_class.LookupFunction(Symbols::timeout());
-    ASSERT(!future_timeout_method_.IsNull());
   }
 
   ClosurePtr GetCallerInFutureImpl(const Object& future_) {
@@ -296,7 +290,14 @@
       parent_function_ = receiver_function_.parent_function();
       if (parent_function_.recognized_kind() ==
           MethodRecognizer::kFutureTimeout) {
-        context_entry_ = receiver_context_.At(Context::kChainedFutureIndex);
+        context_entry_ =
+            receiver_context_.At(Context::kFutureTimeoutFutureIndex);
+        return GetCallerInFutureImpl(context_entry_);
+      } else if (parent_function_.recognized_kind() ==
+                 MethodRecognizer::kFutureWait) {
+        receiver_context_ = receiver_context_.parent();
+        ASSERT(!receiver_context_.IsNull());
+        context_entry_ = receiver_context_.At(Context::kFutureWaitFutureIndex);
         return GetCallerInFutureImpl(context_entry_);
       }
     }
@@ -363,8 +364,6 @@
   Field& state_field;
   Field& on_data_field;
   Field& state_data_field;
-
-  Function& future_timeout_method_;
 };
 
 void StackTraceUtils::CollectFramesLazy(
diff --git a/sdk/lib/_http/embedder_config.dart b/sdk/lib/_http/embedder_config.dart
index 730bc2dd..8a12201 100644
--- a/sdk/lib/_http/embedder_config.dart
+++ b/sdk/lib/_http/embedder_config.dart
@@ -7,5 +7,9 @@
 /// Embedder-specific `dart:_http` configuration.
 
 /// [HttpClient] will disallow HTTP URLs if this value is set to `false`.
+///
+/// TODO(https://github.com/dart-lang/sdk/issues/41796): This setting will be
+/// removed in favor of explicit domain settings.
+@deprecated
 @pragma("vm:entry-point")
 bool _embedderAllowsHttp = true;
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 4f51724..bc43046 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -2271,32 +2271,6 @@
     });
   }
 
-  /// Whether HTTP requests are currently allowed.
-  ///
-  /// If the [Zone] variable `#dart.library.io.allow_http` is set to a boolean,
-  /// it determines whether the HTTP protocol is allowed. If the zone variable
-  /// is set to any other non-null value, HTTP is not allowed.
-  /// Otherwise, if the `dart.library.io.allow_http` environment flag
-  /// is set to `false`, HTTP is not allowed.
-  /// Otherwise, [_embedderAllowsHttp] determines the result.
-  bool get _isHttpAllowed {
-    final zoneOverride = Zone.current[#dart.library.io.allow_http];
-    if (zoneOverride != null) return true == zoneOverride;
-    bool envOverride =
-        bool.fromEnvironment("dart.library.io.allow_http", defaultValue: true);
-    return envOverride && _embedderAllowsHttp;
-  }
-
-  bool _isLoopback(String host) {
-    if (host.isEmpty) return false;
-    if ("localhost" == host) return true;
-    try {
-      return InternetAddress(host).isLoopback;
-    } on ArgumentError {
-      return false;
-    }
-  }
-
   Future<_HttpClientRequest> _openUrl(String method, Uri uri) {
     if (_closing) {
       throw new StateError("Client is closed");
@@ -2318,11 +2292,6 @@
     }
 
     bool isSecure = uri.isScheme("https");
-    if (!_isHttpAllowed && !isSecure && !_isLoopback(uri.host)) {
-      throw new StateError(
-          "Insecure HTTP is not allowed by the current platform: $uri");
-    }
-
     int port = uri.port;
     if (port == 0) {
       port =
diff --git a/sdk/lib/_internal/allowed_experiments.json b/sdk/lib/_internal/allowed_experiments.json
index bd6900f..bbe8144 100644
--- a/sdk/lib/_internal/allowed_experiments.json
+++ b/sdk/lib/_internal/allowed_experiments.json
@@ -34,6 +34,15 @@
     "collection": {
       "experimentSet": "nullSafety"
     },
+    "convert": {
+      "experimentSet": "nullSafety"
+    },
+    "crypto": {
+      "experimentSet": "nullSafety"
+    },
+    "csslib": {
+      "experimentSet": "nullSafety"
+    },
     "dart_internal": {
       "experimentSet": "nullSafety"
     },
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 6449304..bb6ed77 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -258,8 +258,9 @@
    * Use [Completer] to create a future and complete it later.
    */
   @pragma("vm:entry-point")
+  @pragma("vm:prefer-inline")
   factory Future.value([FutureOr<T>? value]) {
-    return new _Future<T>.immediate(value == null ? value as dynamic : value);
+    return new _Future<T>.immediate(value == null ? value as T : value);
   }
 
   /**
@@ -360,9 +361,12 @@
    * The call to [cleanUp] should not throw. If it does, the error will be an
    * uncaught asynchronous error.
    */
+  @pragma("vm:entry-point")
   static Future<List<T>> wait<T>(Iterable<Future<T>> futures,
       {bool eagerError = false, void cleanUp(T successValue)?}) {
-    final _Future<List<T>> result = new _Future<List<T>>();
+    // This is a VM recognised method, and the _future variable is deliberately
+    // allocated in a specific slot in the closure context for stack unwinding.
+    final _Future<List<T>> _future = _Future<List<T>>();
     List<T?>? values; // Collects the values. Set to null on error.
     int remaining = 0; // How many futures are we waiting for.
     late Object error; // The first error from a future.
@@ -386,13 +390,13 @@
         }
         values = null;
         if (remaining == 0 || eagerError) {
-          result._completeError(theError, theStackTrace);
+          _future._completeError(theError, theStackTrace);
         } else {
           error = theError;
           stackTrace = theStackTrace;
         }
       } else if (remaining == 0 && !eagerError) {
-        result._completeError(error, stackTrace);
+        _future._completeError(error, stackTrace);
       }
     }
 
@@ -407,7 +411,7 @@
           if (valueList != null) {
             valueList[pos] = value;
             if (remaining == 0) {
-              result._completeWithValue(List<T>.from(valueList));
+              _future._completeWithValue(List<T>.from(valueList));
             }
           } else {
             if (cleanUp != null && value != null) {
@@ -419,7 +423,7 @@
             if (remaining == 0 && !eagerError) {
               // If eagerError is false, and valueList is null, then
               // error and stackTrace have been set in handleError above.
-              result._completeError(error, stackTrace);
+              _future._completeError(error, stackTrace);
             }
           }
         }, onError: handleError);
@@ -439,7 +443,7 @@
       // gracefully.
       if (remaining == 0 || eagerError) {
         // Throw a new Future.error.
-        // Don't just call `result._completeError` since that would propagate
+        // Don't just call `_future._completeError` since that would propagate
         // the error too eagerly, not giving the callers time to install
         // error handlers.
         // Also, don't use `_asyncCompleteError` since that one doesn't give
@@ -453,7 +457,7 @@
         stackTrace = st;
       }
     }
-    return result;
+    return _future;
   }
 
   /**
diff --git a/sdk/lib/convert/encoding.dart b/sdk/lib/convert/encoding.dart
index b9238a8..5974366 100644
--- a/sdk/lib/convert/encoding.dart
+++ b/sdk/lib/convert/encoding.dart
@@ -65,12 +65,12 @@
     "utf-8": utf8
   };
 
-  /// Gets an [Encoding] object from the name of the character set
-  /// name. The names used are the IANA official names for the
-  /// character set (see
-  /// http://www.iana.org/assignments/character-sets/character-sets.xml).
+  /// Returns an [Encoding] for a named character set.
   ///
-  /// The [name] passed is case insensitive.
+  /// The names used are the IANA official names for the character set (see
+  /// [IANA character sets][]). The names are case insensitive.
+  ///
+  /// [IANA character sets]: http://www.iana.org/assignments/character-sets/character-sets.xml
   ///
   /// If character set is not supported `null` is returned.
   static Encoding? getByName(String? name) {
diff --git a/sdk/lib/io/embedder_config.dart b/sdk/lib/io/embedder_config.dart
index cbc94f7..2042aa5 100644
--- a/sdk/lib/io/embedder_config.dart
+++ b/sdk/lib/io/embedder_config.dart
@@ -32,6 +32,18 @@
   @pragma('vm:entry-point')
   static bool _maySleep = true;
 
+  /// The Isolate may establish insecure socket connections to all domains.
+  ///
+  /// This setting can be overridden by per-domain policies.
+  @pragma('vm:entry-point')
+  static bool _mayInsecurelyConnectToAllDomains = true;
+
+  /// Domain network policies set by embedder.
+  @pragma('vm:entry-point')
+  static void _setDomainPolicies(String domainNetworkPolicyJson) {
+    _domainPolicies = _constructDomainPolicies(domainNetworkPolicyJson);
+  }
+
   // TODO(zra): Consider adding:
   // - an option to disallow modifying SecurityContext.defaultContext
   // - an option to disallow closing stdout and stderr.
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index c667cfe..7ffa6e3 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -215,6 +215,7 @@
 part 'io_service.dart';
 part 'link.dart';
 part 'namespace_impl.dart';
+part 'network_policy.dart';
 part 'network_profiling.dart';
 part 'overrides.dart';
 part 'platform.dart';
diff --git a/sdk/lib/io/network_policy.dart b/sdk/lib/io/network_policy.dart
new file mode 100644
index 0000000..9fa586b
--- /dev/null
+++ b/sdk/lib/io/network_policy.dart
@@ -0,0 +1,192 @@
+// 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.
+
+part of dart.io;
+
+/// Whether insecure connections to [host] are allowed.
+///
+/// [host] must be a [String] or [InternetAddress].
+///
+/// If any of the domain policies match [host], the matching policy will make
+/// the decision. If multiple policies apply, the top matching policy makes the
+/// decision. If none of the domain policies match, the embedder default is
+/// used.
+///
+/// Loopback addresses are always allowed.
+bool isInsecureConnectionAllowed(dynamic host) {
+  String hostString;
+  if (host is String) {
+    try {
+      if ("localhost" == host || InternetAddress(host).isLoopback) return true;
+    } on ArgumentError {
+      // Assume not loopback.
+    }
+    hostString = host;
+  } else if (host is InternetAddress) {
+    if (host.isLoopback) return true;
+    hostString = host.host;
+  } else {
+    throw ArgumentError.value(
+        host, "host", "Must be a String or InternetAddress");
+  }
+  final topMatchedPolicy = _findBestDomainNetworkPolicy(hostString);
+  final envOverride = bool.fromEnvironment(
+      "dart.library.io.may_insecurely_connect_to_all_domains",
+      defaultValue: true);
+  return topMatchedPolicy?.allowInsecureConnections ??
+      (envOverride && _EmbedderConfig._mayInsecurelyConnectToAllDomains);
+}
+
+/// Policy for a specific domain.
+///
+/// [_DomainNetworkPolicy] can be used to create exceptions to the global
+/// network policy.
+class _DomainNetworkPolicy {
+  /// https://tools.ietf.org/html/rfc1034#:~:text=Name%20space%20specifications
+  ///
+  /// We specifically do not allow IP addresses.
+  static final _domainMatcher = RegExp(
+      r"^(?:[a-z\d-]{1,63}\.)+[a-z][a-z\d-]{0,62}$",
+      caseSensitive: false);
+
+  /// The domain on which the policy is being set.
+  ///
+  /// This cannot be a numeric IP address.
+  ///
+  /// For example: `example.com`.
+  final String domain;
+
+  /// Whether to allow insecure socket connections for this domain.
+  final bool allowInsecureConnections;
+
+  /// Whether this domain policy covers sub-domains as well.
+  ///
+  /// If this is true, all subdomains inherit the same policy. For instance,
+  /// a policy set on `example.com` would apply to `*.example.com` such as
+  /// `subdomain.example.com` or `www.example.com`.
+  final bool includesSubDomains;
+
+  /// Creates a new domain exception in the network policy.
+  ///
+  /// [domain] is the domain on which the policy is being set.
+  ///
+  /// [includesSubDomains] determines whether the policy applies to
+  /// all sub domains. If this is set to true, all subdomains inherit the
+  /// same policy. For instance, a policy set on `example.com` would apply to
+  /// `*.example.com` such as `subdomain.example.com` or `www.example.com`.
+  ///
+  /// [allowInsecureConnections] determines whether to allow insecure socket
+  /// connections for this [domain].
+  _DomainNetworkPolicy(this.domain,
+      {this.includesSubDomains = false,
+      this.allowInsecureConnections = false}) {
+    if (domain.length > 255 || !_domainMatcher.hasMatch(domain)) {
+      throw ArgumentError.value(domain, "domain", "Invalid domain name");
+    }
+  }
+
+  /// Calculates how well the policy matches to a given host string.
+  ///
+  /// A host matches a [policy] if it ends with its [domain].
+  ///
+  /// A score is given to such a match depending on the specificity of the
+  /// [domain]:
+  ///
+  /// * A longer domain receives a higher score.
+  /// * A domain that does not allow sub domains receives a higher score.
+  ///
+  /// Returns -1 if the policy does not match.
+  int matchScore(String host) {
+    final domainLength = domain.length;
+    final hostLength = host.length;
+    final lengthDelta = hostLength - domainLength;
+    if (host.endsWith(domain) &&
+        (lengthDelta == 0 ||
+            includesSubDomains && host.codeUnitAt(lengthDelta - 1) == 0x2e)) {
+      return domainLength * 2 + (includesSubDomains ? 0 : 1);
+    }
+    return -1;
+  }
+
+  /// Checks whether the [policy] to be added conflicts with existing policies.
+  ///
+  /// Returns [true] if policy is safe to add to existing policy set and [false]
+  ///     if policy can safely be ignored.
+  ///
+  /// Throws [ArgumentError] if a conflict is detected.
+  bool checkConflict(List<_DomainNetworkPolicy> existingPolicies) {
+    for (final existingPolicy in existingPolicies) {
+      if (includesSubDomains == existingPolicy.includesSubDomains &&
+          domain == existingPolicy.domain) {
+        if (allowInsecureConnections ==
+            existingPolicy.allowInsecureConnections) {
+          // This is a duplicate policy
+          return false;
+        }
+        throw StateError("Contradiction in the domain security policies: "
+            "'$this' contradicts '$existingPolicy'");
+      }
+    }
+    return true;
+  }
+
+  /// This is used for encoding information about the policy in user visible
+  /// errors.
+  @override
+  String toString() {
+    final subDomainPrefix = includesSubDomains ? '*.' : '';
+    final insecureConnectionPermission =
+        allowInsecureConnections ? 'Allows' : 'Disallows';
+    return "$subDomainPrefix$domain: "
+        "$insecureConnectionPermission insecure connections";
+  }
+}
+
+/// Finds the top [DomainNetworkPolicy] instance that match given a single
+/// [domain].
+///
+/// We order the policies according to how specific they are. The final policy
+/// for a given [domain] is determined by the top matching
+/// [DomainNetworkPolicy].
+///
+/// Returns null if there's no matching policy.
+_DomainNetworkPolicy? _findBestDomainNetworkPolicy(String domain) {
+  var topScore = 0;
+  _DomainNetworkPolicy? topPolicy;
+  for (final _DomainNetworkPolicy policy in _domainPolicies) {
+    final score = policy.matchScore(domain);
+    if (score > topScore) {
+      topScore = score;
+      topPolicy = policy;
+    }
+  }
+  return topPolicy;
+}
+
+/// Domain level policies that dart:io is enforcing.
+late List<_DomainNetworkPolicy> _domainPolicies =
+    _constructDomainPolicies(null);
+
+List<_DomainNetworkPolicy> _constructDomainPolicies(
+    String? domainPoliciesString) {
+  final domainPolicies = <_DomainNetworkPolicy>[];
+  domainPoliciesString ??= String.fromEnvironment(
+      "dart.library.io.domain_network_policies",
+      defaultValue: "");
+  if (domainPoliciesString.isNotEmpty) {
+    final List<dynamic> policiesJson = json.decode(domainPoliciesString);
+    for (final List<dynamic> policyJson in policiesJson) {
+      assert(policyJson.length == 3);
+      final policy = _DomainNetworkPolicy(
+        policyJson[0],
+        includesSubDomains: policyJson[1],
+        allowInsecureConnections: policyJson[2],
+      );
+      if (policy.checkConflict(domainPolicies)) {
+        domainPolicies.add(policy);
+      }
+    }
+  }
+  return domainPolicies;
+}
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index b5e814f..4cdd14f 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -801,6 +801,10 @@
       {sourceAddress, Duration? timeout}) {
     final IOOverrides? overrides = IOOverrides.current;
     if (overrides == null) {
+      if (!isInsecureConnectionAllowed(host)) {
+        throw new SocketException(
+            "Insecure socket connections are disallowed by platform: $host");
+      }
       return Socket._connect(host, port,
           sourceAddress: sourceAddress, timeout: timeout);
     }
@@ -815,6 +819,10 @@
       {sourceAddress}) {
     final IOOverrides? overrides = IOOverrides.current;
     if (overrides == null) {
+      if (!isInsecureConnectionAllowed(host)) {
+        throw new SocketException(
+            "Insecure socket connections are disallowed by platform: $host");
+      }
       return Socket._startConnect(host, port, sourceAddress: sourceAddress);
     }
     return overrides.socketStartConnect(host, port,
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index cb09dc7..607fb63 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -50,18 +50,6 @@
 LanguageFeatures/Triple-Shift/*: Skip # Not migrated to NNBD
 LanguageFeatures/int-to-double/*: Skip # Not migrated to NNBD
 LanguageFeatures/regression/*: Skip # Not migrated to NNBD
-LibTest/async/Completer/*: Skip # Not migrated to NNBD
-LibTest/async/DeferredLibrary/*: Skip # Not migrated to NNBD
-LibTest/async/EventSink/*: Skip # Not migrated to NNBD
-LibTest/async/Future/*: Skip # Not migrated to NNBD
-LibTest/async/Stream/*: Skip # Not migrated to NNBD
-LibTest/async/StreamConsumer/*: Skip # Not migrated to NNBD
-LibTest/async/StreamController/*: Skip # Not migrated to NNBD
-LibTest/async/StreamIterator/*: Skip # Not migrated to NNBD
-LibTest/async/StreamSink/*: Skip # Not migrated to NNBD
-LibTest/async/StreamTransformer/*: Skip # Not migrated to NNBD
-LibTest/async/Timer/*: Skip # Not migrated to NNBD
-LibTest/async/Zone/*: Skip # Not migrated to NNBD
 LibTest/collection/DoubleLinkedQueue/*: Skip # Not migrated to NNBD
 LibTest/collection/DoubleLinkedQueueEntry/*: Skip # Not migrated to NNBD
 LibTest/collection/HasNextIterator/*: Skip # Not migrated to NNBD
diff --git a/tests/corelib/cast_errors_test.dart b/tests/corelib/cast_errors_test.dart
index 9e2b8eb2..b9aa936 100644
--- a/tests/corelib/cast_errors_test.dart
+++ b/tests/corelib/cast_errors_test.dart
@@ -31,6 +31,6 @@
   // [cfe] A value of type 'C' can't be assigned to a variable of type 'D?'.
   dMap[d] = c;
   //        ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'C' can't be assigned to a variable of type 'D?'.
 }
diff --git a/tests/language/assert/initializer_const_function_test.dart b/tests/language/assert/initializer_const_function_test.dart
index 27b99bd..b581c1d 100644
--- a/tests/language/assert/initializer_const_function_test.dart
+++ b/tests/language/assert/initializer_const_function_test.dart
@@ -11,7 +11,7 @@
   const C.bc01(this.x, y)
       : assert(staticTrue)
       //       ^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+      // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
       // [cfe] A value of type 'bool Function()' can't be assigned to a variable of type 'bool'.
       ;
 }
diff --git a/tests/language/assign/static_type_test.dart b/tests/language/assign/static_type_test.dart
index d184bf4..8fba36d 100644
--- a/tests/language/assign/static_type_test.dart
+++ b/tests/language/assign/static_type_test.dart
@@ -7,7 +7,7 @@
 
 int a = "String";
 //      ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 
 class A {
@@ -16,19 +16,19 @@
   // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   //                   ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   final int d = "String";
   //            ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   int e = "String";
   //      ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   A() {
      int f = "String";
      //      ^^^^^^^^
-     // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+     // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
      // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   }
   method(
@@ -36,7 +36,7 @@
      int
       g = "String"]) {
       //  ^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
     return g;
   }
diff --git a/tests/language/async/congruence_local_test.dart b/tests/language/async/congruence_local_test.dart
index 6ea20da..15e27a2 100644
--- a/tests/language/async/congruence_local_test.dart
+++ b/tests/language/async/congruence_local_test.dart
@@ -100,7 +100,7 @@
     Future<Object> v1 = f_inferred_futureObject();
     Future<int> v2 = f_inferred_futureObject();
     //               ^^^^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                                      ^
     // [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'Future<int>'.
 
@@ -110,7 +110,7 @@
     Future<A> v3 = f_inferred_A();
     Future<B> v4 = f_inferred_A();
     //             ^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                         ^
     // [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<B>'.
   }
diff --git a/tests/language/async/congruence_method_test.dart b/tests/language/async/congruence_method_test.dart
index 5732013..663fdf4 100644
--- a/tests/language/async/congruence_method_test.dart
+++ b/tests/language/async/congruence_method_test.dart
@@ -78,7 +78,7 @@
   Future<A> v1 = c.f_inferred_A();
   Future<B> v2 = c.f_inferred_A();
   //             ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
   // [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<B>'.
 }
diff --git a/tests/language/async/congruence_unnamed_test.dart b/tests/language/async/congruence_unnamed_test.dart
index 274588b..0aef8ad 100644
--- a/tests/language/async/congruence_unnamed_test.dart
+++ b/tests/language/async/congruence_unnamed_test.dart
@@ -120,7 +120,7 @@
     Future<Object> v1 = f_inferred_futureObject();
     Future<int> v2 = f_inferred_futureObject();
     //               ^^^^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                                      ^
     // [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'Future<int>'.
 
@@ -130,7 +130,7 @@
     Future<A> v3 = f_inferred_A();
     Future<B> v4 = f_inferred_A();
     //             ^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                         ^
     // [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<B>'.
   }
diff --git a/tests/language/async/or_generator_return_type_stacktrace_test.dart b/tests/language/async/or_generator_return_type_stacktrace_test.dart
index 1e331db..317b537 100644
--- a/tests/language/async/or_generator_return_type_stacktrace_test.dart
+++ b/tests/language/async/or_generator_return_type_stacktrace_test.dart
@@ -6,7 +6,7 @@
 
 int badReturnTypeAsync() async => 0;
 // [error line 7, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
 //  ^
 // [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
 int badReturnTypeAsyncStar() async* {}
diff --git a/tests/language/async/return_types_test.dart b/tests/language/async/return_types_test.dart
index 20a3c22..f378549 100644
--- a/tests/language/async/return_types_test.dart
+++ b/tests/language/async/return_types_test.dart
@@ -18,13 +18,13 @@
 foo3() async {
   return "String";
   //     ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'FutureOr<int>'.
 }
 
 Future<int, String>
 // [error line 25, column 1, length 19]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 foo4() async {
   return "String";
@@ -32,7 +32,7 @@
 
 int
 // [error line 33, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
 foo5() async {
 // [error line 36, column 1, length 3]
 // [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
diff --git a/tests/language/call/method_implicit_tear_off_assignable_test.dart b/tests/language/call/method_implicit_tear_off_assignable_test.dart
index 791b083..c1e6f25 100644
--- a/tests/language/call/method_implicit_tear_off_assignable_test.dart
+++ b/tests/language/call/method_implicit_tear_off_assignable_test.dart
@@ -17,6 +17,6 @@
   // this is a static error.
   void Function([int]) f = i;
   //                       ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] unspecified
 }
diff --git a/tests/language/call/non_method_field_test.dart b/tests/language/call/non_method_field_test.dart
index 6d30f27..bb5b843 100644
--- a/tests/language/call/non_method_field_test.dart
+++ b/tests/language/call/non_method_field_test.dart
@@ -14,14 +14,14 @@
   Fisk x1 = new Fisk();
   x1.i();
 //^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 
   Hest x2 = new Hest();
   x2.i();
 //^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 }
diff --git a/tests/language/call/object_has_no_call_method_test.dart b/tests/language/call/object_has_no_call_method_test.dart
index dcb2a5c..d02b290 100644
--- a/tests/language/call/object_has_no_call_method_test.dart
+++ b/tests/language/call/object_has_no_call_method_test.dart
@@ -6,20 +6,20 @@
   d();
   o();
 //^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 // ^
 // [cfe] The method 'call' isn't defined for the class 'Object'.
   f();
   d.call;
   o.call;
   //^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'call' isn't defined for the class 'Object'.
   f.call;
   d.call();
   o.call();
   //^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'call' isn't defined for the class 'Object'.
   f.call();
 }
diff --git a/tests/language/call/through_getter_test.dart b/tests/language/call/through_getter_test.dart
index 2169e8c6..06e5af3 100644
--- a/tests/language/call/through_getter_test.dart
+++ b/tests/language/call/through_getter_test.dart
@@ -31,12 +31,12 @@
 
     TOP_LEVEL_CONST();
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
     (TOP_LEVEL_CONST)();
 //  ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                   ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
diff --git a/tests/language/cascade/cascade_test.dart b/tests/language/cascade/cascade_test.dart
index 274b23bf..7e674f5 100644
--- a/tests/language/cascade/cascade_test.dart
+++ b/tests/language/cascade/cascade_test.dart
@@ -93,11 +93,11 @@
   // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
   // [cfe] Expected an identifier, but got '37'.
   // [error line 91, column 8, length 0]
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   a.."foo";
   // ^^^^^
   // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
   // [cfe] Expected an identifier, but got '"foo"'.
   // [error line 97, column 11, length 0]
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 }
diff --git a/tests/language/closure/internals_test.dart b/tests/language/closure/internals_test.dart
index 78f04ab..9efdda3 100644
--- a/tests/language/closure/internals_test.dart
+++ b/tests/language/closure/internals_test.dart
@@ -12,14 +12,14 @@
   var f = new C().foo;
   var target = f.target;
   //             ^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'target' isn't defined for the class 'dynamic Function()'.
   var self = f.self;
   //           ^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'self' isn't defined for the class 'dynamic Function()'.
   var receiver = f.receiver;
   //               ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'receiver' isn't defined for the class 'dynamic Function()'.
 }
diff --git a/tests/language/compile_time_constant/static2_test.dart b/tests/language/compile_time_constant/static2_test.dart
index 5de087a..2f6abe6 100644
--- a/tests/language/compile_time_constant/static2_test.dart
+++ b/tests/language/compile_time_constant/static2_test.dart
@@ -13,7 +13,7 @@
   const A.a2(this.x);
   const A.a3([this.x = 'foo']);
   //                   ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   const A.a4(String this.x);
   //         ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 const a2 = const A.a2('foo');
 //                    ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                    ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
 const a3 = const A.a3();
 //         ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 const a4 = const A.a4('foo');
 //                    ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 const a5 = const A.a5('foo');
 //         ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
 //         ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 //                    ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                    ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/compile_time_constant/static3_test.dart b/tests/language/compile_time_constant/static3_test.dart
index d6c508b..f9205fd 100644
--- a/tests/language/compile_time_constant/static3_test.dart
+++ b/tests/language/compile_time_constant/static3_test.dart
@@ -13,7 +13,7 @@
   const A.a2(this.x);
   const A.a3([this.x = 'foo']);
   //                   ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   const A.a4(String this.x);
   //         ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 var a2 = const A.a2('foo');
 //                  ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                  ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
 var a3 = const A.a3();
 //       ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 var a4 = const A.a4('foo');
 //                  ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 var a5 = const A.a5('foo');
 //       ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
 //       ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 //                  ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                  ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/compile_time_constant/static_test.dart b/tests/language/compile_time_constant/static_test.dart
index 288ffef..a7fb0a8 100644
--- a/tests/language/compile_time_constant/static_test.dart
+++ b/tests/language/compile_time_constant/static_test.dart
@@ -4,17 +4,17 @@
 
 final int x = 'foo';
 //            ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 const int y = 'foo';
 //            ^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 //            ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 int z = 'foo';
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 
 main() {
diff --git a/tests/language/const/conditional_test.dart b/tests/language/const/conditional_test.dart
index 33aec86..4943748 100644
--- a/tests/language/const/conditional_test.dart
+++ b/tests/language/const/conditional_test.dart
@@ -73,13 +73,13 @@
 // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 //            ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 const cond4a = zeroConst ? nonConst : const1;
 //             ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 //             ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 //                         ^
 // [cfe] Not a constant expression.
 const cond4b = zeroConst ? const0 : nonConst;
@@ -87,7 +87,7 @@
 // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 //             ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 //                                  ^
 // [cfe] Not a constant expression.
 
diff --git a/tests/language/const/constructor3_test.dart b/tests/language/const/constructor3_test.dart
index aa8aa0ff..8ec85e0 100644
--- a/tests/language/const/constructor3_test.dart
+++ b/tests/language/const/constructor3_test.dart
@@ -15,7 +15,7 @@
 const c = const C(0.0);
 const d = const C(intValue);
 //                ^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'int' can't be assigned to the parameter type 'double'.
 //                ^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/const/init2_test.dart b/tests/language/const/init2_test.dart
index 7f5e1a3..40b7a8b 100644
--- a/tests/language/const/init2_test.dart
+++ b/tests/language/const/init2_test.dart
@@ -9,7 +9,7 @@
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'double'.
 //               ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 
 main() {
   print(c);
diff --git a/tests/language/constructor/named_constructor_test.dart b/tests/language/constructor/named_constructor_test.dart
index d802b9a..3b8af32 100644
--- a/tests/language/constructor/named_constructor_test.dart
+++ b/tests/language/constructor/named_constructor_test.dart
@@ -24,12 +24,12 @@
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //             ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
 
   // 'Class<int>.named<int>' doesn't fit the grammar syntax T.id:
   new Class<int>.named<int>().value;
   //             ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   new prefix.Class().value;
@@ -45,7 +45,7 @@
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   // [cfe] Method not found: 'prefix.Class'.
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   new prefix.Class.named().value;
@@ -64,7 +64,7 @@
   // 'prefix.Class.named<int>' doesn't fit the grammar syntax T.id:
   new prefix.Class.named<int>().value;
   //               ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   // 'prefix<int>.Class<int>' doesn't fit the grammar syntax T.id:
@@ -73,7 +73,7 @@
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   // [cfe] Method not found: 'prefix.Class'.
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
 
@@ -90,7 +90,7 @@
   // 'prefix.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
   new prefix.Class<int>.named<int>().value;
   //                    ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   // 'prefix<int>.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
@@ -99,6 +99,6 @@
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   // [cfe] Method not found: 'prefix.Class'.
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 }
diff --git a/tests/language/constructor/reference_test.dart b/tests/language/constructor/reference_test.dart
index c1ec04c..9246d2b 100644
--- a/tests/language/constructor/reference_test.dart
+++ b/tests/language/constructor/reference_test.dart
@@ -23,13 +23,13 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Expected '(' after this.
   //               ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
   new Foo.bar<int>();
   //      ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //         ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   new Foo.bar<int>.baz();
   //      ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -41,7 +41,7 @@
   //  ^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   //          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //          ^
   // [cfe] Method not found: 'Foo.bar.baz'.
@@ -60,13 +60,13 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Expected '(' after this.
   //                 ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
   const Foo.bar<int>();
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //           ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   const Foo.bar<int>.baz();
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -78,7 +78,7 @@
   //    ^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   //            ^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //            ^
   // [cfe] Method not found: 'Foo.bar.baz'.
@@ -87,7 +87,7 @@
   Foo.bar();
   Foo.bar.baz();
   //  ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'bar'.
   Foo<int>();
   Foo<int>.bar();
@@ -96,13 +96,13 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Expected '(' after this.
   //           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
   Foo.bar<int>();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //     ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   Foo.bar<int>.baz();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -112,6 +112,6 @@
   // [cfe] Method not found: 'Foo.bar.baz'.
   Foo.bar.baz<int>();
   //  ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'bar'.
 }
diff --git a/tests/language/control_flow_collections/await_for_downcast_test.dart b/tests/language/control_flow_collections/await_for_downcast_test.dart
index 613ebf4..5c6d3ff 100644
--- a/tests/language/control_flow_collections/await_for_downcast_test.dart
+++ b/tests/language/control_flow_collections/await_for_downcast_test.dart
@@ -17,7 +17,7 @@
   Object obj = stream([1, 2, 3, 4]);
   var a = <int>[await for (var n in obj) n];
   //                                ^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Stream<dynamic>'.
 
   // Downcast variable.
@@ -26,7 +26,7 @@
     //             ^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
     //                  ^^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
   ];
 
   // Downcast element.
@@ -43,7 +43,7 @@
   Object obj = stream([1, 2, 3, 4]);
   var a = <int, int>{await for (var n in obj) n: n};
   //                                     ^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Stream<dynamic>'.
 
   // Downcast variable.
@@ -52,7 +52,7 @@
     //             ^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
     //                  ^^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
   };
 
   // Downcast element.
@@ -72,7 +72,7 @@
   Object obj = stream([1, 2, 3, 4]);
   var a = <int>{await for (var n in obj) n};
   //                                ^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Stream<dynamic>'.
 
   // Downcast variable.
@@ -81,7 +81,7 @@
     //             ^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
     //                  ^^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
   };
 
   // Downcast element.
diff --git a/tests/language/control_flow_collections/for_downcast_test.dart b/tests/language/control_flow_collections/for_downcast_test.dart
index d88e3f6..a9eda1d 100644
--- a/tests/language/control_flow_collections/for_downcast_test.dart
+++ b/tests/language/control_flow_collections/for_downcast_test.dart
@@ -15,7 +15,7 @@
   Object obj = <int>[1, 2, 3, 4];
   var a = <int>[for (var n in obj) n];
   //                          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
 
   // Downcast variable.
@@ -24,7 +24,7 @@
     //       ^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
     //            ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
   ];
 
   // Downcast element.
@@ -38,7 +38,7 @@
   // Downcast condition.
   var d = <int>[for (var i = 1; (i < 2) as Object; i++) i];
   //                            ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   //                                    ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
@@ -48,7 +48,7 @@
   Object obj = <int>[1, 2, 3, 4];
   var a = <int, int>{for (var n in obj) n: n};
   //                               ^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
 
   // Downcast variable.
@@ -57,7 +57,7 @@
     //       ^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
     //            ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
   };
 
   // Downcast element.
@@ -74,7 +74,7 @@
   // Downcast condition.
   var d = <int, int>{for (var i = 1; (i < 2) as Object; i++) i: i};
   //                                 ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   //                                         ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
@@ -84,7 +84,7 @@
   Object obj = <int>[1, 2, 3, 4];
   var a = <int>{for (var n in obj) n};
   //                          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
 
   // Downcast variable.
@@ -93,7 +93,7 @@
     //       ^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
     //            ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
   };
 
   // Downcast element.
@@ -107,7 +107,7 @@
   // Downcast condition.
   var d = <int>{for (var i = 1; (i < 2) as Object; i++) i};
   //                            ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   //                                    ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/control_flow_collections/if_downcast_test.dart b/tests/language/control_flow_collections/if_downcast_test.dart
index 4150456..0acfbde 100644
--- a/tests/language/control_flow_collections/if_downcast_test.dart
+++ b/tests/language/control_flow_collections/if_downcast_test.dart
@@ -5,19 +5,19 @@
 void main() {
   var a = <int>[if (true as Object) 1];
   //                ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   //                     ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 
   var b = <int, int>{if (true as Object) 1: 1};
   //                     ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   //                          ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 
   var c = <int>{if (true as Object) 1};
   //                ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   //                     ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/covariant/return_type_test.dart b/tests/language/covariant/return_type_test.dart
index 43c6c9e..ae6ebae 100644
--- a/tests/language/covariant/return_type_test.dart
+++ b/tests/language/covariant/return_type_test.dart
@@ -7,7 +7,7 @@
 void main() {
   List<int> l = [1, 2, 3].where((x) => x.isEven).map((x) => x + 1);
   //            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                             ^
   // [cfe] A value of type 'Iterable<int>' can't be assigned to a variable of type 'List<int>'.
 
@@ -21,7 +21,7 @@
     C<Object> c = C<Object>(1);
     List<bool Function(Object)> myList = c.f();
     //                                   ^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                                     ^
     // [cfe] A value of type 'Iterable<bool Function(Object)>' can't be assigned to a variable of type 'List<bool Function(Object)>'.
   }
@@ -30,7 +30,7 @@
     C<Object> c = C<int>(1);
     List<bool Function(Object)> myList = c.f();
     //                                   ^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                                     ^
     // [cfe] A value of type 'Iterable<bool Function(Object)>' can't be assigned to a variable of type 'List<bool Function(Object)>'.
   }
@@ -50,7 +50,7 @@
     C<Iterable<Object>> c = D<Object>([1]);
     List<bool Function(Iterable<Object>)> myList = c.f();
     //                                             ^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                                               ^
     // [cfe] A value of type 'Iterable<bool Function(Iterable<Object>)>' can't be assigned to a variable of type 'List<bool Function(Iterable<Object>)>'.
   }
diff --git a/tests/language/deferred/super_dependency_test.dart b/tests/language/deferred/super_dependency_test.dart
index f49380c..5879e56 100644
--- a/tests/language/deferred/super_dependency_test.dart
+++ b/tests/language/deferred/super_dependency_test.dart
@@ -8,7 +8,7 @@
 
 import "package:expect/expect.dart";
 //        ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
 // [cfe] Superclass has no setter named 'foo'.
 import "super_dependency_lib.dart" deferred as lib;
 
diff --git a/tests/language/enum/private_test.dart b/tests/language/enum/private_test.dart
index bd99d84..a24fec3 100644
--- a/tests/language/enum/private_test.dart
+++ b/tests/language/enum/private_test.dart
@@ -20,6 +20,6 @@
   Expect.equals('Enum2._A,Enum2._B', Enum2.values.join(','));
   Expect.throwsNoSuchMethodError(() => Enum2._A);
   //                                         ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_ENUM_CONSTANT
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_ENUM_CONSTANT
   // [cfe] Getter not found: '_A'.
 }
diff --git a/tests/language/extension_methods/static_extension_bounds_error_test.dart b/tests/language/extension_methods/static_extension_bounds_error_test.dart
index 5424a7e..60ae8b7 100644
--- a/tests/language/extension_methods/static_extension_bounds_error_test.dart
+++ b/tests/language/extension_methods/static_extension_bounds_error_test.dart
@@ -32,7 +32,7 @@
   // Inferred type of String does not satisfy the bound.
   s.e1;
 //  ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] The getter 'e1' isn't defined for the class 'String'.
   E1(s).e1;
 //^^
@@ -55,7 +55,7 @@
   // Inferred type of String does not satisfy the bound.
   s.e2;
 //  ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] The getter 'e2' isn't defined for the class 'String'.
   E2(s).e2;
 //^^
@@ -121,7 +121,7 @@
   // Inferred super-bounded type is invalid as type argument
   superRec.e4;
 //         ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] The getter 'e4' isn't defined for the class 'Rec<dynamic>'.
   E4(superRec).e4;
 //^^
diff --git a/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart b/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart
index 59920e7..8dc19f1 100644
--- a/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart
+++ b/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart
@@ -10,10 +10,10 @@
   Object o = 1;
   OnObject(o).onObject;
 //^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
 // [cfe] Method not found: 'OnObject'.
   o.onObject;
   //^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'onObject' isn't defined for the class 'Object'.
 }
diff --git a/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
index bce34aa..42c9c65 100644
--- a/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -44,15 +44,15 @@
   c0.m2 = 0;
   c0.m2;
   // ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C0'.
   c0.m2 += 0;
   // ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C0'.
   c0.m2++;
   // ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C0'.
 
   E0(c0).m2;
@@ -60,7 +60,7 @@
   c0[0];
   c0[0] = 0;
   //^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C0'.
   E0(c0)[0];
   //    ^^^
@@ -70,11 +70,11 @@
 
   c0[0] += 0;
   //^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C0'.
   c0[0]++;
   //^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C0'.
 
   E0(c0)[0] += 0;
@@ -114,24 +114,24 @@
 
   c1a.m2;
   //  ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C1<int>'.
 
   c1a.m2 = 0;
 
   c1a[0] = 0;
   // ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0] += 0;
   // ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0]++;
   // ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0];
@@ -200,7 +200,7 @@
 
   c1c.m2;
   //  ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C1<Object>'.
 }
 
@@ -230,23 +230,23 @@
     this.m2 = 0;
     this.m2;
     //   ^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'm2' isn't defined for the class 'C2'.
 
     this[0] = 0;
     this[0];
     //  ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
     // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     this[0] += 0;
     //  ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
     // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     this[0]++;
     //  ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
     // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     // Check that `this.mc` refers to `C2.mc`.
diff --git a/tests/language/extension_methods/static_extension_import_hide_error_test.dart b/tests/language/extension_methods/static_extension_import_hide_error_test.dart
index 9a93aa0..25b0461 100644
--- a/tests/language/extension_methods/static_extension_import_hide_error_test.dart
+++ b/tests/language/extension_methods/static_extension_import_hide_error_test.dart
@@ -12,7 +12,7 @@
   Object o = i;
   i.onInt;
   //^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'onInt' isn't defined for the class 'int'.
   i.onObject;
   o.onObject;
diff --git a/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart b/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart
index 3c485e8..a146f12 100644
--- a/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart
+++ b/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart
@@ -12,7 +12,7 @@
   Object o = i;
   i.onInt;
   //^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'onInt' isn't defined for the class 'int'.
   i.onObject;
   o.onObject;
diff --git a/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart b/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
index f1a9254..86941be 100644
--- a/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
+++ b/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
@@ -51,7 +51,7 @@
     // The instance getter shadows the global method
     topLevelMethod(4);
 //  ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -143,7 +143,7 @@
     // The static getter shadows the global method
     topLevelMethod(4);
 //  ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                   ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -225,7 +225,7 @@
     // The instance getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -256,7 +256,7 @@
     // The instance getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] 'extensionMethod' isn't a function or method and can't be invoked.
   }
@@ -371,7 +371,7 @@
     // The static getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                     ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -417,7 +417,7 @@
     // The static getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
diff --git a/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart b/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart
index 38191b8..dd18be3 100644
--- a/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart
+++ b/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart
@@ -29,7 +29,7 @@
   void shadowTypeParam<T>(T x) {
     T y = self;
     //    ^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type '#T' can't be assigned to a variable of type 'T'.
   }
 
diff --git a/tests/language/extension_methods/static_extension_resolution_failures_test.dart b/tests/language/extension_methods/static_extension_resolution_failures_test.dart
index 2856a18..ce822ac 100644
--- a/tests/language/extension_methods/static_extension_resolution_failures_test.dart
+++ b/tests/language/extension_methods/static_extension_resolution_failures_test.dart
@@ -39,7 +39,7 @@
   // No `i_num` extension declared.
   i_num.i_num;
   //    ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'i_num' isn't defined for the class 'Iterable<num>'.
 
   Expect.equals("Iterable<int>.i_num", ii.i_num);
diff --git a/tests/language/factory/factory_test.dart b/tests/language/factory/factory_test.dart
index b42c213..7b0c2a8 100644
--- a/tests/language/factory/factory_test.dart
+++ b/tests/language/factory/factory_test.dart
@@ -36,7 +36,7 @@
 abstract class Link<T> {
   factory Link.create() = LinkFactory<T>.create;
   //                      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 0 type arguments.
   //                      ^^^^^^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_INVALID_RETURN_TYPE
diff --git a/tests/language/factory/return_type_checked_test.dart b/tests/language/factory/return_type_checked_test.dart
index 0cff112..0913da5 100644
--- a/tests/language/factory/return_type_checked_test.dart
+++ b/tests/language/factory/return_type_checked_test.dart
@@ -7,7 +7,7 @@
 class A {
   factory A() => 42;
   //             ^^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'int' can't be returned from a function with return type 'A'.
 }
 
diff --git a/tests/language/field/type_check_test.dart b/tests/language/field/type_check_test.dart
index 09b5507..34315c1 100644
--- a/tests/language/field/type_check_test.dart
+++ b/tests/language/field/type_check_test.dart
@@ -9,6 +9,6 @@
 void main() {
   new A().e = "String";
   //          ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 }
diff --git a/tests/language/function/malformed_result_type_test.dart b/tests/language/function/malformed_result_type_test.dart
index 182258b..9f2223c 100644
--- a/tests/language/function/malformed_result_type_test.dart
+++ b/tests/language/function/malformed_result_type_test.dart
@@ -11,6 +11,6 @@
 main() {
   C<int> f() => throw "uncalled";
 //^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 }
diff --git a/tests/language/function/type_call_getter2_test.dart b/tests/language/function/type_call_getter2_test.dart
index c52cb9e..789f22e 100644
--- a/tests/language/function/type_call_getter2_test.dart
+++ b/tests/language/function/type_call_getter2_test.dart
@@ -27,42 +27,42 @@
       Function
       a2 = a;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'A' can't be assigned to a variable of type 'Function'.
 
   final
       F
       a3 = a;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'A' can't be assigned to a variable of type 'int Function(String)'.
 
   final
       Function
       b2 = b;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'B' can't be assigned to a variable of type 'Function'.
 
   final
       F
       b3 = b;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'B' can't be assigned to a variable of type 'int Function(String)'.
 
   final
       Function
       c2 = c;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'C' can't be assigned to a variable of type 'Function'.
 
   final
       F
       c3 = c;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'C' can't be assigned to a variable of type 'int Function(String)'.
 
   Expect.throwsTypeError(() {
diff --git a/tests/language/generic/field_mixin6_test.dart b/tests/language/generic/field_mixin6_test.dart
index 47a3678..303df88 100644
--- a/tests/language/generic/field_mixin6_test.dart
+++ b/tests/language/generic/field_mixin6_test.dart
@@ -9,7 +9,7 @@
 class M<T> {
   T field1 = 0;
   //         ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'T'.
   T field2 = 0 as dynamic;
 }
diff --git a/tests/language/generic/function_subtype_parametrized_typedef_test.dart b/tests/language/generic/function_subtype_parametrized_typedef_test.dart
index a1dd791..10775ef 100644
--- a/tests/language/generic/function_subtype_parametrized_typedef_test.dart
+++ b/tests/language/generic/function_subtype_parametrized_typedef_test.dart
@@ -17,30 +17,30 @@
   H<A> haa = ha;
   H<A> hab = hb;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
   H<A> hac = hc;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
 
   H<B> hba = ha;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
   H<B> hbb = hb;
   H<B> hbc = hc;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
 
   H<C> hca = ha;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
   H<C> hcb = hb;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
   H<C> hcc = hc;
 }
diff --git a/tests/language/generic/function_subtype_test.dart b/tests/language/generic/function_subtype_test.dart
index 28cb90a..d392f6d 100644
--- a/tests/language/generic/function_subtype_test.dart
+++ b/tests/language/generic/function_subtype_test.dart
@@ -14,12 +14,12 @@
   F1 f11 = f1;
   F1 f12 = f2;
   //       ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y2 extends String>()' can't be assigned to a variable of type 'void Function<X1 extends num>()'.
 
   F2 f21 = f1;
   //       ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y1 extends num>()' can't be assigned to a variable of type 'void Function<X2 extends String>()'.
   F2 f22 = f2;
 }
diff --git a/tests/language/generic/function_typedef2_test.dart b/tests/language/generic/function_typedef2_test.dart
index 6532988..0ad79c5 100644
--- a/tests/language/generic/function_typedef2_test.dart
+++ b/tests/language/generic/function_typedef2_test.dart
@@ -27,7 +27,7 @@
 // [cfe] Can't create typedef from non-function type.
 typedef K = Function(Function<A>(A<int>));
 //                               ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Can't use type arguments with type variable 'A'.
 typedef L = Function({x});
 //                    ^
diff --git a/tests/language/generic/wrong_number_type_arguments_test.dart b/tests/language/generic/wrong_number_type_arguments_test.dart
index dcc0d9a..160e331 100644
--- a/tests/language/generic/wrong_number_type_arguments_test.dart
+++ b/tests/language/generic/wrong_number_type_arguments_test.dart
@@ -5,18 +5,18 @@
 // Map takes 2 type arguments.
 Map<String> foo = {};
 // [error line 6, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 Map<String> baz = {};
 // [error line 10, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 
 main() {
   foo = {};
   var bar = new Map<String>();
   //            ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 2 type arguments.
   baz = new Map();
 }
diff --git a/tests/language/getter/no_setter2_test.dart b/tests/language/getter/no_setter2_test.dart
index 83d92c4..22ad07e 100644
--- a/tests/language/getter/no_setter2_test.dart
+++ b/tests/language/getter/no_setter2_test.dart
@@ -18,7 +18,7 @@
     // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
     // [cfe] The getter 'nextVar' isn't defined for the class 'Example'.
     //   ^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
     // [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
   }
   static test() {
@@ -31,7 +31,7 @@
 // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
 // [cfe] Expected identifier, but got 'this'.
 //       ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
 //       ^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
   }
diff --git a/tests/language/getter/no_setter_test.dart b/tests/language/getter/no_setter_test.dart
index c403d32..260b5fc 100644
--- a/tests/language/getter/no_setter_test.dart
+++ b/tests/language/getter/no_setter_test.dart
@@ -15,7 +15,7 @@
 // [cfe] Setter not found: 'nextVar'.
     this.nextVar = 1;
     //   ^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
     // [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
     //   ^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
@@ -30,7 +30,7 @@
 // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
 // [cfe] Expected identifier, but got 'this'.
 //       ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
 //       ^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
   }
diff --git a/tests/language/getter/setter2_test.dart b/tests/language/getter/setter2_test.dart
index a26bd49..0985ebe 100644
--- a/tests/language/getter/setter2_test.dart
+++ b/tests/language/getter/setter2_test.dart
@@ -57,7 +57,7 @@
   void set field(A arg) {
     getterField = arg;
     //            ^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
   }
 }
@@ -72,7 +72,7 @@
   Expect.throwsTypeError(() => instance1.field = new A() as dynamic);
   B resultB = instance1.field;
   //          ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                    ^
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 
@@ -83,7 +83,7 @@
   // Type 'A' has no method named 'b'
   instance1.field.b();
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'b' isn't defined for the class 'A'.
 
   instance3.field = new B();
diff --git a/tests/language/identifier/known_prefix_error_test.dart b/tests/language/identifier/known_prefix_error_test.dart
index fe1ea19..06ec097 100644
--- a/tests/language/identifier/known_prefix_error_test.dart
+++ b/tests/language/identifier/known_prefix_error_test.dart
@@ -72,82 +72,82 @@
 
 async.B<async> _B_async = new async.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'async' isn't a type.
 await.B<await> _B_await = new await.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'await' isn't a type.
 hide.B<hide> _B_hide = new hide.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'hide' isn't a type.
 of.B<of> _B_of = new of.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'of' isn't a type.
 on.B<on> _B_on = new on.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'on' isn't a type.
 show.B<show> _B_show = new show.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'show' isn't a type.
 sync.B<sync> _B_sync = new sync.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'sync' isn't a type.
 yield.B<yield> _B_yield = new yield.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'yield' isn't a type.
 
 async.B<async<dynamic>> _B2_async = new async.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'async' isn't a type.
 //      ^
 // [cfe] Expected 0 type arguments.
 await.B<await<dynamic>> _B2_await = new await.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'await' isn't a type.
 //      ^
 // [cfe] Expected 0 type arguments.
 hide.B<hide<dynamic>> _B2_hide = new hide.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'hide' isn't a type.
 //     ^
 // [cfe] Expected 0 type arguments.
 of.B<of<dynamic>> _B2_of = new of.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'of' isn't a type.
 //   ^
 // [cfe] Expected 0 type arguments.
 on.B<on<dynamic>> _B2_on = new on.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'on' isn't a type.
 //   ^
 // [cfe] Expected 0 type arguments.
 show.B<show<dynamic>> _B2_show = new show.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'show' isn't a type.
 //     ^
 // [cfe] Expected 0 type arguments.
 sync.B<sync<dynamic>> _B2_sync = new sync.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'sync' isn't a type.
 //     ^
 // [cfe] Expected 0 type arguments.
 yield.B<yield<dynamic>> _B2_yield = new yield.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'yield' isn't a type.
 //      ^
 // [cfe] Expected 0 type arguments.
diff --git a/tests/language/if_null/assignment_behavior_test.dart b/tests/language/if_null/assignment_behavior_test.dart
index 12da870..d83be71 100644
--- a/tests/language/if_null/assignment_behavior_test.dart
+++ b/tests/language/if_null/assignment_behavior_test.dart
@@ -125,7 +125,7 @@
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL
 // [cfe] The setter 'finalOne' isn't defined for the class 'C'.
 //               ^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 //               ^^^^
 // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
     yGetValue = 1;
@@ -172,7 +172,7 @@
   // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
   // [cfe] Can't assign to the final variable 'l'.
   //                   ^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                   ^^^^
   // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
   C ??= null;
@@ -180,7 +180,7 @@
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
 // [cfe] Can't assign to a type literal.
 //      ^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 //      ^^^^
 // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
   h ??= null;
@@ -228,11 +228,11 @@
   check(1, () => C?.x ??= bad(), ['C.x']);
   h.C.xgetValue = 1;
   //  ^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] Setter not found: 'xgetValue'.
   check(1, () => h.c?.x ??= bad(), ['h.C.x']);
   //               ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
   // [cfe] Getter not found: 'c'.
   yGetValue = 1;
   check(1, () => C?.x ??= y, ['C.x', 'y', 'C.x=1']);
diff --git a/tests/language/if_null/precedence_test.dart b/tests/language/if_null/precedence_test.dart
index 2b11622..eeb9570 100644
--- a/tests/language/if_null/precedence_test.dart
+++ b/tests/language/if_null/precedence_test.dart
@@ -34,7 +34,7 @@
   // "(a ?? b) || c" would allow b to have any type provided that a is bool.
   falsity ?? 1 || true;
   //         ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 
   // "a || b ?? c" should parse as "(a || b) ?? c", therefore it is a static
@@ -42,7 +42,7 @@
   // "a || (b ?? c)" would allow b to have any type provided that c is bool.
   falsity || 1 ?? true;
 //           ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 //                ^^^^
 // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
@@ -51,7 +51,7 @@
   // error.
   Expect.throwsAssertionError(() => false || null ?? true);
   //                                         ^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
   // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
   //                                                 ^^^^
   // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
diff --git a/tests/language/implicit_downcast_during/assert_initializer_test.dart b/tests/language/implicit_downcast_during/assert_initializer_test.dart
index dd8c975..ca323ad 100644
--- a/tests/language/implicit_downcast_during/assert_initializer_test.dart
+++ b/tests/language/implicit_downcast_during/assert_initializer_test.dart
@@ -5,11 +5,11 @@
 class C {
   C.oneArg(Object x) : assert(x);
   //                          ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
   C.twoArgs(Object x, Object y) : assert(x, y);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
 
diff --git a/tests/language/implicit_downcast_during/assert_statement_test.dart b/tests/language/implicit_downcast_during/assert_statement_test.dart
index 9f0aa75..d32382e 100644
--- a/tests/language/implicit_downcast_during/assert_statement_test.dart
+++ b/tests/language/implicit_downcast_during/assert_statement_test.dart
@@ -6,11 +6,11 @@
   Object b = true;
   assert(b);
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
   assert(b, 'should not fail');
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
   assert(false, b);
   // OK, the message can have any type.
diff --git a/tests/language/implicit_downcast_during/assignment_test.dart b/tests/language/implicit_downcast_during/assignment_test.dart
index fe9f1e4..fe35a5c 100644
--- a/tests/language/implicit_downcast_during/assignment_test.dart
+++ b/tests/language/implicit_downcast_during/assignment_test.dart
@@ -11,6 +11,6 @@
   A a = new B();
   b = a;
   //  ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 }
diff --git a/tests/language/implicit_downcast_during/compound_assignment_test.dart b/tests/language/implicit_downcast_during/compound_assignment_test.dart
index a927b55..3d092c4 100644
--- a/tests/language/implicit_downcast_during/compound_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/compound_assignment_test.dart
@@ -15,16 +15,16 @@
   //^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
   //   ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 
   ++b;
 //^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
 
   b++;
 //^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // ^
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
 }
diff --git a/tests/language/implicit_downcast_during/conditional_expression_test.dart b/tests/language/implicit_downcast_during/conditional_expression_test.dart
index 565f124..ce234c2 100644
--- a/tests/language/implicit_downcast_during/conditional_expression_test.dart
+++ b/tests/language/implicit_downcast_during/conditional_expression_test.dart
@@ -6,6 +6,6 @@
   Object b = true;
   b ? 1 : 2;
 //^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/implicit_downcast_during/do_test.dart b/tests/language/implicit_downcast_during/do_test.dart
index f4bebde..24aff94 100644
--- a/tests/language/implicit_downcast_during/do_test.dart
+++ b/tests/language/implicit_downcast_during/do_test.dart
@@ -6,6 +6,6 @@
   Object b = false;
   do {} while (b);
   //           ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/implicit_downcast_during/field_declaration_test.dart b/tests/language/implicit_downcast_during/field_declaration_test.dart
index 4f819a2..abcac19 100644
--- a/tests/language/implicit_downcast_during/field_declaration_test.dart
+++ b/tests/language/implicit_downcast_during/field_declaration_test.dart
@@ -9,18 +9,18 @@
 A a1 = new B();
 B b1 = a1;
 //     ^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 
 class C {
   static B b3 = a1;
   //            ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 
   B b5 = a1;
   //     ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 }
 
diff --git a/tests/language/implicit_downcast_during/for_condition_test.dart b/tests/language/implicit_downcast_during/for_condition_test.dart
index 645b943..a860b6a 100644
--- a/tests/language/implicit_downcast_during/for_condition_test.dart
+++ b/tests/language/implicit_downcast_during/for_condition_test.dart
@@ -6,6 +6,6 @@
   Object b = false;
   for (int i = 0; b; i++) {}
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/implicit_downcast_during/for_in_element_test.dart b/tests/language/implicit_downcast_during/for_in_element_test.dart
index 30273be..67be51e 100644
--- a/tests/language/implicit_downcast_during/for_in_element_test.dart
+++ b/tests/language/implicit_downcast_during/for_in_element_test.dart
@@ -11,21 +11,21 @@
   Object o = listOfA;
   for (B x in o) {}
   //          ^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
   for (B x in listOfA) {}
   //     ^
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
   //          ^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
   B y;
   for (y in o) {}
   //        ^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
   for (y in listOfA) {}
   //     ^
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
   //        ^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
 }
diff --git a/tests/language/implicit_downcast_during/for_in_iterable_test.dart b/tests/language/implicit_downcast_during/for_in_iterable_test.dart
index 09fd2cf..91ca2ca 100644
--- a/tests/language/implicit_downcast_during/for_in_iterable_test.dart
+++ b/tests/language/implicit_downcast_during/for_in_iterable_test.dart
@@ -10,15 +10,15 @@
   Object o = <A>[];
   for (var x in o) {}
   //            ^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
   for (B x in o) {}
   //          ^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
   B y;
   for (y in o) {}
   //        ^
-  // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
   // [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
 }
diff --git a/tests/language/implicit_downcast_during/for_initializer_expression_test.dart b/tests/language/implicit_downcast_during/for_initializer_expression_test.dart
index 8c14537..98d8daf 100644
--- a/tests/language/implicit_downcast_during/for_initializer_expression_test.dart
+++ b/tests/language/implicit_downcast_during/for_initializer_expression_test.dart
@@ -7,6 +7,6 @@
   int i;
   for (i = b; i < 1; i++) {}
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'int'.
 }
diff --git a/tests/language/implicit_downcast_during/for_initializer_var_test.dart b/tests/language/implicit_downcast_during/for_initializer_var_test.dart
index 958c111..4b79c20 100644
--- a/tests/language/implicit_downcast_during/for_initializer_var_test.dart
+++ b/tests/language/implicit_downcast_during/for_initializer_var_test.dart
@@ -6,6 +6,6 @@
   Object b = 0;
   for (int i = b; i < 1; i++) {}
   //           ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'int'.
 }
diff --git a/tests/language/implicit_downcast_during/function_literal_arrow_test.dart b/tests/language/implicit_downcast_during/function_literal_arrow_test.dart
index 409ae5b..26f0836 100644
--- a/tests/language/implicit_downcast_during/function_literal_arrow_test.dart
+++ b/tests/language/implicit_downcast_during/function_literal_arrow_test.dart
@@ -10,6 +10,6 @@
   A a = new B();
   B Function(A) f = (A a) => a;
   //                         ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
   // [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
 }
diff --git a/tests/language/implicit_downcast_during/function_literal_return_test.dart b/tests/language/implicit_downcast_during/function_literal_return_test.dart
index 1c7a056..7c9acba 100644
--- a/tests/language/implicit_downcast_during/function_literal_return_test.dart
+++ b/tests/language/implicit_downcast_during/function_literal_return_test.dart
@@ -11,7 +11,7 @@
   B Function(A) f = (A a) {
     return a;
     //     ^
-    // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
     // [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
   };
 }
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 09f1e97..7c91b32 100644
--- a/tests/language/implicit_downcast_during/if_null_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/if_null_assignment_test.dart
@@ -11,6 +11,6 @@
   A? a = new B();
   b ??= a;
 //      ^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'A?' can't be assigned to a variable of type 'B?'.
 }
diff --git a/tests/language/implicit_downcast_during/if_statement_test.dart b/tests/language/implicit_downcast_during/if_statement_test.dart
index fb46a9b..4389417 100644
--- a/tests/language/implicit_downcast_during/if_statement_test.dart
+++ b/tests/language/implicit_downcast_during/if_statement_test.dart
@@ -6,6 +6,6 @@
   Object b = true;
   if (b) {}
   //  ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/implicit_downcast_during/indexed_assignment_test.dart b/tests/language/implicit_downcast_during/indexed_assignment_test.dart
index 65ae6a4..1f6493c 100644
--- a/tests/language/implicit_downcast_during/indexed_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/indexed_assignment_test.dart
@@ -18,6 +18,6 @@
   // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 }
diff --git a/tests/language/implicit_downcast_during/logical_expression_test.dart b/tests/language/implicit_downcast_during/logical_expression_test.dart
index 8e73fa1..123fe62 100644
--- a/tests/language/implicit_downcast_during/logical_expression_test.dart
+++ b/tests/language/implicit_downcast_during/logical_expression_test.dart
@@ -6,17 +6,17 @@
   Object o = new Object();
   o || o;
 //^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 //     ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 
   o && o;
 //^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 //     ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/implicit_downcast_during/not_test.dart b/tests/language/implicit_downcast_during/not_test.dart
index de8a43a..697e32b 100644
--- a/tests/language/implicit_downcast_during/not_test.dart
+++ b/tests/language/implicit_downcast_during/not_test.dart
@@ -6,6 +6,6 @@
   Object b = true;
   !b;
 // ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_NEGATION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_NEGATION_EXPRESSION
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/implicit_downcast_during/return_async_test.dart b/tests/language/implicit_downcast_during/return_async_test.dart
index 34d041e..b056db4 100644
--- a/tests/language/implicit_downcast_during/return_async_test.dart
+++ b/tests/language/implicit_downcast_during/return_async_test.dart
@@ -11,14 +11,14 @@
 Future<B> f1(A a) async {
   return a as FutureOr<A>;
   //     ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   //       ^
   // [cfe] A value of type 'FutureOr<A>' can't be returned from an async function with return type 'Future<B>'.
 }
 
 Future<B> f2(A a) async => a as FutureOr<A>;
 //                         ^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
 //                           ^
 // [cfe] A value of type 'FutureOr<A>' can't be returned from an async function with return type 'Future<B>'.
 
diff --git a/tests/language/implicit_downcast_during/return_test.dart b/tests/language/implicit_downcast_during/return_test.dart
index e858dc4..4a56921 100644
--- a/tests/language/implicit_downcast_during/return_test.dart
+++ b/tests/language/implicit_downcast_during/return_test.dart
@@ -9,13 +9,13 @@
 B f1(A a) {
   return a;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
 }
 
 B f2(A a) => a;
 //           ^
-// [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
 // [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
 
 void main() {
diff --git a/tests/language/implicit_downcast_during/variable_declaration_test.dart b/tests/language/implicit_downcast_during/variable_declaration_test.dart
index a44f239..216250c 100644
--- a/tests/language/implicit_downcast_during/variable_declaration_test.dart
+++ b/tests/language/implicit_downcast_during/variable_declaration_test.dart
@@ -10,6 +10,6 @@
   A a = new B();
   B b = a;
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 }
diff --git a/tests/language/implicit_downcast_during/while_statement_test.dart b/tests/language/implicit_downcast_during/while_statement_test.dart
index 3aa386b..6e4bdc9 100644
--- a/tests/language/implicit_downcast_during/while_statement_test.dart
+++ b/tests/language/implicit_downcast_during/while_statement_test.dart
@@ -6,6 +6,6 @@
   Object b = false;
   while (b) {}
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
 }
diff --git a/tests/language/implicit_downcast_during/yield_star_test.dart b/tests/language/implicit_downcast_during/yield_star_test.dart
index 990ec66..800b1c7 100644
--- a/tests/language/implicit_downcast_during/yield_star_test.dart
+++ b/tests/language/implicit_downcast_during/yield_star_test.dart
@@ -9,7 +9,7 @@
 Iterable<B> f(Iterable<A> a) sync* {
   yield* a;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
   // [cfe] A value of type 'Iterable<A>' can't be assigned to a variable of type 'Iterable<B>'.
 }
 
diff --git a/tests/language/implicit_downcast_during/yield_test.dart b/tests/language/implicit_downcast_during/yield_test.dart
index 8f98bd2..874ad7f 100644
--- a/tests/language/implicit_downcast_during/yield_test.dart
+++ b/tests/language/implicit_downcast_during/yield_test.dart
@@ -9,7 +9,7 @@
 Iterable<B> f(A a) sync* {
   yield a;
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
 }
 
diff --git a/tests/language/import/self_test.dart b/tests/language/import/self_test.dart
index 1feeb88..f724a60 100644
--- a/tests/language/import/self_test.dart
+++ b/tests/language/import/self_test.dart
@@ -18,6 +18,6 @@
 main() {
   p._x;
   //^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
   // [cfe] Getter not found: '_x'.
 }
diff --git a/tests/language/inference/accessor_ref_test.dart b/tests/language/inference/accessor_ref_test.dart
index 9d12c5c..f443785 100644
--- a/tests/language/inference/accessor_ref_test.dart
+++ b/tests/language/inference/accessor_ref_test.dart
@@ -35,14 +35,14 @@
   x = new E();
   x = new B();
   //  ^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //      ^
   // [cfe] A value of type 'B' can't be assigned to a variable of type 'C?'.
   y = new C();
   y = new E();
   y = new B();
   //  ^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //      ^
   // [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
 }
diff --git a/tests/language/inference/inconsistent_inheritance_test.dart b/tests/language/inference/inconsistent_inheritance_test.dart
index 79ba0fc..8ff26eb 100644
--- a/tests/language/inference/inconsistent_inheritance_test.dart
+++ b/tests/language/inference/inconsistent_inheritance_test.dart
@@ -16,7 +16,7 @@
     Object y = x;
     String z = x;
     //         ^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'String'.
   }
 }
diff --git a/tests/language/initializing_formal/type_test.dart b/tests/language/initializing_formal/type_test.dart
index 41a9f2a..b1f739d 100644
--- a/tests/language/initializing_formal/type_test.dart
+++ b/tests/language/initializing_formal/type_test.dart
@@ -10,7 +10,7 @@
   A(int this.x) : y = x { // OK.
     int z = x;
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
   }
 }
diff --git a/tests/language/invalid_returns/async_invalid_return_26_test.dart b/tests/language/invalid_returns/async_invalid_return_26_test.dart
index 729e3dc..1fbc602 100644
--- a/tests/language/invalid_returns/async_invalid_return_26_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_26_test.dart
@@ -17,7 +17,7 @@
 Future<int> test() async {
   return v;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'void' can't be returned from an async function with return type 'Future<int>'.
 }
 
diff --git a/tests/language/invalid_returns/async_invalid_return_27_test.dart b/tests/language/invalid_returns/async_invalid_return_27_test.dart
index 4650891..f3fb9f0 100644
--- a/tests/language/invalid_returns/async_invalid_return_27_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_27_test.dart
@@ -16,7 +16,7 @@
 Future<int> test() async {
   return v;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'Future<void>' can't be returned from an async function with return type 'Future<int>'.
 }
 
diff --git a/tests/language/invalid_returns/async_invalid_return_28_test.dart b/tests/language/invalid_returns/async_invalid_return_28_test.dart
index dd02198..d6c195d 100644
--- a/tests/language/invalid_returns/async_invalid_return_28_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_28_test.dart
@@ -16,7 +16,7 @@
 Future<int> test() async {
   return v;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'FutureOr<void>' can't be returned from an async function with return type 'Future<int>'.
 }
 
diff --git a/tests/language/invalid_returns/async_invalid_return_29_test.dart b/tests/language/invalid_returns/async_invalid_return_29_test.dart
index b2c96c0..9c92415 100644
--- a/tests/language/invalid_returns/async_invalid_return_29_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_29_test.dart
@@ -17,7 +17,7 @@
 FutureOr<int> test() async {
   return v;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'void' can't be returned from an async function with return type 'FutureOr<int>'.
 }
 
diff --git a/tests/language/invalid_returns/async_invalid_return_30_test.dart b/tests/language/invalid_returns/async_invalid_return_30_test.dart
index b8e09b5..c97fd4f 100644
--- a/tests/language/invalid_returns/async_invalid_return_30_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_30_test.dart
@@ -16,7 +16,7 @@
 FutureOr<int> test() async {
   return v;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'Future<void>' can't be returned from an async function with return type 'FutureOr<int>'.
 }
 
diff --git a/tests/language/invalid_returns/async_invalid_return_31_test.dart b/tests/language/invalid_returns/async_invalid_return_31_test.dart
index f35985b..2470925 100644
--- a/tests/language/invalid_returns/async_invalid_return_31_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_31_test.dart
@@ -16,7 +16,7 @@
 FutureOr<int> test() async {
   return v;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'FutureOr<void>' can't be returned from an async function with return type 'FutureOr<int>'.
 }
 
diff --git a/tests/language/least_upper_bound/expansive_test.dart b/tests/language/least_upper_bound/expansive_test.dart
index 21663df..78276e5 100644
--- a/tests/language/least_upper_bound/expansive_test.dart
+++ b/tests/language/least_upper_bound/expansive_test.dart
@@ -42,37 +42,37 @@
     // Is least upper bound dynamic?
     (z ? a : b).z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'z' isn't defined for the class 'Object'.
 
     // Is least upper bound N<...> ?
     (z ? a : b).n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound C1<...> ?
     (z ? a : b).c1;
     //          ^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c1' isn't defined for the class 'Object'.
 
     // Is least upper bound N<dynamic> ?
     (z ? a : b).n.z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<N<...>> ?
     (z ? a : b).n.n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<C1<...>> ?
     (z ? a : b).n.c1;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
   }
 }
@@ -106,37 +106,37 @@
     // Is least upper bound dynamic?
     (z ? a : b).z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'z' isn't defined for the class 'Object'.
 
     // Is least upper bound N<...> ?
     (z ? a : b).n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound C2<...> ?
     (z ? a : b).c2;
     //          ^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c2' isn't defined for the class 'Object'.
 
     // Is least upper bound N<dynamic> ?
     (z ? a : b).n.z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<N<...>> ?
     (z ? a : b).n.n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<C2<...>> ?
     (z ? a : b).n.c2;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
   }
 }
diff --git a/tests/language/least_upper_bound/least_upper_bound_test.dart b/tests/language/least_upper_bound/least_upper_bound_test.dart
index eaf0697..562aca3 100644
--- a/tests/language/least_upper_bound/least_upper_bound_test.dart
+++ b/tests/language/least_upper_bound/least_upper_bound_test.dart
@@ -45,21 +45,21 @@
 void testAB(A a, B b) {
   A r1 = true ? a : b;
   //     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'A'.
   B r2 = false ? a : b;
   //     ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
   (true ? a : b).a = 0;
   //             ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'a' isn't defined for the class 'Object'.
   (false ? a : b).b = 0;
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'b' isn't defined for the class 'Object'.
   var c = new C();
   (true ? a as dynamic : c).a = 0;
@@ -70,13 +70,13 @@
   B r1 = true ? b : c;
   C r2 = false ? b : c;
   //     ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
   (true ? b : c).b = 0;
   (false ? b : c).c = 0;
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'c' isn't defined for the class 'B'.
   var a = null;
   (true ? b : a).b = 0;
@@ -88,23 +88,23 @@
 void testCD(C c, D d) {
   C r1 = true ? c : d;
   //     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
   D r2 = false ? c : d;
   //     ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'B' can't be assigned to a variable of type 'D'.
   (true ? c : d).b = 0;
   (false ? c : d).b = 0;
   (true ? c : d).c = 0;
   //             ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'c' isn't defined for the class 'B'.
   (false ? c : d).d = 0;
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'd' isn't defined for the class 'B'.
 }
 
@@ -113,17 +113,17 @@
   E<B> r1 = true ? e : f;
   F<C> r2 = false ? e : f;
   //        ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //              ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'F<C>'.
   A r3 = true ? e : f;
   //     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
   B r4 = false ? e : f;
   //     ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
   (true ? e : f).e = C();
@@ -135,23 +135,23 @@
   E<B> r1 = true ? e : f;
   F<C> r2 = false ? e : f;
   //        ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //              ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'F<C>'.
   A r3 = true ? e : f;
   //     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
   B r4 = false ? e : f;
   //     ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
   var r5;
   r5 = (true ? e : f).e;
   r5 = (false ? e : f).f;
   //                   ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'f' isn't defined for the class 'E<B>'.
 }
diff --git a/tests/language/malformed/inheritance_test.dart b/tests/language/malformed/inheritance_test.dart
index 55154d7..8eed858 100644
--- a/tests/language/malformed/inheritance_test.dart
+++ b/tests/language/malformed/inheritance_test.dart
@@ -18,7 +18,7 @@
 class C1
     extends A<Unresolved>
     //        ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -36,7 +36,7 @@
 class C3
     extends Object with A<Unresolved>
     //                    ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -52,7 +52,7 @@
 class C5
     implements A<Unresolved>
     //           ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -63,7 +63,7 @@
     // [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //      ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     {
 }
 
@@ -73,9 +73,9 @@
     // [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //      ^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     //        ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -88,7 +88,7 @@
     // [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //                  ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     {
 }
 
@@ -100,9 +100,9 @@
     // [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //                  ^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     //                    ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -113,7 +113,7 @@
     // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //         ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     {
 }
 
@@ -123,9 +123,9 @@
     // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //         ^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     //           ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
diff --git a/tests/language/malformed/malformed_test.dart b/tests/language/malformed/malformed_test.dart
index b8345e5..e4b59a9 100644
--- a/tests/language/malformed/malformed_test.dart
+++ b/tests/language/malformed/malformed_test.dart
@@ -29,25 +29,25 @@
 checkIsListUnresolved(var v) {
   v is List<Unresolved>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v is List<Unresolved<int>>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v is List<prefix.Unresolved>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v is List<prefix.Unresolved<int>>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v is List<int, String>;
   //   ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
 }
 
@@ -75,25 +75,25 @@
 checkAsListUnresolved(var v) {
   v as List<Unresolved>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v as List<Unresolved<int>>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v as List<prefix.Unresolved>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v as List<prefix.Unresolved<int>>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v as List<int, String>;
   //   ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
 }
 
diff --git a/tests/language/map/literal13_test.dart b/tests/language/map/literal13_test.dart
index ec5e0be..08f06e4 100644
--- a/tests/language/map/literal13_test.dart
+++ b/tests/language/map/literal13_test.dart
@@ -7,7 +7,7 @@
 main() {
   var map = new Map<int>{ "a": 1, "b": 2, "c": 3 };
   //            ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 2 type arguments.
   //                   ^
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language/mixin/illegal_static_access_test.dart b/tests/language/mixin/illegal_static_access_test.dart
index 21e2348..8cd792d 100644
--- a/tests/language/mixin/illegal_static_access_test.dart
+++ b/tests/language/mixin/illegal_static_access_test.dart
@@ -20,10 +20,10 @@
 
   Expect.throwsNoSuchMethodError(() => C.foo());
   //                                     ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.foo'.
   Expect.throwsNoSuchMethodError(() => C.bar());
   //                                     ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.bar'.
 }
diff --git a/tests/language/mixin/illegal_super_use_test.dart b/tests/language/mixin/illegal_super_use_test.dart
index 89c3a76..ca47645 100644
--- a/tests/language/mixin/illegal_super_use_test.dart
+++ b/tests/language/mixin/illegal_super_use_test.dart
@@ -11,22 +11,22 @@
     super.toString();
     super.foo();
     //    ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
     // [cfe] Superclass has no method named 'foo'.
     super.bar = 100;
     //    ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
     // [cfe] Superclass has no setter named 'bar'.
 
     void inner() {
       super.toString();
       super.foo();
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
       // [cfe] Superclass has no method named 'foo'.
       super.bar = 100;
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
       // [cfe] Superclass has no setter named 'bar'.
     }
     inner();
@@ -35,11 +35,11 @@
       super.toString();
       super.foo();
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
       // [cfe] Superclass has no method named 'foo'.
       super.bar = 100;
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
       // [cfe] Superclass has no setter named 'bar'.
     })();
 
diff --git a/tests/language/mixin/type_parameters_errors_test.dart b/tests/language/mixin/type_parameters_errors_test.dart
index 2988b2f..25e99b6 100644
--- a/tests/language/mixin/type_parameters_errors_test.dart
+++ b/tests/language/mixin/type_parameters_errors_test.dart
@@ -11,11 +11,11 @@
 //    ^
 // [cfe] The type 'M<U, V>' can't be mixed in.
 //                           ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 class C<A, B> extends S<A, int> with M { }
 //                    ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 
 class F<X> = S<X> with M<X>;
@@ -23,7 +23,7 @@
 //    ^
 // [cfe] The type 'M<double, double>' can't be mixed in.
 //                    ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 
 main() {
@@ -32,11 +32,11 @@
   a = new A<int>();
   a = new A<String, String>();
   //      ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
   a = new F<int>();
   a = new F<int, String>();
   //      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
 }
diff --git a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
index 695dfa3..a0bdcf7 100644
--- a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
+++ b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
@@ -56,141 +56,141 @@
     // Check that values of type `Null` are not usable as booleans.
     if (nil) {}
     //  ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     [if (nil) 3];
     //   ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     nil ? 3 : 4;
 //  ^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     while (nil) {}
     //     ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     do {} while (nil);
     //           ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     nil || true;
 //  ^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     nil && true;
 //  ^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     true || nil;
     //      ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     true && nil;
     //      ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     for (int i = 0; nil; i++) {}
     //              ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
     [for (int i = 0; nil; i++) 3];
     //               ^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
   }
   {
     // Check that values of type `Object` are not usable as booleans.
     if (object) {}
     //  ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     [if (object) 3];
     //   ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     object ? 3 : 4;
 //  ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     while (object) {}
     //     ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     do {} while (object);
     //           ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     object || true;
 //  ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     object && true;
 //  ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     true || object;
     //      ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     true && object;
     //      ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     for (int i = 0; object; i++) {}
     //              ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
     [for (int i = 0; object; i++) 3];
     //               ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
   }
   {
     // Check that values of type `Object?` are not usable as booleans.
     if (objectOrNull) {}
     //  ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     [if (objectOrNull) 3];
     //   ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     objectOrNull ? 3 : 4;
 //  ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     while (objectOrNull) {}
     //     ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     do {} while (objectOrNull);
     //           ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     objectOrNull || true;
 //  ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     objectOrNull && true;
 //  ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
 // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     true || objectOrNull;
     //      ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     true && objectOrNull;
     //      ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     for (int i = 0; objectOrNull; i++) {}
     //              ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
     [for (int i = 0; objectOrNull; i++) 3];
     //               ^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+    // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
     // [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
   }
 }
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_in_order_error_test.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_in_order_error_test.dart
new file mode 100644
index 0000000..2efea2d
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_in_order_error_test.dart
@@ -0,0 +1,332 @@
+// 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.
+
+// Requirements=nnbd-weak
+
+// @dart = 2.8
+
+// Test that upper bound computations which rely on the computations of the
+// cardinality of the superinterface sets define those sets using
+// `LEGACY_ERASURE` when called from an opted out library.
+
+import 'superinterfaces_null_safe_lib.dart';
+import 'superinterfaces_legacy_lib.dart';
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int*>}, {Root} (due to LEGACY_ERASURE)
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Generic<int*>}.
+/// As a result, the upper bound of `Legacy()` and `NonNullable()` should
+/// be computed as `Generic<int*>`.
+void testLegacyNonNullable(bool b) {
+  // Test in the presence of a downward context
+  {
+    Generic<int> x0 = b ? Legacy() : NonNullable();
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? Legacy() : NonNullable())..genericMethod();
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? Legacy() : NonNullable())..legacyMethod();
+    //                                                ^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? Legacy() : NonNullable())..nonNullableMethod();
+    //                                                ^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test without a context
+  {
+    var x = b ? Legacy() : NonNullable();
+
+    // x is inferred to be Generic<int>
+    x.genericMethod().isEven;
+
+    // x is not inferred to be Generic<dynamic>
+    x.genericMethod().isVeryOdd;
+    //                ^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test using instances
+
+  // Test in the presence of a downward context
+  {
+    Generic<int> x0 = b ? legacy : nonNullable;
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? legacy : nonNullable)..genericMethod();
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? legacy : nonNullable)..legacyMethod();
+    //  ^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? legacy : nonNullable)..nonNullableMethod();
+    //  ^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test without a context
+  {
+    var x = b ? legacy : nonNullable;
+
+    // x is inferred to be Generic<int>
+    x.genericMethod().isEven;
+
+    // x is not inferred to be Generic<dynamic>
+    x.genericMethod().isVeryOdd;
+    //                ^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+}
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int*>}, {Root} (due to LEGACY_ERASURE)
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Generic<int*>}.
+/// As a result, the upper bound of `Legacy()` and `Nullable()` should
+/// be computed as `Generic<int*>`.
+void testLegacyNullable(bool b) {
+  // Test in the presence of a downward context
+  {
+    Generic<int> x0 = b ? Legacy() : Nullable();
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? Legacy() : Nullable())..genericMethod();
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? Legacy() : Nullable())..legacyMethod();
+    //                                             ^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // The type of the conditional is not inferred as Nullable, nor dynamic
+    Generic<int> x3 = (b ? Legacy() : Nullable())..nullableMethod();
+    //                                             ^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test without a context
+  {
+    var x = b ? Legacy() : Nullable();
+
+    // x is inferred to be Generic<int>
+    x.genericMethod().isEven;
+
+    // x is not inferred to be Generic<dynamic>
+    x.genericMethod().isVeryOdd;
+    //                ^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test using instances
+
+  // Test in the presence of a downward context
+  {
+    Generic<int> x0 = b ? legacy : nullable;
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? legacy : nullable)..genericMethod();
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? legacy : nullable)..legacyMethod();
+    //                                                         ^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // The type of the conditional is not inferred as Nullable, nor dynamic
+    Generic<int> x3 = (b ? legacy : nullable)..nullableMethod();
+    //                                                         ^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test without a context
+  {
+    var x = b ? legacy : nullable;
+
+    // x is inferred to be Generic<int>
+    x.genericMethod().isEven;
+
+    // x is not inferred to be Generic<dynamic>
+    x.genericMethod().isVeryOdd;
+    //                ^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+}
+
+/// Test that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int*>}, {Root} (due to LEGACY_ERASURE)
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Generic<int*>}.
+/// As a result, the upper bound of `Nullable()` and `NonNullable()` should
+/// be computed as `Generic<int*>`.
+void testNullableNonNullable(bool b) {
+  // Test in the presence of a downward context
+  {
+    Generic<int> x0 = b ? Nullable() : NonNullable();
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? Nullable() : NonNullable())..genericMethod();
+
+    // The type of the conditional not inferred as Nullable, nor dynamic
+    Generic<int> x2 = (b ? Nullable() : NonNullable())..nullableMethod();
+    //                                                  ^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? Nullable() : NonNullable())..nonNullableMethod();
+    //                                                  ^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test without a context
+  {
+    var x = b ? Nullable() : NonNullable();
+
+    // x is inferred to be Generic<int>
+    x.genericMethod().isEven;
+
+    // x is not inferred to be Generic<dynamic>
+    x.genericMethod().isVeryOdd;
+    //                ^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test using instances
+
+  // Test in the presence of a downward context
+  {
+    Generic<int> x0 = b ? nullable : nonNullable;
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? nullable : nonNullable)..genericMethod();
+
+    // The type of the conditional not inferred as Nullable, nor dynamic
+    Generic<int> x2 = (b ? nullable : nonNullable)..nullableMethod();
+    //  ^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? nullable : nonNullable)..nonNullableMethod();
+    //  ^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+
+  // Test without a context
+  {
+    var x = b ? nullable : nonNullable;
+
+    // x is inferred to be Generic<int>
+    x.genericMethod().isEven;
+
+    // x is not inferred to be Generic<dynamic>
+    x.genericMethod().isVeryOdd;
+    //                ^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] unspecified
+    // [cfe] unspecified
+  }
+}
+
+void main() {
+  testLegacyNonNullable(true);
+  testLegacyNullable(true);
+  testNullableNonNullable(true);
+}
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_legacy_lib.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_legacy_lib.dart
new file mode 100644
index 0000000..7372893
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_legacy_lib.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// @dart = 2.8
+
+// This library creates a legacy class which extends the generic class hierarchy
+// defined in the imported library.  This is used to test how upper bounds
+// behave when some super-interfaces come from opted in libraries and some from
+// legacy libraries.
+
+import 'superinterfaces_null_safe_lib.dart';
+
+class Legacy extends Generic<int> {
+  int legacyMethod() => 3;
+}
+
+var legacy = Legacy();
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart
new file mode 100644
index 0000000..93e4ad2
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// @dart = 2.10
+
+// This library establishes an opted in class hierarchy which has a single
+// non-generic top element, with a generic element below it, and a null safety
+// specific instantantiation of the generic below that.  This is used to test
+// how upper bounds behave when some super-interfaces come from opted in
+// libraries and some from legacy libraries.
+
+class Root {
+  Object? rootMethod() => 3;
+}
+
+class Generic<T> extends Root {
+  T genericMethod() => throw "Unreachable";
+}
+
+class NonNullable extends Generic<int> {
+  int nonNullableMethod() => 3;
+}
+
+class Nullable extends Generic<int?> {
+  int nullableMethod() => 3;
+}
+
+var nonNullable = NonNullable();
+var nullable = Nullable();
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart
new file mode 100644
index 0000000..50e53c2
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart
@@ -0,0 +1,455 @@
+// 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.
+
+// Requirements=nnbd-weak
+
+// @dart = 2.10
+
+// Test that upper bound computations which rely on the computations of the
+// cardinality of the superinterface sets define those sets without erasing or
+// modifying the superinterfaces.
+
+import 'superinterfaces_legacy_lib.dart';
+import 'superinterfaces_null_safe_lib.dart';
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Root}.
+/// As a result, the upper bound of `Legacy()` and `NonNullable()` should
+/// be computed as `Root`.
+void testLegacyNonNullable(bool b) {
+  // Test in the presence of a downward context
+  {
+    // The type of the conditional is not Generic
+    Generic<int> x0 = b ? Legacy() : NonNullable();
+    //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                  ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+    // The type of the conditional is not inferred as Generic
+    Generic<int> x1 = (b ? Legacy() : NonNullable())..genericMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                                ^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? Legacy() : NonNullable())..legacyMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                                ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? Legacy() : NonNullable())..nonNullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                                ^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+  }
+
+  // Test without a context
+  {
+    var x = b ? Legacy() : NonNullable();
+
+    // x is inferred to be Root
+    x.rootMethod();
+
+    // x is not inferred to be Generic
+    x.genericMethod();
+    //^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+  }
+
+  // Test using instances
+
+  // Test in the presence of a downward context
+  {
+    // The type of the conditional is not Generic
+    Generic<int> x0 = b ? legacy : nonNullable;
+    //                ^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                  ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+    // The type of the conditional is not inferred as Generic
+    Generic<int> x1 = (b ? legacy : nonNullable)..genericMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                            ^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? legacy : nonNullable)..legacyMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                            ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? legacy : nonNullable)..nonNullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                            ^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+
+  }
+
+  // Test without a context
+  {
+    var x = b ? legacy : nonNullable;
+
+    // x is inferred to be Root
+    x.rootMethod();
+
+    // x is not inferred to be Generic
+    x.genericMethod();
+    //^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+  }
+}
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int?>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Root}.
+/// As a result, the upper bound of `Legacy()` and `Nullable()` should
+/// be computed as `Root`.
+void testLegacyNullable(bool b) {
+  // Test in the presence of a downward context
+  {
+    // The type of the conditional is not Generic
+    Generic<int> x0 = b ? Legacy() : Nullable();
+    //                ^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                  ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+    // The type of the conditional is not inferred as Generic
+    Generic<int> x1 = (b ? Legacy() : Nullable())..genericMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                             ^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? Legacy() : Nullable())..legacyMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                             ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional is not inferred as Nullable, nor dynamic
+    Generic<int> x3 = (b ? Legacy() : Nullable())..nullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                             ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+  }
+
+  // Test without a context
+  {
+    var x = b ? Legacy() : Nullable();
+
+    // x is inferred to be Root
+    x.rootMethod();
+
+    // x is not inferred to be Generic
+    x.genericMethod();
+    //^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+  }
+
+  // Test using instances
+
+  // Test in the presence of a downward context
+  {
+    // The type of the conditional is not Generic
+    Generic<int> x0 = b ? legacy : nullable;
+    //                ^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                  ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+    // The type of the conditional is not inferred as Generic
+    Generic<int> x1 = (b ? legacy : nullable)..genericMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                         ^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional not inferred as Legacy, nor dynamic
+    Generic<int> x2 = (b ? legacy : nullable)..legacyMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                         ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional is not inferred as Nullable, nor dynamic
+    Generic<int> x3 = (b ? legacy : nullable)..nullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                         ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+  }
+
+  // Test without a context
+  {
+    var x = b ? legacy : nullable;
+
+    // x is inferred to be Root
+    x.rootMethod();
+
+    // x is not inferred to be Generic
+    x.genericMethod();
+    //^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Legacy, nor dynamic
+    x.legacyMethod();
+    //^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+  }
+}
+
+/// Test that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int?>}, {Root}
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Root}.
+/// As a result, the upper bound of `Nullable()` and `NonNullable()` should
+/// be computed as `Root`.
+void testNullableNonNullable(bool b) {
+  // Test in the presence of a downward context
+  {
+    // The type of the conditional is not Generic
+    Generic<int> x0 = b ? Nullable() : NonNullable();
+    //                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                  ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? Nullable() : NonNullable())..genericMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                                  ^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional not inferred as Nullable, nor dynamic
+    Generic<int> x2 = (b ? Nullable() : NonNullable())..nullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                                  ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? Nullable() : NonNullable())..nonNullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                                  ^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+
+  }
+
+  // Test without a context
+  {
+    var x = b ? Nullable() : NonNullable();
+
+    // x is inferred to be Root
+    x.rootMethod();
+
+    // x is not inferred to be Generic, nor dynamic
+    x.genericMethod();
+    //^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+  }
+
+  // Test using instances
+
+  // Test in the presence of a downward context
+  {
+    // The type of the conditional is not Generic
+    Generic<int> x0 = b ? nullable : nonNullable;
+    //                ^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                  ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+    // The type of the conditional is Generic<int>
+    Generic<int> x1 = (b ? nullable : nonNullable)..genericMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                              ^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional not inferred as Nullable, nor dynamic
+    Generic<int> x2 = (b ? nullable : nonNullable)..nullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                              ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+    // The type of the conditional is not inferred as NonNullable, nor dynamic
+    Generic<int> x3 = (b ? nullable : nonNullable)..nonNullableMethod();
+    //                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //                   ^
+    // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+    //                                              ^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+
+  }
+
+  // Test without a context
+  {
+    var x = b ? nullable : nonNullable;
+
+    // x is inferred to be Root
+    x.rootMethod();
+
+    // x is not inferred to be Generic, nor dynamic
+    x.genericMethod();
+    //^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as Nullable, nor dynamic
+    x.nullableMethod();
+    //^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+    // x is not inferred as NonNullable, nor dynamic
+    x.nonNullableMethod();
+    //^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+    // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+  }
+}
+
+void main() {
+  testLegacyNonNullable(true);
+  testLegacyNullable(true);
+  testNullableNonNullable(true);
+}
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart
index fe6c7db..c7aaf26 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart
@@ -21,7 +21,7 @@
   // to `int`.
   x.isEven;
 //  ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] unspecified
 }
 
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart
index e5b9c32..8cd5ce7 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart
@@ -21,7 +21,7 @@
   // promoted to `int`.
   x.isEven;
 //  ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] unspecified
 }
 
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart
index b76136c..4687597 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart
@@ -18,7 +18,7 @@
   // Since the `y is Never?` branch was reachable, `x` is not promoted to `int`.
   x.isEven;
 //  ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] unspecified
 }
 
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart
index 2f7e690..aa97c73 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart
@@ -19,7 +19,7 @@
   // Since the read of `y` was reachable, `x` is not promoted to `int`.
   x.isEven;
 //  ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] unspecified
 }
 
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart
index bd76d00..7fd85a5 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart
@@ -15,7 +15,7 @@
       // an int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
       x = 0;
     };
@@ -31,7 +31,7 @@
       // an int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
       x = 0;
     }
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart
index 646649d..9df5cad 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart
@@ -14,7 +14,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
     }
   }
@@ -29,7 +29,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
     }
   }
@@ -44,7 +44,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
       x = 0;
     }
@@ -60,7 +60,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
       x = 0;
     }
@@ -76,7 +76,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
     }
   }
@@ -91,7 +91,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
       x = 0;
     }
@@ -107,7 +107,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
     } while ((x = 0) == 0);
   }
@@ -122,7 +122,7 @@
       // int at the time de-promotion occurs.
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
       x = 0;
     } while (true);
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart
index 9d96b15..ee60537 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart
@@ -19,7 +19,7 @@
         // int at the time de-promotion occurs.
         print(x.isEven);
         //      ^^^^^^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
         x = 0;
         break;
@@ -40,7 +40,7 @@
         // int at the time de-promotion occurs.
         print(x.isEven);
         //      ^^^^^^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
         x = 0;
         break;
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart
index 8f89bdf..6368e1d 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart
@@ -18,7 +18,7 @@
       // account for RHS types)
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
     }
   }
@@ -36,7 +36,7 @@
       // account for RHS types)
       print(x.isEven);
       //      ^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'isEven' isn't defined for the class 'Object'.
     }
   }
diff --git a/tests/language/nnbd/is_type_test/null_is_test.dart b/tests/language/nnbd/is_type_test/null_is_test.dart
new file mode 100644
index 0000000..d3a9f22
--- /dev/null
+++ b/tests/language/nnbd/is_type_test/null_is_test.dart
@@ -0,0 +1,36 @@
+// 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';
+
+// Type tests (is checks) located in a null safe library.
+main() {
+  Expect.isFalse(null is Never);
+  Expect.isTrue(null is Never?);
+  Expect.isTrue(null is Null);
+  Expect.isFalse(null is Object);
+  Expect.isTrue(null is Object?);
+  Expect.isTrue(null is dynamic);
+
+  // Testing all built in types because of a regression that caused them to be
+  // handled differently https://github.com/dart-lang/sdk/issues/42851.
+  Expect.isFalse(null is bool);
+  Expect.isTrue(null is bool?);
+  Expect.isFalse(null is num);
+  Expect.isTrue(null is num?);
+  Expect.isFalse(null is int);
+  Expect.isTrue(null is int?);
+  Expect.isFalse(null is double);
+  Expect.isTrue(null is double?);
+  Expect.isFalse(null is String);
+  Expect.isTrue(null is String?);
+  Expect.isFalse(null is List);
+  Expect.isTrue(null is List?);
+  Expect.isFalse(null is Set);
+  Expect.isTrue(null is Set?);
+  Expect.isFalse(null is Map);
+  Expect.isTrue(null is Map?);
+  Expect.isFalse(null is Symbol);
+  Expect.isTrue(null is Symbol?);
+}
diff --git a/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart b/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
index ddf79bd..9a92566 100644
--- a/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
+++ b/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
@@ -18,13 +18,48 @@
   // `null is Never?`
   Expect.isTrue(legacyIsNullable<Never>(null));
   Expect.isTrue(null is Null);
-  // `null is int*`
-  Expect.isFalse(null is int);
-  // `null is int?`
-  Expect.isTrue(legacyIsNullable<int>(null));
   // `null is Object*`
   Expect.isTrue(null is Object);
   // `null is Object?`
   Expect.isTrue(legacyIsNullable<Object>(null));
   Expect.isTrue(null is dynamic);
+
+  // Testing all built in types because of a regression that caused them to be
+  // handled differently https://github.com/dart-lang/sdk/issues/42851.
+  // `null is bool*`
+  Expect.isFalse(null is bool);
+  // `null is bool?`
+  Expect.isTrue(legacyIsNullable<bool>(null));
+  // `null is num*`
+  Expect.isFalse(null is num);
+  // `null is num?`
+  Expect.isTrue(legacyIsNullable<num>(null));
+  // `null is int*`
+  Expect.isFalse(null is int);
+  // `null is int?`
+  Expect.isTrue(legacyIsNullable<int>(null));
+  // `null is double*`
+  Expect.isFalse(null is double);
+  // `null is double?`
+  Expect.isTrue(legacyIsNullable<double>(null));
+  // `null is String*`
+  Expect.isFalse(null is String);
+  // `null is String?`
+  Expect.isTrue(legacyIsNullable<String>(null));
+  // `null is List*`
+  Expect.isFalse(null is List);
+  // `null is List?
+  Expect.isTrue(legacyIsNullable<List>(null));
+  // `null is Set*`
+  Expect.isFalse(null is Set);
+  // `null is Set?
+  Expect.isTrue(legacyIsNullable<Set>(null));
+  // `null is Map*`
+  Expect.isFalse(null is Map);
+  // `null is Map?
+  Expect.isTrue(legacyIsNullable<Map>(null));
+  // `null is Symbol*`
+  Expect.isFalse(null is Symbol);
+  // `null is Symbol?
+  Expect.isTrue(legacyIsNullable<Symbol>(null));
 }
diff --git a/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart b/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
index 3721c69..a126342 100644
--- a/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
+++ b/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
@@ -15,13 +15,48 @@
   Expect.isTrue(nullSafeIsLegacy<Never>(null));
   Expect.isTrue(null is Never?);
   Expect.isTrue(null is Null);
-  Expect.isFalse(null is int);
-  // `null is int*`
-  Expect.isFalse(nullSafeIsLegacy<int>(null));
-  Expect.isTrue(null is int?);
   Expect.isFalse(null is Object);
   // `null is Object*`
   Expect.isTrue(nullSafeIsLegacy<Object>(null));
   Expect.isTrue(null is Object?);
   Expect.isTrue(null is dynamic);
+
+  // Testing all built in types because of a regression that caused them to be
+  // handled differently https://github.com/dart-lang/sdk/issues/42851.
+  Expect.isFalse(null is bool);
+  // `null is bool*`
+  Expect.isFalse(nullSafeIsLegacy<bool>(null));
+  Expect.isTrue(null is bool?);
+  Expect.isFalse(null is num);
+  // `null is num*`
+  Expect.isFalse(nullSafeIsLegacy<num>(null));
+  Expect.isTrue(null is num?);
+  Expect.isFalse(null is int);
+  // `null is int*`
+  Expect.isFalse(nullSafeIsLegacy<int>(null));
+  Expect.isTrue(null is int?);
+  Expect.isFalse(null is double);
+  // `null is double*`
+  Expect.isFalse(nullSafeIsLegacy<double>(null));
+  Expect.isTrue(null is double?);
+  Expect.isFalse(null is String);
+  // `null is String*`
+  Expect.isFalse(nullSafeIsLegacy<String>(null));
+  Expect.isTrue(null is String?);
+  Expect.isFalse(null is List);
+  // `null is List*`
+  Expect.isFalse(nullSafeIsLegacy<List>(null));
+  Expect.isTrue(null is List?);
+  Expect.isFalse(null is Set);
+  // `null is Set*`
+  Expect.isFalse(nullSafeIsLegacy<Set>(null));
+  Expect.isTrue(null is Set?);
+  Expect.isFalse(null is Map);
+  // `null is Map*`
+  Expect.isFalse(nullSafeIsLegacy<Map>(null));
+  Expect.isTrue(null is Map?);
+  Expect.isFalse(null is Symbol);
+  // `null is Symbol*`
+  Expect.isFalse(nullSafeIsLegacy<Symbol>(null));
+  Expect.isTrue(null is Symbol?);
 }
diff --git a/tests/language/nnbd/static_errors/local_function_inference.dart b/tests/language/nnbd/static_errors/local_function_inference.dart
index 9cb6a37..af81145 100644
--- a/tests/language/nnbd/static_errors/local_function_inference.dart
+++ b/tests/language/nnbd/static_errors/local_function_inference.dart
@@ -12,7 +12,7 @@
 
   f().arglebargle;
   //  ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
   f().isEven; // Inferred type is int
 
diff --git a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
index 2229199..d06b113 100644
--- a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
+++ b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
@@ -31,7 +31,7 @@
   // [analyzer] SYNTACTIC_ERROR.MODIFIER_OUT_OF_ORDER
   // [cfe] The modifier 'late' should be before the modifier 'final'.
   //                        ^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 
   covariant late x15;
   //        ^^^^
diff --git a/tests/language/nnbd/try_catch/default_catch_type_error_test.dart b/tests/language/nnbd/try_catch/default_catch_type_error_test.dart
index 73b3b94..03017a6 100644
--- a/tests/language/nnbd/try_catch/default_catch_type_error_test.dart
+++ b/tests/language/nnbd/try_catch/default_catch_type_error_test.dart
@@ -6,7 +6,7 @@
   try {} catch (error) {
     error.notAMethodOnObject();
     //    ^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
     // [cfe] The method 'notAMethodOnObject' isn't defined for the class 'Object'.
     _takesObject(error);
   }
diff --git a/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart b/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart
index d54b522..0906219 100644
--- a/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart
+++ b/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart
@@ -40,18 +40,18 @@
       // x still has type C<String>
       x.dMethod1("hello");
       //^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'dMethod1' isn't defined for the class 'C<String>'.
       x.dMethod2(3);
       //^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'dMethod2' isn't defined for the class 'C<String>'.
 
       var t0 = x.cMethod("hello");
       t0.length;
       t0.arglebargle; // t0 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
 
       // y has type D<String, int>
@@ -59,13 +59,13 @@
       t1.length;
       t1.arglebargle; // t1 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
       var t2 = y.dMethod2(3);
       t2.isEven;
       t2.arglebargle; // t2 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
     }
 
@@ -83,13 +83,13 @@
       t0.length;
       t0.arglebargle; // t0 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
       var t1 = x.dMethod2(3);
       t1.isEven;
       t1.arglebargle; // t1 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
 
       // y has type D<String, int>
@@ -97,13 +97,13 @@
       t2.length;
       t2.arglebargle; // t2 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
       var t3 = y.dMethod2(3);
       t3.isEven;
       t3.arglebargle; // t3 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
     }
 
@@ -118,34 +118,34 @@
       // x has type C<String>, and not D<String, int>
       x.dMethod1("hello");
       //^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'dMethod1' isn't defined for the class 'C<String>'.
       x.dMethod2(3);
       //^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'dMethod2' isn't defined for the class 'C<String>'.
 
       var t0 = x.cMethod("hello");
       t0.length;
       t0.arglebargle; // t0 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
 
       // C<String>, and not D<String, int>
       y.dMethod1("hello");
       //^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'dMethod1' isn't defined for the class 'C<String>'.
       y.dMethod2(3);
       //^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'dMethod2' isn't defined for the class 'C<String>'.
       var t1 = y.cMethod("hello");
       t1.length;
       t1.arglebargle; // t0 is not dynamic
       // ^^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
     }
   }
diff --git a/tests/language/nnbd/typedef/typedef_error_test.dart b/tests/language/nnbd/typedef/typedef_error_test.dart
index f1bed37..17488a5 100644
--- a/tests/language/nnbd/typedef/typedef_error_test.dart
+++ b/tests/language/nnbd/typedef/typedef_error_test.dart
@@ -13,7 +13,7 @@
 void main() {
   F f = null; // typedefs from opted out libraries are treated as non-nullable
   //    ^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
 
   f = takesNonNullable; // F is int* Function(int*)
diff --git a/tests/language/null/checked_null_test.dart b/tests/language/null/checked_null_test.dart
index b4fa1f2..9d57242 100644
--- a/tests/language/null/checked_null_test.dart
+++ b/tests/language/null/checked_null_test.dart
@@ -25,6 +25,6 @@
   // crash.
   new A().a?.foo();
   //         ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'foo' isn't defined for the class 'Map<dynamic, dynamic>'.
 }
diff --git a/tests/language/null_aware/access_test.dart b/tests/language/null_aware/access_test.dart
index deaa991..4ee967e 100644
--- a/tests/language/null_aware/access_test.dart
+++ b/tests/language/null_aware/access_test.dart
@@ -39,7 +39,7 @@
   // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
   { String? s = new C(null)?.v; Expect.equals(null, s); }
   //            ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                ^
   // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
   //                       ^^
@@ -48,12 +48,12 @@
   { h.C.staticInt = 1; int? i = h.C?.staticInt; Expect.equals(1, i); }
   { C.staticInt = null; String? s = C?.staticInt; Expect.equals(null, s); }
   //                                ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                   ^
   // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
   { h.C.staticNullable = null; String? s = h.C?.staticNullable; Expect.equals(null, s); }
   //                                       ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                            ^
   // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
 
@@ -62,11 +62,11 @@
   // generated in the case of e1?.id.
   Expect.equals(null, nullC()?.bad);
   //                           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'bad' isn't defined for the class 'C'.
   { B? b = new C(1); Expect.equals(1, b?.v); }
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'v' isn't defined for the class 'B'.
 
   // '?.' cannot be used to access toplevel properties in libraries imported via
@@ -79,10 +79,10 @@
   // Nor can it be used to access the hashCode getter on the class Type.
   Expect.throwsNoSuchMethodError(() => C?.hashCode);
   //                                      ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'hashCode'.
   Expect.throwsNoSuchMethodError(() => h.C?.hashCode);
   //                                        ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'hashCode'.
 }
diff --git a/tests/language/null_aware/assignment_test.dart b/tests/language/null_aware/assignment_test.dart
index 3627427..79f566c 100644
--- a/tests/language/null_aware/assignment_test.dart
+++ b/tests/language/null_aware/assignment_test.dart
@@ -59,20 +59,20 @@
   // The static type of e1?.v = e2 is the static type of e2.
   { D? d = new D(new E()); G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
   { D? d = new D(new E()); E e = new G(); F? f = (d?.v = e); }
-  //                                             ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                              ^^^^^^^^
+  // [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); }
   { h.D.staticE = new h.E(); h.G g = new h.G(); h.F? f = (h.D?.staticE = g); Expect.identical(f, g); }
   { D.staticE = new E(); E e = new G(); F? f = (D?.staticE = e); }
-  //                                           ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                            ^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                               ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
   { h.D.staticE = new h.E(); h.E e = new h.G(); h.F f = (h.D?.staticE = e); }
-  //                                                    ^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                                     ^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                                          ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
 
@@ -80,13 +80,13 @@
   // also generated in the case of e1?.v = e2.
   Expect.equals(null, nullC()?.bad = bad());
   //                           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'bad' isn't defined for the class 'C'.
   { B b = new C(1); Expect.equals(2, b?.v = 2); }
   //                                  ^^
   // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
   //                                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'v' isn't defined for the class 'B'.
 
   // e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
@@ -110,16 +110,16 @@
   // also generated in the case of e1?.v op= e2.
   nullC()?.bad = bad();
   //       ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'bad' isn't defined for the class 'C'.
   { B b = new C(1); b?.v += 2; }
   //                 ^^
   // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
   //                   ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'v' isn't defined for the class 'B'.
   //                   ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'v' isn't defined for the class 'B'.
   { D d = new D(new E()); F? f = (d?.v += nullC()); }
   //                               ^^
@@ -128,8 +128,8 @@
   // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
   { D d = new D(new E()); H? h = (d?.v += 1); }
-  //                             ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                              ^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                              ^
   // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
   //                               ^^
@@ -143,13 +143,13 @@
   // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
   { D.staticE = new E(); H? h = (D?.staticE += 1); }
-  //                            ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                             ^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
   { h.D.staticE = new h.E(); h.H? hh = (h.D?.staticE += 1); }
-  //                                   ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                    ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                         ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
 
diff --git a/tests/language/null_aware/increment_decrement_test.dart b/tests/language/null_aware/increment_decrement_test.dart
index 1a5ea4e..0b620fc 100644
--- a/tests/language/null_aware/increment_decrement_test.dart
+++ b/tests/language/null_aware/increment_decrement_test.dart
@@ -52,18 +52,18 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE++; Expect.identical(e1, e2); }
   { G g = new G(); D.staticE = g; F? f = D?.staticE++; Expect.identical(f, g); }
   //                                     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                               ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
   { h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE++; Expect.identical(f, g); }
   //                                             ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                                         ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
 
@@ -79,18 +79,18 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE--; Expect.identical(e1, e2); }
   { G g = new G(); D.staticE = g; F? f = D?.staticE--; Expect.identical(f, g); }
   //                                     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                               ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
   { h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE--; Expect.identical(f, g); }
   //                                             ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                                         ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
 
@@ -106,19 +106,19 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { D.staticE = new E(); H? h = ++D?.staticE; Expect.identical(D.staticE, h); }
   //                            ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                 ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
   { h.D.staticE = new h.E(); h.H? hh = ++h.D?.staticE; Expect.identical(h.D.staticE, hh); }
   //                                   ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                          ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
 
@@ -134,19 +134,19 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { D.staticE = new E(); H? h = --D?.staticE; Expect.identical(D.staticE, h); }
   //                            ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                 ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
   { h.D.staticE = new h.E(); h.H? hh = --h.D?.staticE; Expect.identical(h.D.staticE, hh); }
   //                                   ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                          ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
 }
diff --git a/tests/language/null_aware/invocation_test.dart b/tests/language/null_aware/invocation_test.dart
index 58f788b..a1515fa 100644
--- a/tests/language/null_aware/invocation_test.dart
+++ b/tests/language/null_aware/invocation_test.dart
@@ -43,23 +43,23 @@
   { int? i = c?.g(() => 1); Expect.equals(1, i); }
   { String? s = nullC()?.g(bad()); Expect.equals(null, s); }
   //            ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
   { String? s = c?.g(() => null); Expect.equals(null, s); }
   //            ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //            ^
   // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
   { int? i = C?.staticG(() => 1); Expect.equals(1, i); }
   { int? i = h.C?.staticG(() => 1); Expect.equals(1, i); }
   { String? s = C?.staticG(() => null); Expect.equals(null, s); }
   //            ^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
   // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
   { String? s = h.C?.staticG(() => null); Expect.equals(null, s); }
   //            ^^^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                 ^
   // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
 
@@ -68,7 +68,7 @@
   // generated in the case of o?.m(...).
   { B? b = new C(); Expect.equals(1, b?.f(() => 1)); }
   //                                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'f' isn't defined for the class 'B'.
   { int? i = 1; Expect.equals(null, nullC()?.f(i)); }
   //                                           ^
@@ -85,10 +85,10 @@
   // Nor can it be used to access the toString method on the class Type.
   Expect.throwsNoSuchMethodError(() => C?.toString());
   //                                      ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.toString'.
   Expect.throwsNoSuchMethodError(() => h.C?.toString());
   //                                        ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.toString'.
 }
diff --git a/tests/language/number/identifier_test.dart b/tests/language/number/identifier_test.dart
index 7b575c5..d66bf6b 100644
--- a/tests/language/number/identifier_test.dart
+++ b/tests/language/number/identifier_test.dart
@@ -68,7 +68,7 @@
   Expect.equals(1e+2, 1e+2 as double);
   Expect.throwsNoSuchMethodError(() => 1.e+2);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'e' isn't defined for the class 'int'.
   1d;
 //^
@@ -86,11 +86,11 @@
 // [cfe] Getter not found: 'D'.
   Expect.throwsNoSuchMethodError(() => 1.d+2);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'int'.
   Expect.throwsNoSuchMethodError(() => 1.D+2);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'D' isn't defined for the class 'int'.
   1.1d;
 //^^^
diff --git a/tests/language/operator/number_operator_error_test.dart b/tests/language/operator/number_operator_error_test.dart
index fd2ea6e..90e4cf0 100644
--- a/tests/language/operator/number_operator_error_test.dart
+++ b/tests/language/operator/number_operator_error_test.dart
@@ -35,115 +35,115 @@
 
   i += d;
   //   ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //^^
   // [cfe] A value of type 'double' can't be assigned to a variable of type 'int'.
 
   i += n;
   //   ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
 
   i += never;
   //   ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
 
   i += dyn; // type of `i + dyn` is `num`, not assignable to `int`.
   //   ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
 
   ti += i; // Type of expression is `int`, not `I`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'I'.
 
   ti += d; // Type of expression is `num`, not `I`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'double' can't be assigned to a variable of type 'I'.
 
   ti += n; // Type of expression is `num`, not `I`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'I'.
 
   ti += never; // Type of expression is `num`, not `I`.
   //    ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'I'.
 
   ti += dyn; // type of `i + dyn` is `num`, not assignable to `int`.
   //    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'I'.
 
   td += i; // Type of expression is `double`, not `D`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
 
   td += d; // Type of expression is `double`, not `D`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
 
   td += n; // Type of expression is `double`, not `D`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
 
   td += dyn; // Type of expression is `double`, not `D`.
   //    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
 
   td += never; // Type of expression is `double`, not `D`.
   //    ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
 
   tn += i; // Type of expression is `num`, not `N`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
 
   tn += d; // Type of expression is `num`, not `N`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
 
   tn += n; // Type of expression is `num`, not `N`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
 
   tn += dyn; // Type of expression is `num`, not `N`.
   //    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
 
   tn += never; // Type of expression is `num`, not `N`.
   //    ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
 
@@ -153,7 +153,7 @@
     oi1 + d; // Valid
     oi1 += d;
     //     ^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //  ^^
     // [cfe] A value of type 'double' can't be assigned to a variable of type 'O'.
   }
@@ -164,7 +164,7 @@
     oi2 + n; // Valid
     oi2 += n;
     //     ^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //  ^^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
   }
@@ -175,7 +175,7 @@
     oi3 + dyn; // Valid
     oi3 += dyn;
     //     ^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //  ^^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
   }
@@ -186,7 +186,7 @@
     oi4 + never; // Valid.
     oi4 += never;
     //     ^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //  ^^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
   }
@@ -211,13 +211,13 @@
 
   tn += n; // Type of expression is `num`, not `N`.
   //    ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
 
   tn += dyn;
   //    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // ^^
   // [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
 
@@ -226,7 +226,7 @@
     // Promote on1 to O&num.
     on1 += n; // Type of expression is `num`, not `N` or `O`.
     //     ^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //  ^^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
   }
@@ -236,7 +236,7 @@
     // Promote on2 to O&num.
     on2 += dyn; // Type of expression is `num`, not `N` or `O`.
     //     ^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //  ^^
     // [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
   }
diff --git a/tests/language/override/method_with_field_test.dart b/tests/language/override/method_with_field_test.dart
index edd17fd..7d31ba2 100644
--- a/tests/language/override/method_with_field_test.dart
+++ b/tests/language/override/method_with_field_test.dart
@@ -31,7 +31,7 @@
   Expect.equals(42, s.superInstanceMethod());
   Expect.equals(42, sup.superInstanceMethod());
   //                    ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'superInstanceMethod' isn't defined for the class 'Super'.
   Expect.equals(42, sub.superInstanceMethod());
 }
diff --git a/tests/language/prefix/shadow_test.dart b/tests/language/prefix/shadow_test.dart
index 1680b1e..1af4c58 100644
--- a/tests/language/prefix/shadow_test.dart
+++ b/tests/language/prefix/shadow_test.dart
@@ -27,7 +27,7 @@
     var result = 0;
     result = lib10.Library10.static_fld;
     //             ^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'Library10' isn't defined for the class 'int'.
     Expect.equals(4, result);
   }
diff --git a/tests/language/prefix/transitive_import_test.dart b/tests/language/prefix/transitive_import_test.dart
index 582b3e2..ef53584 100644
--- a/tests/language/prefix/transitive_import_test.dart
+++ b/tests/language/prefix/transitive_import_test.dart
@@ -16,6 +16,6 @@
   // Variable should not be visible.
   lib12.top_level11;
   //    ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
   // [cfe] Getter not found: 'top_level11'.
 }
diff --git a/tests/language/private/access_test.dart b/tests/language/private/access_test.dart
index cbfef18..6e10558 100644
--- a/tests/language/private/access_test.dart
+++ b/tests/language/private/access_test.dart
@@ -10,13 +10,13 @@
 main() {
   _function();
 //^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
 // [cfe] Method not found: '_function'.
   private._function();
 //^
 // [cfe] Method not found: '_function'.
 //        ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
   new _Class();
   //  ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
@@ -25,7 +25,7 @@
 //^
 // [cfe] Method not found: '_Class'.
 //        ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
   new Class._constructor();
   //        ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.NEW_WITH_UNDEFINED_CONSTRUCTOR
diff --git a/tests/language/private/member3_test.dart b/tests/language/private/member3_test.dart
index eba3211..557a9e6 100644
--- a/tests/language/private/member3_test.dart
+++ b/tests/language/private/member3_test.dart
@@ -10,7 +10,7 @@
   test() {
     _fun();
 //  ^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
 // [cfe] The method '_fun' isn't defined for the class 'Test'.
   }
 }
diff --git a/tests/language/regress/regress11724_test.dart b/tests/language/regress/regress11724_test.dart
index ddf3925..a408da1 100644
--- a/tests/language/regress/regress11724_test.dart
+++ b/tests/language/regress/regress11724_test.dart
@@ -7,6 +7,6 @@
 void main() {
   method(<int>[]);
 //^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
 // [cfe] Method not found: 'method'.
 }
diff --git a/tests/language/regress/regress1363_test.dart b/tests/language/regress/regress1363_test.dart
index a6cab7b..812e571 100644
--- a/tests/language/regress/regress1363_test.dart
+++ b/tests/language/regress/regress1363_test.dart
@@ -24,7 +24,7 @@
     C contents = myCup.getContents(); // expect no warning or error
     contents = libCup.getContents();
     //         ^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                ^
     // [cfe] A value of type 'C/*1*/' can't be assigned to a variable of type 'C/*2*/'.
   }
diff --git a/tests/language/regress/regress18628_1_test.dart b/tests/language/regress/regress18628_1_test.dart
index 3f2bef3..214f9aa 100644
--- a/tests/language/regress/regress18628_1_test.dart
+++ b/tests/language/regress/regress18628_1_test.dart
@@ -13,7 +13,7 @@
   // line just doesn't make sense without this line.
   T t = int;
   //    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Type' can't be assigned to a variable of type 'T'.
 }
 
diff --git a/tests/language/regress/regress21912_test.dart b/tests/language/regress/regress21912_test.dart
index 6ba343ca5..7d261d3 100644
--- a/tests/language/regress/regress21912_test.dart
+++ b/tests/language/regress/regress21912_test.dart
@@ -19,11 +19,11 @@
       Function2<Function2<int, double>, Function2<int, double>> left) {
     left = t1;
     //     ^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
     left = t2;
     //     ^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
   }
 }
diff --git a/tests/language/regress/regress22976_test.dart b/tests/language/regress/regress22976_test.dart
index 63180f8..de83e9b 100644
--- a/tests/language/regress/regress22976_test.dart
+++ b/tests/language/regress/regress22976_test.dart
@@ -20,7 +20,7 @@
   A<int> a0 = c1;
   A<int> a1 = c2;
   //          ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'C<String, int>' can't be assigned to a variable of type 'A<int>'.
 }
diff --git a/tests/language/regress/regress33479_test.dart b/tests/language/regress/regress33479_test.dart
index 0ede9fb..f1e8336 100644
--- a/tests/language/regress/regress33479_test.dart
+++ b/tests/language/regress/regress33479_test.dart
@@ -19,7 +19,7 @@
 //     ^
 // [cfe] A generic function type can't be used as a type argument.
 //            ^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 //                ^^^^
 // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
 // [cfe] Generic function type 'void Function<TypeY>()' inferred as a type argument.
diff --git a/tests/language/regress/regress34489_test.dart b/tests/language/regress/regress34489_test.dart
index a29cab8..7fba3cb 100644
--- a/tests/language/regress/regress34489_test.dart
+++ b/tests/language/regress/regress34489_test.dart
@@ -9,6 +9,6 @@
 main() {
   new C().field = 'bad';
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'Type'.
 }
diff --git a/tests/language/regress/regress34495_test.dart b/tests/language/regress/regress34495_test.dart
index 41e58bf..2e69b38 100644
--- a/tests/language/regress/regress34495_test.dart
+++ b/tests/language/regress/regress34495_test.dart
@@ -7,7 +7,7 @@
 // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
 // [cfe] Method not found: 'A'.
 //            ^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'B' isn't a type.
 
 main() {}
diff --git a/tests/language/regress/regress35043_test.dart b/tests/language/regress/regress35043_test.dart
index 884f707..d8c1b75 100644
--- a/tests/language/regress/regress35043_test.dart
+++ b/tests/language/regress/regress35043_test.dart
@@ -4,7 +4,7 @@
 
 final foo = Map<int>();
 //          ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 
 main() {}
diff --git a/tests/language/rewrite/implicit_this_test.dart b/tests/language/rewrite/implicit_this_test.dart
index 078dcd2..28adbcf 100644
--- a/tests/language/rewrite/implicit_this_test.dart
+++ b/tests/language/rewrite/implicit_this_test.dart
@@ -20,7 +20,7 @@
   shadow_y_parameter(y) {
         return x + this.y + y;
         //              ^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'y' isn't defined for the class 'Foo'.
   }
 
@@ -28,7 +28,7 @@
     var y = z;
         return x + this.y + y;
         //              ^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'y' isn't defined for the class 'Foo'.
   }
 
@@ -37,7 +37,7 @@
     foo() {
             return x + this.y + y;
             //              ^
-            // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+            // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
             // [cfe] The getter 'y' isn't defined for the class 'Foo'.
     }
     return foo();
@@ -47,7 +47,7 @@
     foo(y) {
             return x + this.y + y;
             //              ^
-            // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+            // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
             // [cfe] The getter 'y' isn't defined for the class 'Foo'.
     }
     return foo(z);
@@ -58,7 +58,7 @@
       var y = z;
             return x + this.y + y;
             //              ^
-            // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+            // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
             // [cfe] The getter 'y' isn't defined for the class 'Foo'.
     }
 
@@ -117,10 +117,10 @@
   shadow_x_toplevel() {
         return x + this.y + toplevel + this.toplevel;
         //              ^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'y' isn't defined for the class 'Foo'.
         //                                  ^^^^^^^^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'toplevel' isn't defined for the class 'Foo'.
   }
 }
diff --git a/tests/language/setter/no_getter_call_test.dart b/tests/language/setter/no_getter_call_test.dart
index 77b06dc..a49d8e4 100644
--- a/tests/language/setter/no_getter_call_test.dart
+++ b/tests/language/setter/no_getter_call_test.dart
@@ -23,7 +23,7 @@
 
   x = topLevel(3);
   //  ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
   // [cfe] Getter not found: 'topLevel'.
   Expect.equals(6, x);
 }
diff --git a/tests/language/setter/no_getter_test.dart b/tests/language/setter/no_getter_test.dart
index f2ea3e3..53c8b58 100644
--- a/tests/language/setter/no_getter_test.dart
+++ b/tests/language/setter/no_getter_test.dart
@@ -17,6 +17,6 @@
   Example ex = new Example();
   print(ex.foo++);
   //       ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'foo' isn't defined for the class 'Example'.
 }
diff --git a/tests/language/static/field1_test.dart b/tests/language/static/field1_test.dart
index e4e1472..7c3c338 100644
--- a/tests/language/static/field1_test.dart
+++ b/tests/language/static/field1_test.dart
@@ -14,7 +14,7 @@
       var foo = new Foo();
       var x = foo.x;
       //          ^
-      // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+      // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
       // [cfe] The getter 'x' isn't defined for the class 'Foo'.
     }
   }
diff --git a/tests/language/static/field1a_test.dart b/tests/language/static/field1a_test.dart
index 9d7f2f2..27a336d 100644
--- a/tests/language/static/field1a_test.dart
+++ b/tests/language/static/field1a_test.dart
@@ -14,7 +14,7 @@
       var foo = new Foo();
       var m = foo.m;
       //          ^
-      // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+      // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
       // [cfe] The getter 'm' isn't defined for the class 'Foo'.
     }
   }
diff --git a/tests/language/static/field3_test.dart b/tests/language/static/field3_test.dart
index 0498f48..f794e68 100644
--- a/tests/language/static/field3_test.dart
+++ b/tests/language/static/field3_test.dart
@@ -21,7 +21,7 @@
     // [cfe] Getter not found: 'm'.
     Foo.m = 1;
     //  ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
     // [cfe] Setter not found: 'm'.
     Foo.x = 1;
     //  ^
diff --git a/tests/language/string/interpolation_test.dart b/tests/language/string/interpolation_test.dart
index 50968b0..2b0f4e5 100644
--- a/tests/language/string/interpolation_test.dart
+++ b/tests/language/string/interpolation_test.dart
@@ -60,7 +60,7 @@
     if (alwaysFalse) {
       "${i.toHorse()}";
       //   ^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'toHorse' isn't defined for the class 'int'.
     }
 
diff --git a/tests/language/string/no_operator_test.dart b/tests/language/string/no_operator_test.dart
index d5d013c..a7eabf7 100644
--- a/tests/language/string/no_operator_test.dart
+++ b/tests/language/string/no_operator_test.dart
@@ -9,23 +9,23 @@
   var y = "y";
   Expect.throws(() => x < y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<' isn't defined for the class 'String'.
   Expect.throws(() => x <= y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<=' isn't defined for the class 'String'.
   Expect.throws(() => x > y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>' isn't defined for the class 'String'.
   Expect.throws(() => x >= y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>=' isn't defined for the class 'String'.
   Expect.throws(() => x - y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '-' isn't defined for the class 'String'.
   Expect.throws(() => x * y);
   //                      ^
@@ -33,42 +33,42 @@
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   Expect.throws(() => x / y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '/' isn't defined for the class 'String'.
   Expect.throws(() => x ~/ y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '~/' isn't defined for the class 'String'.
   Expect.throws(() => x % y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '%' isn't defined for the class 'String'.
   Expect.throws(() => x >> y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>>' isn't defined for the class 'String'.
   Expect.throws(() => x << y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<<' isn't defined for the class 'String'.
   Expect.throws(() => x & y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '&' isn't defined for the class 'String'.
   Expect.throws(() => x | y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '|' isn't defined for the class 'String'.
   Expect.throws(() => x ^ y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '^' isn't defined for the class 'String'.
   Expect.throws(() => -x);
   //                  ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator 'unary-' isn't defined for the class 'String'.
   Expect.throws(() => ~x);
   //                  ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '~' isn't defined for the class 'String'.
 }
diff --git a/tests/language/string/string_test.dart b/tests/language/string/string_test.dart
index 1ab3f92..dfe4447 100644
--- a/tests/language/string/string_test.dart
+++ b/tests/language/string/string_test.dart
@@ -31,7 +31,7 @@
     String a = "Hello";
     a[1] = 12;
 //   ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
 // [cfe] The operator '[]=' isn't defined for the class 'String'.
   }
 
diff --git a/tests/language/super/assign_test.dart b/tests/language/super/assign_test.dart
index bfb2c38..9c09982 100644
--- a/tests/language/super/assign_test.dart
+++ b/tests/language/super/assign_test.dart
@@ -17,6 +17,6 @@
   a.x = 37;
   a.setX(42);
   //^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'setX' isn't defined for the class 'A'.
 }
diff --git a/tests/language/super/conditional_operator_test.dart b/tests/language/super/conditional_operator_test.dart
index c15182d..1c47348 100644
--- a/tests/language/super/conditional_operator_test.dart
+++ b/tests/language/super/conditional_operator_test.dart
@@ -70,7 +70,7 @@
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     !super?.field;
 //   ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_NEGATION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_NEGATION_EXPRESSION
 //        ^^
 // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
 // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
diff --git a/tests/language/symbol/literal_test.dart b/tests/language/symbol/literal_test.dart
index 268b610..976158f 100644
--- a/tests/language/symbol/literal_test.dart
+++ b/tests/language/symbol/literal_test.dart
@@ -46,7 +46,7 @@
   // Tries to call the symbol literal #a.toString
   Expect.throwsNoSuchMethodError(() => #a.toString());
   //                                   ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
   //                                              ^
   // [cfe] The method 'call' isn't defined for the class 'Symbol'.
 }
diff --git a/tests/language/sync_star/generator1_test.dart b/tests/language/sync_star/generator1_test.dart
index 79b294d..ef6bd9b 100644
--- a/tests/language/sync_star/generator1_test.dart
+++ b/tests/language/sync_star/generator1_test.dart
@@ -48,7 +48,7 @@
   // Throws type error: yielded object is not an iterable.
   yield* 3;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'Iterable<dynamic>'.
 }
 
diff --git a/tests/language/this/conditional_operator_runtime_test.dart b/tests/language/this/conditional_operator_runtime_test.dart
index eb56244..cf48394 100644
--- a/tests/language/this/conditional_operator_runtime_test.dart
+++ b/tests/language/this/conditional_operator_runtime_test.dart
@@ -20,9 +20,17 @@
 
   test() {
     this?.field = 1;
+    //  ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.field += 1;
+    //  ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.field;
+    //  ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.method();
+    //  ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
   }
 }
 
diff --git a/tests/language/this/conditional_operator_test.dart b/tests/language/this/conditional_operator_test.dart
index 85060a5..5254ea2 100644
--- a/tests/language/this/conditional_operator_test.dart
+++ b/tests/language/this/conditional_operator_test.dart
@@ -21,7 +21,7 @@
     //^^^^^^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
     // [error line 15, column 11, length 0]
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] Expected '.' before this.
     //    ^^
     // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language/type_object/first_class_types_literals_test.dart b/tests/language/type_object/first_class_types_literals_test.dart
index e8fdca5..663e516 100644
--- a/tests/language/type_object/first_class_types_literals_test.dart
+++ b/tests/language/type_object/first_class_types_literals_test.dart
@@ -54,46 +54,46 @@
   // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
   // [cfe] Can't assign to a type literal.
   //                                       ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   Expect.throwsNoSuchMethodError(() => C++);
   //                                   ^
   // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
   // [cfe] Can't assign to a type literal.
   //                                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   Expect.throwsNoSuchMethodError(() => C + 1);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '+' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => C[2]);
   //                                    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => C[2] = 'hest');
   //                                    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic = 1);
   //                                   ^
   // [cfe] Can't assign to a type literal.
   //                                             ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   Expect.throwsNoSuchMethodError(() => dynamic++);
   //                                   ^
   // [cfe] Can't assign to a type literal.
   //                                          ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   Expect.throwsNoSuchMethodError(() => dynamic + 1);
   //                                           ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '+' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic[2]);
   //                                          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic[2] = 'hest');
   //                                          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'Type'.
 
   Expect.equals((dynamic).toString(), 'dynamic');
diff --git a/tests/language/type_promotion/assign_test.dart b/tests/language/type_promotion/assign_test.dart
index 737a750..74c1322 100644
--- a/tests/language/type_promotion/assign_test.dart
+++ b/tests/language/type_promotion/assign_test.dart
@@ -39,7 +39,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   if (a is B) {
@@ -51,7 +51,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
diff --git a/tests/language/type_promotion/closure_test.dart b/tests/language/type_promotion/closure_test.dart
index 17246dc..7606728 100644
--- a/tests/language/type_promotion/closure_test.dart
+++ b/tests/language/type_promotion/closure_test.dart
@@ -70,7 +70,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -85,7 +85,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     void foo() {
       a = new D();
@@ -94,7 +94,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -109,7 +109,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     void foo() {
       a = new D();
@@ -118,7 +118,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -137,7 +137,7 @@
   if (a is B) {
     func(() => a.b);
     //           ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     print(a.a);
   }
@@ -178,7 +178,7 @@
   if (a is B
       && func(() => a.b)
       //              ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       ) {
     print(a.a);
@@ -190,7 +190,7 @@
   A a = new E();
   var b = a is B ? func(() => a.b) : false;
   //                            ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   a = A();
 }
@@ -220,7 +220,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   a = A();
diff --git a/tests/language/type_promotion/functions_test.dart b/tests/language/type_promotion/functions_test.dart
index 94aee2f..4aecc3b 100644
--- a/tests/language/type_promotion/functions_test.dart
+++ b/tests/language/type_promotion/functions_test.dart
@@ -87,7 +87,7 @@
     b = funcDynToDyn(new B()) as B;
     c = funcDynToDyn(new C());
     //  ^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //              ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
@@ -124,7 +124,7 @@
     b = funcDynToVoid(new B()) as B;
     c = funcDynToVoid(new C());
     //  ^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //               ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
@@ -136,7 +136,7 @@
   b = funcDynToA(new B()) as B;
   c = funcDynToA(new C());
   //  ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //            ^
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
 
@@ -146,7 +146,7 @@
     b = funcDynToA(new B()) as B;
     c = funcDynToA(new C());
     //  ^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //            ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
@@ -157,7 +157,7 @@
     b = funcDynToA(new B()) as B;
     c = funcDynToA(new C());
     //  ^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //            ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
diff --git a/tests/language/type_promotion/local_test.dart b/tests/language/type_promotion/local_test.dart
index c0fe87d..85b0386 100644
--- a/tests/language/type_promotion/local_test.dart
+++ b/tests/language/type_promotion/local_test.dart
@@ -32,15 +32,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is B) {
@@ -48,11 +48,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
 
     if (a is C) {
@@ -61,7 +61,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -69,11 +69,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is C) {
@@ -82,7 +82,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     if (a is B) {
@@ -91,7 +91,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
     if (a is D) {
@@ -100,7 +100,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -109,33 +109,33 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is D) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
@@ -143,15 +143,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   var o1 = a is B
@@ -159,24 +159,24 @@
               '${a.b}'
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -186,20 +186,20 @@
               '${a.c}'
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -207,25 +207,25 @@
           ? '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'D'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'D'.
               '${a.d}'
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -234,11 +234,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is B && a is C) {
@@ -247,7 +247,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is B) {
@@ -256,7 +256,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is D) {
@@ -265,18 +265,18 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is D && a is C) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
diff --git a/tests/language/type_promotion/more_specific_test.dart b/tests/language/type_promotion/more_specific_test.dart
index 21392a3..cf95b4a 100644
--- a/tests/language/type_promotion/more_specific_test.dart
+++ b/tests/language/type_promotion/more_specific_test.dart
@@ -48,7 +48,7 @@
     // No promotion C !<< A.
     x = a.c;
     //    ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'A'.
   }
   B b = new B();
@@ -60,7 +60,7 @@
     // Promotion A << dynamic.
     y = x.b;
     //    ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -78,12 +78,12 @@
     // Promotion: E<A> << D.
     int a = d1.d;
     //      ^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //         ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'int'.
     String b = d1.d;
     //         ^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //            ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'String'.
     x = d1.e;
@@ -94,7 +94,7 @@
     // No promotion: E !<< D<A>
     x = d2.e;
     //     ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'e' isn't defined for the class 'D<A>'.
   }
 
diff --git a/tests/language/type_promotion/multiple_test.dart b/tests/language/type_promotion/multiple_test.dart
index 8410597..21a2f7d 100644
--- a/tests/language/type_promotion/multiple_test.dart
+++ b/tests/language/type_promotion/multiple_test.dart
@@ -36,29 +36,29 @@
   print(a1.a);
   print(a1.b);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a1.c);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a1.d);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   print(a2.a);
   print(a2.b);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a2.c);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a2.d);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a1 is B && a2 is C) {
@@ -66,11 +66,11 @@
     print(a1.b);
     print(a1.c);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a1.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
 
     print(a2.a);
@@ -78,7 +78,7 @@
     print(a2.c);
     print(a2.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     if (a1 is C && a2 is D) {
@@ -87,7 +87,7 @@
       print(a1.c);
       print(a1.d);
       //       ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
 
       print(a2.a);
@@ -95,7 +95,7 @@
       print(a2.c);
       print(a2.d);
       //       ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
   }
@@ -105,44 +105,44 @@
               '${a1.b}'
       '${a1.c}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       '${a1.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
               '${a2.a}'
               '${a2.b}'
               '${a2.c}'
       '${a2.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
           : '${a1.a}'
       '${a1.b}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a1.c}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a1.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
           '${a2.a}'
       '${a2.b}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a2.c}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a2.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -152,7 +152,7 @@
     print(a1.c);
     print(a1.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     print(a2.a);
@@ -160,7 +160,7 @@
     print(a2.c);
     print(a2.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 }
diff --git a/tests/language/type_promotion/parameter_test.dart b/tests/language/type_promotion/parameter_test.dart
index b93d764..7ce7119 100644
--- a/tests/language/type_promotion/parameter_test.dart
+++ b/tests/language/type_promotion/parameter_test.dart
@@ -35,15 +35,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is B) {
@@ -51,11 +51,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
 
     if (a is C) {
@@ -64,7 +64,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -72,11 +72,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is C) {
@@ -85,7 +85,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     if (a is B) {
@@ -94,7 +94,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
     if (a is D) {
@@ -103,7 +103,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -112,33 +112,33 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is D) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
@@ -146,15 +146,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   var o1 = a is B
@@ -162,24 +162,24 @@
               '${a.b}'
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -189,20 +189,20 @@
               '${a.c}'
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -210,25 +210,25 @@
           ? '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'D'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'D'.
               '${a.d}'
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -237,11 +237,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is B && a is C) {
@@ -250,7 +250,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is B) {
@@ -259,7 +259,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is D) {
@@ -268,18 +268,18 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is D && a is C) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
@@ -287,37 +287,37 @@
       a.a == ""
       && a.b == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'D'.
       && a.c == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'D'.
       &&
       a.d == "") {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
   if (a.a == ""
       && a.b == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       && a.c == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       && a.d == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
           &&
           a is B &&
@@ -325,11 +325,11 @@
           a.b == ""
       && a.c == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       && a.d == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
           &&
           a is C &&
@@ -338,7 +338,7 @@
           a.c == ""
       && a.d == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
       ) {
     print(a.a);
@@ -346,7 +346,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if ((a is B)) {
@@ -354,11 +354,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if ((a is B && (a) is C) && a is B) {
@@ -367,7 +367,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 }
diff --git a/tests/language/type_variable/bound_access_test.dart b/tests/language/type_variable/bound_access_test.dart
index 77f8594..39d52ea 100644
--- a/tests/language/type_variable/bound_access_test.dart
+++ b/tests/language/type_variable/bound_access_test.dart
@@ -21,7 +21,7 @@
 
   num method2() => field1 + field2.length;
   //                               ^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'length' isn't defined for the class 'num'.
 }
 
diff --git a/tests/language/type_variable/conflict2_test.dart b/tests/language/type_variable/conflict2_test.dart
index 8b8439d..f43e609 100644
--- a/tests/language/type_variable/conflict2_test.dart
+++ b/tests/language/type_variable/conflict2_test.dart
@@ -14,13 +14,13 @@
   // This is equivalent to (T).call(). See issue 19725
   foo() => T();
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
   // [cfe] Method not found: 'T'.
 
   // T is in scope, even in static context. Compile-time error to call this.T().
   static bar() => T();
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
   // [cfe] Method not found: 'T'.
   //              ^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
@@ -28,26 +28,26 @@
   // X is not in scope. NoSuchMethodError.
   static baz() => X();
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'X'.
 
   // Class 'C' has no static method 'T': NoSuchMethodError.
   static qux() => C.T();
   //                ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.T'.
 
   // Class '_Type' has no instance method 'call': NoSuchMethodError.
   quux() => (T)();
   //        ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
   //           ^
   // [cfe] The method 'call' isn't defined for the class 'Type'.
 
   // Runtime type T not accessible from static context. Compile-time error.
   static corge() => (T)();
   //                ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
   //                 ^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
   // [cfe] Type variables can't be used in static members.
@@ -57,7 +57,7 @@
   // Class '_Type' has no [] operator: NoSuchMethodError.
   grault() => T[0];
   //           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
 
   // Runtime type T not accessible from static context. Compile-time error.
@@ -66,13 +66,13 @@
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
   // [cfe] Type variables can't be used in static members.
   //                  ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
 
   // Class '_Type' has no member m: NoSuchMethodError.
   waldo() => T.m;
   //           ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm' isn't defined for the class 'Type'.
 
   // Runtime type T not accessible from static context. Compile-time error.
@@ -81,7 +81,7 @@
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
   // [cfe] Type variables can't be used in static members.
   //                 ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm' isn't defined for the class 'Type'.
 }
 
diff --git a/tests/language/type_variable/scope_test.dart b/tests/language/type_variable/scope_test.dart
index 86361f2..3be94a3 100644
--- a/tests/language/type_variable/scope_test.dart
+++ b/tests/language/type_variable/scope_test.dart
@@ -24,10 +24,10 @@
     // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
     // [cfe] Type variables can't be used in static members.
     //         ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     return new Foo<String>();
     //     ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   }
 
   // T is in scope for a factory method.
@@ -53,7 +53,7 @@
       // [cfe] Can only use type variables in instance methods.
     return new Foo<String>();
     //     ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   }
 
   static void set f(
@@ -77,7 +77,7 @@
   new I(new Foo<String>());
   Foo.f1 = new Foo<String>();
   //       ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'Foo<String>' can't be assigned to a variable of type 'Foo<T>'.
   var x = Foo.f;
diff --git a/tests/language/unsorted/callable_test.dart b/tests/language/unsorted/callable_test.dart
index 75ff4c2..16dde13 100644
--- a/tests/language/unsorted/callable_test.dart
+++ b/tests/language/unsorted/callable_test.dart
@@ -42,12 +42,12 @@
   //^
   // [cfe] A value of type 'dynamic Function()' can't be assigned to a variable of type 'dynamic Function(int)'.
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   G g0 = y;
   //^
   // [cfe] A value of type 'dynamic Function(int)' can't be assigned to a variable of type 'dynamic Function(String)'.
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 
   Expect.equals(f(), 42);
   Expect.equals(g(100), 187);
diff --git a/tests/language/unsorted/external_test.dart b/tests/language/unsorted/external_test.dart
index cd9c0e1..b18381f 100644
--- a/tests/language/unsorted/external_test.dart
+++ b/tests/language/unsorted/external_test.dart
@@ -70,13 +70,13 @@
 }
 
 external int t06(int i) { return 1; }
-// [error line 78, column 1, length 8]
+// [error line 72, column 1, length 8]
 // [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
 // [cfe] An external or native method can't have a body.
 //                      ^
 // [cfe] An external or native method can't have a body.
 external int t07(int i) => i + 1;
-// [error line 84, column 1, length 8]
+// [error line 78, column 1, length 8]
 // [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
 // [cfe] An external or native method can't have a body.
 //                         ^
diff --git a/tests/language/unsorted/invalid_cast_test.dart b/tests/language/unsorted/invalid_cast_test.dart
index c3b7747..86666e7 100644
--- a/tests/language/unsorted/invalid_cast_test.dart
+++ b/tests/language/unsorted/invalid_cast_test.dart
@@ -19,47 +19,47 @@
   void localFunction(int i) {}
   List<int> a = <Object>[];
   //            ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                    ^
   // [cfe] A value of type 'List<Object>' can't be assigned to a variable of type 'List<int>'.
   Map<int, String> b = <Object, String>{};
   //                   ^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                   ^
   // [cfe] A value of type 'Map<Object, String>' can't be assigned to a variable of type 'Map<int, String>'.
   Map<int, String> c = <int, Object>{};
   //                   ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                ^
   // [cfe] A value of type 'Map<int, Object>' can't be assigned to a variable of type 'Map<int, String>'.
   int Function(Object) d = (int i) => i;
   //                       ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'int Function(int)' can't be assigned to a variable of type 'int Function(Object)'.
   D e = new C.fact() as D;
   D f = new C.fact2() as D;
   D g = new C.nonFact();
   //    ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //        ^
   // [cfe] A value of type 'C' can't be assigned to a variable of type 'D'.
   D h = new C.nonFact2();
   //    ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //        ^
   // [cfe] A value of type 'C' can't be assigned to a variable of type 'D'.
   void Function(Object) i = C.staticFunction;
   //                        ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                          ^
   // [cfe] A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(Object)'.
   void Function(Object) j = topLevelFunction;
   //                        ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(Object)'.
   void Function(Object) k = localFunction;
   //                        ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(Object)'.
 }
 
diff --git a/tests/language/unsorted/invalid_type_argument_count_test.dart b/tests/language/unsorted/invalid_type_argument_count_test.dart
index 3a93da2..cf9619d 100644
--- a/tests/language/unsorted/invalid_type_argument_count_test.dart
+++ b/tests/language/unsorted/invalid_type_argument_count_test.dart
@@ -5,14 +5,14 @@
 // Test top level field.
 dynamic<int> x1 = 42;
 // [error line 6, column 1, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
 
 class Foo {
   // Test class member.
   dynamic<int> x2 = 42;
 // [error line 13, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
 
   Foo() {
@@ -28,7 +28,7 @@
   // Test local variable.
   dynamic<int> x3 = 42;
 // [error line 29, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
   print(x3);
 
@@ -38,7 +38,7 @@
 // Test parameter.
 void foo(dynamic<int> x4) {
 // [error line 39, column 10, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
   print(x4);
 }
diff --git a/tests/language/variable/illegal_initializer_test.dart b/tests/language/variable/illegal_initializer_test.dart
index 1b99406..6924b69 100644
--- a/tests/language/variable/illegal_initializer_test.dart
+++ b/tests/language/variable/illegal_initializer_test.dart
@@ -24,7 +24,7 @@
       //   ^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
       //        ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 
   B.c3() : super;
   //            ^
@@ -45,7 +45,7 @@
       //   ^^^^
       // [analyzer] SYNTACTIC_ERROR.MISSING_ASSIGNMENT_IN_INITIALIZER
       // [error line 39, column 16, length 0]
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] Expected '.' before this.
       //       ^
       // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language/variable/ref_before_declaration_test.dart b/tests/language/variable/ref_before_declaration_test.dart
index 53f42bc..ee9ebc2 100644
--- a/tests/language/variable/ref_before_declaration_test.dart
+++ b/tests/language/variable/ref_before_declaration_test.dart
@@ -76,7 +76,7 @@
     //                   ^
     // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
     //                   ^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   }
 
   test() {
diff --git a/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart b/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart
index 71e14caa..e3e51d3 100644
--- a/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart
+++ b/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart
@@ -17,7 +17,7 @@
 // [cfe] Expected ')' before this.
   List<out String> bar;
   //  ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<' isn't defined for the class 'Type'.
   //   ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
@@ -26,7 +26,7 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Getter not found: 'out'.
   //             ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>' isn't defined for the class 'Type'.
   //               ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
diff --git a/tests/language/variance/variance_in_inference_error_test.dart b/tests/language/variance/variance_in_inference_error_test.dart
index 1d50ff2..d73f8b0 100644
--- a/tests/language/variance/variance_in_inference_error_test.dart
+++ b/tests/language/variance/variance_in_inference_error_test.dart
@@ -32,7 +32,7 @@
   var inferredMiddle = inferContraContra(Contravariant<Upper>(), Contravariant<Middle>());
   upper = inferredMiddle;
   //      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Upper>'.
 
   // T <: Upper and T <: Lower.
@@ -40,7 +40,7 @@
   var inferredLower = inferContraContra(Contravariant<Upper>(), Contravariant<Lower>());
   upper = inferredLower;
   //      ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
 
   // int <: T <: String is not a valid constraint.
@@ -88,7 +88,7 @@
   var inferredContraUpper = inferContraBound(ContraBound(Lower(), (Upper x) {}));
   lower = inferredContraUpper;
   //      ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
 
   // Inference for Contrabound(...) produces Lower <: T <: Middle.
@@ -96,6 +96,6 @@
   var inferredContraMiddle = inferContraBound(ContraBound(Lower(), (Middle x) {}));
   lower = inferredContraMiddle;
   //      ^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
 }
diff --git a/tests/language/variance/variance_in_subtyping_error_test.dart b/tests/language/variance/variance_in_subtyping_error_test.dart
index 9779d33..4271fd0 100644
--- a/tests/language/variance/variance_in_subtyping_error_test.dart
+++ b/tests/language/variance/variance_in_subtyping_error_test.dart
@@ -70,7 +70,7 @@
   List<Contravariant<Lower>> listLower = [new Contravariant<Lower>()];
   iterableMiddle = listLower;
   //               ^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Contravariant<Lower>>' can't be assigned to a variable of type 'Iterable<Contravariant<Middle>>'.
 
   testCall(listLower);
diff --git a/tests/language/variance/variance_inout_subtyping_error_test.dart b/tests/language/variance/variance_inout_subtyping_error_test.dart
index 3bcec37..d994e6c 100644
--- a/tests/language/variance/variance_inout_subtyping_error_test.dart
+++ b/tests/language/variance/variance_inout_subtyping_error_test.dart
@@ -108,14 +108,14 @@
   List<Invariant<Middle>> listMiddle = [new Invariant<Middle>()];
   iterableLower = listMiddle;
   //              ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Invariant<Middle>>' can't be assigned to a variable of type 'Iterable<Invariant<Lower>>'.
 
   Iterable<Invariant<Middle>> iterableMiddle = [new Invariant<Middle>()];
   List<Invariant<Lower>> listLower = [new Invariant<Lower>()];
   iterableMiddle = listLower;
   //               ^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Invariant<Lower>>' can't be assigned to a variable of type 'Iterable<Invariant<Middle>>'.
 
   testCall<Lower>(listMiddle);
diff --git a/tests/language/variance/variance_out_inference_error_test.dart b/tests/language/variance/variance_out_inference_error_test.dart
index 809cdfb..ccce0d1 100644
--- a/tests/language/variance/variance_out_inference_error_test.dart
+++ b/tests/language/variance/variance_out_inference_error_test.dart
@@ -31,7 +31,7 @@
   var inferredMiddle = inferCovCov(Covariant<Lower>(), Covariant<Middle>());
   lower = inferredMiddle;
   //      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
 
   // Lower <: T <: Upper.
@@ -39,7 +39,7 @@
   var inferredUpper = inferCovCov(Covariant<Lower>(), Covariant<Upper>());
   lower = inferredUpper;
   //      ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
 
   // Inference for Covbound(...) produces Lower <: T <: Upper.
@@ -47,7 +47,7 @@
   var inferredCovLower = inferCovBound(CovBound(Lower(), (Upper x) {}));
   upper = inferredCovLower;
   //      ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
 
   // Inference for Covbound(...) produces Lower <: T <: Middle.
@@ -55,6 +55,6 @@
   var inferredCovLower2 = inferCovBound(CovBound(Lower(), (Middle x) {}));
   middle = inferredCovLower2;
   //       ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Middle>'.
 }
diff --git a/tests/language/variance/variance_out_subtyping_error_test.dart b/tests/language/variance/variance_out_subtyping_error_test.dart
index dd925e2..2ddcd3e 100644
--- a/tests/language/variance/variance_out_subtyping_error_test.dart
+++ b/tests/language/variance/variance_out_subtyping_error_test.dart
@@ -70,7 +70,7 @@
   List<Covariant<Middle>> listMiddle = [new Covariant<Middle>()];
   iterableLower = listMiddle;
   //              ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Covariant<Middle>>' can't be assigned to a variable of type 'Iterable<Covariant<Lower>>'.
 
   testCall(listMiddle);
diff --git a/tests/language/variance/variance_upper_lower_bounds_error_test.dart b/tests/language/variance/variance_upper_lower_bounds_error_test.dart
index 2c69097..a8e1f25 100644
--- a/tests/language/variance/variance_upper_lower_bounds_error_test.dart
+++ b/tests/language/variance/variance_upper_lower_bounds_error_test.dart
@@ -28,39 +28,39 @@
       exactly(condition ? Contravariant<Upper>() : Contravariant<Lower>());
   Exactly<Contravariant<Upper>> contraUpperExpected = contraLowerActual;
   //                                                  ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Contravariant<Lower>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
 
   var contraMiddleActual =
       exactly(condition ? Contravariant<Upper>() : Contravariant<Middle>());
   contraUpperExpected = contraMiddleActual;
   //                    ^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Contravariant<Middle>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
 
   var covMiddleActual =
       exactly(condition ? Covariant<Middle>() : Covariant<Lower>());
   Exactly<Covariant<Lower>> covLowerExpected = covMiddleActual;
   //                                           ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Covariant<Middle>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
 
   var covUpperActual =
       exactly(condition ? Covariant<Upper>() : Covariant<Lower>());
   covLowerExpected = covUpperActual;
   //                 ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Covariant<Upper>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
 
   var invObjectActual =
       exactly(condition ? Invariant<Upper>() : Invariant<Middle>());
   Exactly<Invariant<Middle>> invMiddleExpected = invObjectActual;
   //                                             ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Middle>>'.
   Exactly<Invariant<Upper>> invUpperExpected = invObjectActual;
   //                                           ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Upper>>'.
 
   var legacyCovMiddleActual =
@@ -68,14 +68,14 @@
   Exactly<LegacyCovariant<Lower>> legacyCovLowerExpected =
       legacyCovMiddleActual;
   //  ^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<LegacyCovariant<Middle>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
 
   var legacyCovUpperActual =
       exactly(condition ? LegacyCovariant<Upper>() : LegacyCovariant<Lower>());
   legacyCovLowerExpected = legacyCovUpperActual;
   //                       ^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<LegacyCovariant<Upper>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
 
   var multiActual = exactly(condition
@@ -83,20 +83,20 @@
       : Multi<Lower, Middle, Lower>());
   Exactly<Multi<Lower, Middle, Lower>> multiExpected = multiActual;
   //                                                   ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Multi<Middle, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Multi<Lower, Middle, Lower>>'.
 
   var multiActual2 = exactly(
       condition ? Multi<Middle, int, Middle>() : Multi<Lower, Middle, Lower>());
   Exactly<Multi<Middle, Object, Lower>> multiObjectExpected = multiActual2;
   //                                                          ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Multi<Middle, Object, Lower>>'.
 
   var multiActual3 = exactly(
       condition ? Multi<int, Middle, Middle>() : Multi<Lower, Middle, Lower>());
   Exactly<Object> multiObjectExpected2 = multiActual3;
   //                                     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Multi<Object, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Object>'.
 }
diff --git a/tests/language_2/assert/initializer_const_function_test.dart b/tests/language_2/assert/initializer_const_function_test.dart
index 27b99bd..b581c1d 100644
--- a/tests/language_2/assert/initializer_const_function_test.dart
+++ b/tests/language_2/assert/initializer_const_function_test.dart
@@ -11,7 +11,7 @@
   const C.bc01(this.x, y)
       : assert(staticTrue)
       //       ^^^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+      // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
       // [cfe] A value of type 'bool Function()' can't be assigned to a variable of type 'bool'.
       ;
 }
diff --git a/tests/language_2/assign/static_type_test.dart b/tests/language_2/assign/static_type_test.dart
index d184bf4..8fba36d 100644
--- a/tests/language_2/assign/static_type_test.dart
+++ b/tests/language_2/assign/static_type_test.dart
@@ -7,7 +7,7 @@
 
 int a = "String";
 //      ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 
 class A {
@@ -16,19 +16,19 @@
   // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   //                   ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   final int d = "String";
   //            ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   int e = "String";
   //      ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   A() {
      int f = "String";
      //      ^^^^^^^^
-     // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+     // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
      // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   }
   method(
@@ -36,7 +36,7 @@
      int
       g = "String"]) {
       //  ^^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
     return g;
   }
diff --git a/tests/language_2/async/congruence_local_test.dart b/tests/language_2/async/congruence_local_test.dart
index 8d8a03d..de5fbaa 100644
--- a/tests/language_2/async/congruence_local_test.dart
+++ b/tests/language_2/async/congruence_local_test.dart
@@ -102,7 +102,7 @@
     Future<int> v1 = f_inferred_futureObject();
     int v2 = f_inferred_futureObject();
     //       ^^^^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                              ^
     // [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'int'.
 
@@ -112,7 +112,7 @@
     Future<B2> v3 = f_inferred_A();
     Future<int> v4 = f_inferred_A();
     //               ^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                           ^
     // [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<int>'.
   }
diff --git a/tests/language_2/async/congruence_method_test.dart b/tests/language_2/async/congruence_method_test.dart
index 69f63d7..e951103 100644
--- a/tests/language_2/async/congruence_method_test.dart
+++ b/tests/language_2/async/congruence_method_test.dart
@@ -80,7 +80,7 @@
   Future<B2> v1 = c.f_inferred_A();
   Future<int> v2 = c.f_inferred_A();
   //               ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                 ^
   // [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<int>'.
 }
diff --git a/tests/language_2/async/congruence_unnamed_test.dart b/tests/language_2/async/congruence_unnamed_test.dart
index 5e5ccd2..ecc2964 100644
--- a/tests/language_2/async/congruence_unnamed_test.dart
+++ b/tests/language_2/async/congruence_unnamed_test.dart
@@ -122,7 +122,7 @@
     Future<int> v1 = f_inferred_futureObject();
     int v2 = f_inferred_futureObject();
     //       ^^^^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                              ^
     // [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'int'.
 
@@ -132,7 +132,7 @@
     Future<B2> v3 = f_inferred_A();
     Future<int> v4 = f_inferred_A();
     //               ^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                           ^
     // [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<int>'.
   }
diff --git a/tests/language_2/async/or_generator_return_type_stacktrace_test.dart b/tests/language_2/async/or_generator_return_type_stacktrace_test.dart
index 1de0f9c..a6de936 100644
--- a/tests/language_2/async/or_generator_return_type_stacktrace_test.dart
+++ b/tests/language_2/async/or_generator_return_type_stacktrace_test.dart
@@ -6,7 +6,7 @@
 
 int badReturnTypeAsync() async {}
 // [error line 7, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
 //  ^
 // [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
 int badReturnTypeAsyncStar() async* {}
diff --git a/tests/language_2/async/return_types_test.dart b/tests/language_2/async/return_types_test.dart
index 4ecd5b4..66853a7 100644
--- a/tests/language_2/async/return_types_test.dart
+++ b/tests/language_2/async/return_types_test.dart
@@ -18,13 +18,13 @@
 foo3() async {
   return "String";
   //     ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'Future<String>' can't be assigned to a variable of type 'FutureOr<int>'.
 }
 
 Future<int, String>
 // [error line 25, column 1, length 19]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 foo4() async {
   return "String";
@@ -32,7 +32,7 @@
 
 int
 // [error line 33, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
 foo5() async {
 // [error line 36, column 1]
 // [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
@@ -48,7 +48,7 @@
 foo7() async {
   return new Future<int>.value(3);
   //     ^^^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
 }
 
 Iterable<int> foo8() sync* {
diff --git a/tests/language_2/call/non_method_field_test.dart b/tests/language_2/call/non_method_field_test.dart
index 8fbd2a9..8656cbf 100644
--- a/tests/language_2/call/non_method_field_test.dart
+++ b/tests/language_2/call/non_method_field_test.dart
@@ -14,14 +14,14 @@
   Fisk x1 = new Fisk();
   x1.i();
 //^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 
   Hest x2 = new Hest();
   x2.i();
 //^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 }
diff --git a/tests/language_2/call/object_has_no_call_method_test.dart b/tests/language_2/call/object_has_no_call_method_test.dart
index dcb2a5c..d02b290 100644
--- a/tests/language_2/call/object_has_no_call_method_test.dart
+++ b/tests/language_2/call/object_has_no_call_method_test.dart
@@ -6,20 +6,20 @@
   d();
   o();
 //^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 // ^
 // [cfe] The method 'call' isn't defined for the class 'Object'.
   f();
   d.call;
   o.call;
   //^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'call' isn't defined for the class 'Object'.
   f.call;
   d.call();
   o.call();
   //^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'call' isn't defined for the class 'Object'.
   f.call();
 }
diff --git a/tests/language_2/call/through_getter_test.dart b/tests/language_2/call/through_getter_test.dart
index 2169e8c6..06e5af3 100644
--- a/tests/language_2/call/through_getter_test.dart
+++ b/tests/language_2/call/through_getter_test.dart
@@ -31,12 +31,12 @@
 
     TOP_LEVEL_CONST();
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
     (TOP_LEVEL_CONST)();
 //  ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                   ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
diff --git a/tests/language_2/cascade/cascade_test.dart b/tests/language_2/cascade/cascade_test.dart
index 274b23bf..7e674f5 100644
--- a/tests/language_2/cascade/cascade_test.dart
+++ b/tests/language_2/cascade/cascade_test.dart
@@ -93,11 +93,11 @@
   // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
   // [cfe] Expected an identifier, but got '37'.
   // [error line 91, column 8, length 0]
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   a.."foo";
   // ^^^^^
   // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
   // [cfe] Expected an identifier, but got '"foo"'.
   // [error line 97, column 11, length 0]
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 }
diff --git a/tests/language_2/closure/internals_test.dart b/tests/language_2/closure/internals_test.dart
index 78f04ab..9efdda3 100644
--- a/tests/language_2/closure/internals_test.dart
+++ b/tests/language_2/closure/internals_test.dart
@@ -12,14 +12,14 @@
   var f = new C().foo;
   var target = f.target;
   //             ^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'target' isn't defined for the class 'dynamic Function()'.
   var self = f.self;
   //           ^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'self' isn't defined for the class 'dynamic Function()'.
   var receiver = f.receiver;
   //               ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'receiver' isn't defined for the class 'dynamic Function()'.
 }
diff --git a/tests/language_2/compile_time_constant/static2_test.dart b/tests/language_2/compile_time_constant/static2_test.dart
index 5de087a..2f6abe6 100644
--- a/tests/language_2/compile_time_constant/static2_test.dart
+++ b/tests/language_2/compile_time_constant/static2_test.dart
@@ -13,7 +13,7 @@
   const A.a2(this.x);
   const A.a3([this.x = 'foo']);
   //                   ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   const A.a4(String this.x);
   //         ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 const a2 = const A.a2('foo');
 //                    ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                    ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
 const a3 = const A.a3();
 //         ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 const a4 = const A.a4('foo');
 //                    ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 const a5 = const A.a5('foo');
 //         ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
 //         ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 //                    ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                    ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language_2/compile_time_constant/static3_test.dart b/tests/language_2/compile_time_constant/static3_test.dart
index d6c508b..f9205fd 100644
--- a/tests/language_2/compile_time_constant/static3_test.dart
+++ b/tests/language_2/compile_time_constant/static3_test.dart
@@ -13,7 +13,7 @@
   const A.a2(this.x);
   const A.a3([this.x = 'foo']);
   //                   ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   const A.a4(String this.x);
   //         ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 var a2 = const A.a2('foo');
 //                  ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                  ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
 var a3 = const A.a3();
 //       ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 var a4 = const A.a4('foo');
 //                  ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 var a5 = const A.a5('foo');
 //       ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
 //       ^^^^^^^^^^^^^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
 //                  ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
 //                  ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language_2/compile_time_constant/static_test.dart b/tests/language_2/compile_time_constant/static_test.dart
index 288ffef..a7fb0a8 100644
--- a/tests/language_2/compile_time_constant/static_test.dart
+++ b/tests/language_2/compile_time_constant/static_test.dart
@@ -4,17 +4,17 @@
 
 final int x = 'foo';
 //            ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 const int y = 'foo';
 //            ^^^^^
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 //            ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 int z = 'foo';
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 
 main() {
diff --git a/tests/language_2/const/conditional_test.dart b/tests/language_2/const/conditional_test.dart
index 33aec86..4943748 100644
--- a/tests/language_2/const/conditional_test.dart
+++ b/tests/language_2/const/conditional_test.dart
@@ -73,13 +73,13 @@
 // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 //            ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 const cond4a = zeroConst ? nonConst : const1;
 //             ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 //             ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 //                         ^
 // [cfe] Not a constant expression.
 const cond4b = zeroConst ? const0 : nonConst;
@@ -87,7 +87,7 @@
 // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 //             ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
 //                                  ^
 // [cfe] Not a constant expression.
 
diff --git a/tests/language_2/const/constructor3_test.dart b/tests/language_2/const/constructor3_test.dart
index aa8aa0ff..8ec85e0 100644
--- a/tests/language_2/const/constructor3_test.dart
+++ b/tests/language_2/const/constructor3_test.dart
@@ -15,7 +15,7 @@
 const c = const C(0.0);
 const d = const C(intValue);
 //                ^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
 // [cfe] The argument type 'int' can't be assigned to the parameter type 'double'.
 //                ^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language_2/const/init2_test.dart b/tests/language_2/const/init2_test.dart
index 7f5e1a3..40b7a8b 100644
--- a/tests/language_2/const/init2_test.dart
+++ b/tests/language_2/const/init2_test.dart
@@ -9,7 +9,7 @@
 // [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
 // [cfe] A value of type 'int' can't be assigned to a variable of type 'double'.
 //               ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 
 main() {
   print(c);
diff --git a/tests/language_2/constructor/named_constructor_test.dart b/tests/language_2/constructor/named_constructor_test.dart
index d802b9a..3b8af32 100644
--- a/tests/language_2/constructor/named_constructor_test.dart
+++ b/tests/language_2/constructor/named_constructor_test.dart
@@ -24,12 +24,12 @@
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //             ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
 
   // 'Class<int>.named<int>' doesn't fit the grammar syntax T.id:
   new Class<int>.named<int>().value;
   //             ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   new prefix.Class().value;
@@ -45,7 +45,7 @@
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   // [cfe] Method not found: 'prefix.Class'.
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   new prefix.Class.named().value;
@@ -64,7 +64,7 @@
   // 'prefix.Class.named<int>' doesn't fit the grammar syntax T.id:
   new prefix.Class.named<int>().value;
   //               ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   // 'prefix<int>.Class<int>' doesn't fit the grammar syntax T.id:
@@ -73,7 +73,7 @@
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   // [cfe] Method not found: 'prefix.Class'.
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
 
@@ -90,7 +90,7 @@
   // 'prefix.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
   new prefix.Class<int>.named<int>().value;
   //                    ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 
   // 'prefix<int>.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
@@ -99,6 +99,6 @@
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   // [cfe] Method not found: 'prefix.Class'.
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
 }
diff --git a/tests/language_2/constructor/reference_test.dart b/tests/language_2/constructor/reference_test.dart
index c1ec04c..9246d2b 100644
--- a/tests/language_2/constructor/reference_test.dart
+++ b/tests/language_2/constructor/reference_test.dart
@@ -23,13 +23,13 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Expected '(' after this.
   //               ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
   new Foo.bar<int>();
   //      ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //         ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   new Foo.bar<int>.baz();
   //      ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -41,7 +41,7 @@
   //  ^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   //          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //          ^
   // [cfe] Method not found: 'Foo.bar.baz'.
@@ -60,13 +60,13 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Expected '(' after this.
   //                 ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
   const Foo.bar<int>();
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //           ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   const Foo.bar<int>.baz();
   //        ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -78,7 +78,7 @@
   //    ^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
   //            ^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //            ^
   // [cfe] Method not found: 'Foo.bar.baz'.
@@ -87,7 +87,7 @@
   Foo.bar();
   Foo.bar.baz();
   //  ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'bar'.
   Foo<int>();
   Foo<int>.bar();
@@ -96,13 +96,13 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Expected '(' after this.
   //           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
   Foo.bar<int>();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
   //     ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
   Foo.bar<int>.baz();
   //  ^
   // [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -112,6 +112,6 @@
   // [cfe] Method not found: 'Foo.bar.baz'.
   Foo.bar.baz<int>();
   //  ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'bar'.
 }
diff --git a/tests/language_2/deferred/super_dependency_test.dart b/tests/language_2/deferred/super_dependency_test.dart
index f49380c..5879e56 100644
--- a/tests/language_2/deferred/super_dependency_test.dart
+++ b/tests/language_2/deferred/super_dependency_test.dart
@@ -8,7 +8,7 @@
 
 import "package:expect/expect.dart";
 //        ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
 // [cfe] Superclass has no setter named 'foo'.
 import "super_dependency_lib.dart" deferred as lib;
 
diff --git a/tests/language_2/enum/private_test.dart b/tests/language_2/enum/private_test.dart
index bd99d84..a24fec3 100644
--- a/tests/language_2/enum/private_test.dart
+++ b/tests/language_2/enum/private_test.dart
@@ -20,6 +20,6 @@
   Expect.equals('Enum2._A,Enum2._B', Enum2.values.join(','));
   Expect.throwsNoSuchMethodError(() => Enum2._A);
   //                                         ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_ENUM_CONSTANT
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_ENUM_CONSTANT
   // [cfe] Getter not found: '_A'.
 }
diff --git a/tests/language_2/extension_methods/static_extension_bounds_error_test.dart b/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
index 5e8ae34..2dc6ba0 100644
--- a/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
@@ -32,7 +32,7 @@
   // Inferred type of String does not satisfy the bound.
   s.e1;
 //  ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] The getter 'e1' isn't defined for the class 'String'.
   E1(s).e1;
 //^^
@@ -56,7 +56,7 @@
   // Inferred type of String does not satisfy the bound.
   s.e2;
 //  ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] The getter 'e2' isn't defined for the class 'String'.
   E2(s).e2;
 //^^
@@ -123,7 +123,7 @@
   // Inferred super-bounded type is invalid as type argument
   superRec.e4;
 //         ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 // [cfe] The getter 'e4' isn't defined for the class 'Rec<dynamic>'.
   E4(superRec).e4;
 //^^
diff --git a/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart b/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
index 59920e7..8dc19f1 100644
--- a/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
@@ -10,10 +10,10 @@
   Object o = 1;
   OnObject(o).onObject;
 //^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
 // [cfe] Method not found: 'OnObject'.
   o.onObject;
   //^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'onObject' isn't defined for the class 'Object'.
 }
diff --git a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
index 8493792..4986f45 100644
--- a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -44,15 +44,15 @@
   c0.m2 = 0;
   c0.m2;
   // ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C0'.
   c0.m2 += 0;
   // ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C0'.
   c0.m2++;
   // ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C0'.
 
   E0(c0).m2;
@@ -60,7 +60,7 @@
   c0[0];
   c0[0] = 0;
   //^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C0'.
   E0(c0)[0];
   //    ^^^
@@ -70,11 +70,11 @@
 
   c0[0] += 0;
   //^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C0'.
   c0[0]++;
   //^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C0'.
 
   E0(c0)[0] += 0;
@@ -114,24 +114,24 @@
 
   c1a.m2;
   //  ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm2' isn't defined for the class 'C1<int>'.
 
   c1a.m2 = 0;
 
   c1a[0] = 0;
   // ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0] += 0;
   // ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0]++;
   // ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0];
@@ -218,23 +218,23 @@
     this.m2 = 0;
     this.m2;
     //   ^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'm2' isn't defined for the class 'C2'.
 
     this[0] = 0;
     this[0];
     //  ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
     // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     this[0] += 0;
     //  ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
     // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     this[0]++;
     //  ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
     // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     // Check that `this.mc` refers to `C2.mc`.
diff --git a/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart b/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
index 9a93aa0..25b0461 100644
--- a/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
@@ -12,7 +12,7 @@
   Object o = i;
   i.onInt;
   //^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'onInt' isn't defined for the class 'int'.
   i.onObject;
   o.onObject;
diff --git a/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
index 3c485e8..a146f12 100644
--- a/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
@@ -12,7 +12,7 @@
   Object o = i;
   i.onInt;
   //^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'onInt' isn't defined for the class 'int'.
   i.onObject;
   o.onObject;
diff --git a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
index f1a9254..86941be 100644
--- a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
@@ -51,7 +51,7 @@
     // The instance getter shadows the global method
     topLevelMethod(4);
 //  ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -143,7 +143,7 @@
     // The static getter shadows the global method
     topLevelMethod(4);
 //  ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                   ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -225,7 +225,7 @@
     // The instance getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -256,7 +256,7 @@
     // The instance getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] 'extensionMethod' isn't a function or method and can't be invoked.
   }
@@ -371,7 +371,7 @@
     // The static getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                     ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
@@ -417,7 +417,7 @@
     // The static getter shadows the other extensions method
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 //                 ^
 // [cfe] The method 'call' isn't defined for the class 'int'.
   }
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
index 38191b8..dd18be3 100644
--- a/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
@@ -29,7 +29,7 @@
   void shadowTypeParam<T>(T x) {
     T y = self;
     //    ^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type '#T' can't be assigned to a variable of type 'T'.
   }
 
diff --git a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
index 2856a18..ce822ac 100644
--- a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
+++ b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
@@ -39,7 +39,7 @@
   // No `i_num` extension declared.
   i_num.i_num;
   //    ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'i_num' isn't defined for the class 'Iterable<num>'.
 
   Expect.equals("Iterable<int>.i_num", ii.i_num);
diff --git a/tests/language_2/factory/factory_test.dart b/tests/language_2/factory/factory_test.dart
index d7b5c2d..5431241 100644
--- a/tests/language_2/factory/factory_test.dart
+++ b/tests/language_2/factory/factory_test.dart
@@ -36,7 +36,7 @@
 abstract class Link<T> {
   factory Link.create() = LinkFactory<T>.create;
   //                      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 0 type arguments.
   //                      ^^^^^^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_INVALID_RETURN_TYPE
diff --git a/tests/language_2/factory/return_type_checked_test.dart b/tests/language_2/factory/return_type_checked_test.dart
index c882f4f..76e6f3a 100644
--- a/tests/language_2/factory/return_type_checked_test.dart
+++ b/tests/language_2/factory/return_type_checked_test.dart
@@ -7,7 +7,7 @@
 class A {
   factory A() => 42;
   //             ^^
-  // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'A'.
 }
 
diff --git a/tests/language_2/field/type_check_test.dart b/tests/language_2/field/type_check_test.dart
index 51f03fc..c27d3d5 100644
--- a/tests/language_2/field/type_check_test.dart
+++ b/tests/language_2/field/type_check_test.dart
@@ -9,6 +9,6 @@
 int main() {
   new A().e = "String";
   //          ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
 }
diff --git a/tests/language_2/function/malformed_result_type_test.dart b/tests/language_2/function/malformed_result_type_test.dart
index 3b0257b..d149be5 100644
--- a/tests/language_2/function/malformed_result_type_test.dart
+++ b/tests/language_2/function/malformed_result_type_test.dart
@@ -11,6 +11,6 @@
 main() {
   C<int> f() => null;
 //^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 }
diff --git a/tests/language_2/function/type_call_getter2_test.dart b/tests/language_2/function/type_call_getter2_test.dart
index c52cb9e..789f22e 100644
--- a/tests/language_2/function/type_call_getter2_test.dart
+++ b/tests/language_2/function/type_call_getter2_test.dart
@@ -27,42 +27,42 @@
       Function
       a2 = a;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'A' can't be assigned to a variable of type 'Function'.
 
   final
       F
       a3 = a;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'A' can't be assigned to a variable of type 'int Function(String)'.
 
   final
       Function
       b2 = b;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'B' can't be assigned to a variable of type 'Function'.
 
   final
       F
       b3 = b;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'B' can't be assigned to a variable of type 'int Function(String)'.
 
   final
       Function
       c2 = c;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'C' can't be assigned to a variable of type 'Function'.
 
   final
       F
       c3 = c;
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+      // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
       // [cfe] A value of type 'C' can't be assigned to a variable of type 'int Function(String)'.
 
   Expect.throwsTypeError(() {
diff --git a/tests/language_2/generic/field_mixin6_test.dart b/tests/language_2/generic/field_mixin6_test.dart
index 47a3678..303df88 100644
--- a/tests/language_2/generic/field_mixin6_test.dart
+++ b/tests/language_2/generic/field_mixin6_test.dart
@@ -9,7 +9,7 @@
 class M<T> {
   T field1 = 0;
   //         ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'T'.
   T field2 = 0 as dynamic;
 }
diff --git a/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart b/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart
index a1dd791..10775ef 100644
--- a/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart
+++ b/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart
@@ -17,30 +17,30 @@
   H<A> haa = ha;
   H<A> hab = hb;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
   H<A> hac = hc;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
 
   H<B> hba = ha;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
   H<B> hbb = hb;
   H<B> hbc = hc;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
 
   H<C> hca = ha;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
   H<C> hcb = hb;
   //         ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
   H<C> hcc = hc;
 }
diff --git a/tests/language_2/generic/function_subtype_test.dart b/tests/language_2/generic/function_subtype_test.dart
index 28cb90a..d392f6d 100644
--- a/tests/language_2/generic/function_subtype_test.dart
+++ b/tests/language_2/generic/function_subtype_test.dart
@@ -14,12 +14,12 @@
   F1 f11 = f1;
   F1 f12 = f2;
   //       ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y2 extends String>()' can't be assigned to a variable of type 'void Function<X1 extends num>()'.
 
   F2 f21 = f1;
   //       ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'void Function<Y1 extends num>()' can't be assigned to a variable of type 'void Function<X2 extends String>()'.
   F2 f22 = f2;
 }
diff --git a/tests/language_2/generic/function_typedef2_test.dart b/tests/language_2/generic/function_typedef2_test.dart
index 5a3207f..704a824 100644
--- a/tests/language_2/generic/function_typedef2_test.dart
+++ b/tests/language_2/generic/function_typedef2_test.dart
@@ -27,7 +27,7 @@
 // [cfe] Can't create typedef from non-function type.
 typedef K = Function(Function<A>(A<int>));
 //                               ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Can't use type arguments with type variable 'A'.
 typedef L = Function({x});
 //                    ^
diff --git a/tests/language_2/generic/wrong_number_type_arguments_test.dart b/tests/language_2/generic/wrong_number_type_arguments_test.dart
index 69a0b68..53e9627 100644
--- a/tests/language_2/generic/wrong_number_type_arguments_test.dart
+++ b/tests/language_2/generic/wrong_number_type_arguments_test.dart
@@ -5,18 +5,18 @@
 // Map takes 2 type arguments.
 Map<String> foo;
 // [error line 6, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 Map<String> baz;
 // [error line 10, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 
 main() {
   foo = null;
   var bar = new Map<String>();
   //            ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 2 type arguments.
   baz = new Map();
 }
diff --git a/tests/language_2/getter/no_setter2_test.dart b/tests/language_2/getter/no_setter2_test.dart
index 83d92c4..22ad07e 100644
--- a/tests/language_2/getter/no_setter2_test.dart
+++ b/tests/language_2/getter/no_setter2_test.dart
@@ -18,7 +18,7 @@
     // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
     // [cfe] The getter 'nextVar' isn't defined for the class 'Example'.
     //   ^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
     // [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
   }
   static test() {
@@ -31,7 +31,7 @@
 // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
 // [cfe] Expected identifier, but got 'this'.
 //       ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
 //       ^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
   }
diff --git a/tests/language_2/getter/no_setter_test.dart b/tests/language_2/getter/no_setter_test.dart
index c403d32..260b5fc 100644
--- a/tests/language_2/getter/no_setter_test.dart
+++ b/tests/language_2/getter/no_setter_test.dart
@@ -15,7 +15,7 @@
 // [cfe] Setter not found: 'nextVar'.
     this.nextVar = 1;
     //   ^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+    // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
     // [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
     //   ^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
@@ -30,7 +30,7 @@
 // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
 // [cfe] Expected identifier, but got 'this'.
 //       ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
 //       ^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
   }
diff --git a/tests/language_2/getter/setter2_test.dart b/tests/language_2/getter/setter2_test.dart
index ab9ba5a..a533c41 100644
--- a/tests/language_2/getter/setter2_test.dart
+++ b/tests/language_2/getter/setter2_test.dart
@@ -74,7 +74,7 @@
   // Type 'A' has no method named 'b'
   instance1.field.b();
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'b' isn't defined for the class 'A'.
 
   instance3.field = new B();
diff --git a/tests/language_2/identifier/known_prefix_error_test.dart b/tests/language_2/identifier/known_prefix_error_test.dart
index fe1ea19..06ec097 100644
--- a/tests/language_2/identifier/known_prefix_error_test.dart
+++ b/tests/language_2/identifier/known_prefix_error_test.dart
@@ -72,82 +72,82 @@
 
 async.B<async> _B_async = new async.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'async' isn't a type.
 await.B<await> _B_await = new await.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'await' isn't a type.
 hide.B<hide> _B_hide = new hide.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'hide' isn't a type.
 of.B<of> _B_of = new of.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'of' isn't a type.
 on.B<on> _B_on = new on.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'on' isn't a type.
 show.B<show> _B_show = new show.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'show' isn't a type.
 sync.B<sync> _B_sync = new sync.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'sync' isn't a type.
 yield.B<yield> _B_yield = new yield.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'yield' isn't a type.
 
 async.B<async<dynamic>> _B2_async = new async.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'async' isn't a type.
 //      ^
 // [cfe] Expected 0 type arguments.
 await.B<await<dynamic>> _B2_await = new await.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'await' isn't a type.
 //      ^
 // [cfe] Expected 0 type arguments.
 hide.B<hide<dynamic>> _B2_hide = new hide.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'hide' isn't a type.
 //     ^
 // [cfe] Expected 0 type arguments.
 of.B<of<dynamic>> _B2_of = new of.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'of' isn't a type.
 //   ^
 // [cfe] Expected 0 type arguments.
 on.B<on<dynamic>> _B2_on = new on.B();
 //   ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'on' isn't a type.
 //   ^
 // [cfe] Expected 0 type arguments.
 show.B<show<dynamic>> _B2_show = new show.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'show' isn't a type.
 //     ^
 // [cfe] Expected 0 type arguments.
 sync.B<sync<dynamic>> _B2_sync = new sync.B();
 //     ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'sync' isn't a type.
 //     ^
 // [cfe] Expected 0 type arguments.
 yield.B<yield<dynamic>> _B2_yield = new yield.B();
 //      ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'yield' isn't a type.
 //      ^
 // [cfe] Expected 0 type arguments.
diff --git a/tests/language_2/if_null/assignment_behavior_test.dart b/tests/language_2/if_null/assignment_behavior_test.dart
index 99811f2..6b02779 100644
--- a/tests/language_2/if_null/assignment_behavior_test.dart
+++ b/tests/language_2/if_null/assignment_behavior_test.dart
@@ -214,11 +214,11 @@
   check(1, () => C?.x ??= bad(), ['C.x']);
   h.C.xgetValue = 1;
   //  ^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] Setter not found: 'xgetValue'.
   check(1, () => h.c?.x ??= bad(), ['h.C.x']);
   //               ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
   // [cfe] Getter not found: 'c'.
   yGetValue = 1;
   check(1, () => C?.x ??= y, ['C.x', 'y', 'C.x=1']);
diff --git a/tests/language_2/if_null/precedence_test.dart b/tests/language_2/if_null/precedence_test.dart
index cb419fc..224238f 100644
--- a/tests/language_2/if_null/precedence_test.dart
+++ b/tests/language_2/if_null/precedence_test.dart
@@ -29,7 +29,7 @@
   // "(a ?? b) || c" would allow b to have any type provided that a is bool.
   false ?? 1 || true;
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 
   // "a || b ?? c" should parse as "(a || b) ?? c", therefore it is a static
@@ -37,7 +37,7 @@
   // "a || (b ?? c)" would allow b to have any type provided that c is bool.
   false || 1 ?? true;
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+  // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
 
   // An incorrect parse of "a || (b ?? c)" would result in no checked-mode
diff --git a/tests/language_2/import/self_test.dart b/tests/language_2/import/self_test.dart
index 1feeb88..f724a60 100644
--- a/tests/language_2/import/self_test.dart
+++ b/tests/language_2/import/self_test.dart
@@ -18,6 +18,6 @@
 main() {
   p._x;
   //^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
   // [cfe] Getter not found: '_x'.
 }
diff --git a/tests/language_2/inference/accessor_ref_test.dart b/tests/language_2/inference/accessor_ref_test.dart
index 8f16f8b..ec80b14 100644
--- a/tests/language_2/inference/accessor_ref_test.dart
+++ b/tests/language_2/inference/accessor_ref_test.dart
@@ -35,14 +35,14 @@
   x = new E();
   x = new B();
   //  ^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //      ^
   // [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
   y = new C();
   y = new E();
   y = new B();
   //  ^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //      ^
   // [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
 }
diff --git a/tests/language_2/least_upper_bound/expansive_test.dart b/tests/language_2/least_upper_bound/expansive_test.dart
index d798b15..970b685 100644
--- a/tests/language_2/least_upper_bound/expansive_test.dart
+++ b/tests/language_2/least_upper_bound/expansive_test.dart
@@ -42,37 +42,37 @@
     // Is least upper bound dynamic?
     (z ? a : b).z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'z' isn't defined for the class 'Object'.
 
     // Is least upper bound N<...> ?
     (z ? a : b).n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound C1<...> ?
     (z ? a : b).c1;
     //          ^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c1' isn't defined for the class 'Object'.
 
     // Is least upper bound N<dynamic> ?
     (z ? a : b).n.z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<N<...>> ?
     (z ? a : b).n.n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<C1<...>> ?
     (z ? a : b).n.c1;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
   }
 }
@@ -106,37 +106,37 @@
     // Is least upper bound dynamic?
     (z ? a : b).z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'z' isn't defined for the class 'Object'.
 
     // Is least upper bound N<...> ?
     (z ? a : b).n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound C2<...> ?
     (z ? a : b).c2;
     //          ^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c2' isn't defined for the class 'Object'.
 
     // Is least upper bound N<dynamic> ?
     (z ? a : b).n.z;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<N<...>> ?
     (z ? a : b).n.n;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
 
     // Is least upper bound N<C2<...>> ?
     (z ? a : b).n.c2;
     //          ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'n' isn't defined for the class 'Object'.
   }
 }
diff --git a/tests/language_2/least_upper_bound/least_upper_bound_test.dart b/tests/language_2/least_upper_bound/least_upper_bound_test.dart
index 4815316..4a7a784 100644
--- a/tests/language_2/least_upper_bound/least_upper_bound_test.dart
+++ b/tests/language_2/least_upper_bound/least_upper_bound_test.dart
@@ -47,11 +47,11 @@
   B r2 = false ? a : b;
   (true ? a : b).a = 0;
   //             ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'a' isn't defined for the class 'Object'.
   (false ? a : b).b = 0;
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'b' isn't defined for the class 'Object'.
   var c = new C();
   (true ? a as dynamic : c).a = 0;
@@ -64,7 +64,7 @@
   (true ? b : c).b = 0;
   (false ? b : c).c = 0;
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'c' isn't defined for the class 'B'.
   var a = null;
   (true ? b : a).b = 0;
@@ -80,11 +80,11 @@
   (false ? c : d).b = 0;
   (true ? c : d).c = 0;
   //             ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'c' isn't defined for the class 'B'.
   (false ? c : d).d = 0;
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'd' isn't defined for the class 'B'.
 }
 
@@ -94,12 +94,12 @@
   F<C> r2 = false ? e : f;
   A r3 = true ? e : f;
   //     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
   B r4 = false ? e : f;
   //     ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
   (true ? e : f).e = null;
@@ -112,18 +112,18 @@
   F<C> r2 = false ? e : f;
   A r3 = true ? e : f;
   //     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
   B r4 = false ? e : f;
   //     ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
   var r5;
   r5 = (true ? e : f).e;
   r5 = (false ? e : f).f;
   //                   ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'f' isn't defined for the class 'E<B>'.
 }
diff --git a/tests/language_2/malformed/inheritance_test.dart b/tests/language_2/malformed/inheritance_test.dart
index 55154d7..8eed858 100644
--- a/tests/language_2/malformed/inheritance_test.dart
+++ b/tests/language_2/malformed/inheritance_test.dart
@@ -18,7 +18,7 @@
 class C1
     extends A<Unresolved>
     //        ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -36,7 +36,7 @@
 class C3
     extends Object with A<Unresolved>
     //                    ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -52,7 +52,7 @@
 class C5
     implements A<Unresolved>
     //           ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -63,7 +63,7 @@
     // [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //      ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     {
 }
 
@@ -73,9 +73,9 @@
     // [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //      ^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     //        ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -88,7 +88,7 @@
     // [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //                  ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     {
 }
 
@@ -100,9 +100,9 @@
     // [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //                  ^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     //                    ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
@@ -113,7 +113,7 @@
     // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //         ^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     {
 }
 
@@ -123,9 +123,9 @@
     // [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
     // [cfe] Can't use type arguments with type variable 'A'.
     //         ^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+    // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
     //           ^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+    // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
     // [cfe] Type 'Unresolved' not found.
     {
 }
diff --git a/tests/language_2/malformed/malformed_test.dart b/tests/language_2/malformed/malformed_test.dart
index d825460..7f51c3d 100644
--- a/tests/language_2/malformed/malformed_test.dart
+++ b/tests/language_2/malformed/malformed_test.dart
@@ -29,25 +29,25 @@
 checkIsListUnresolved(var v) {
   v is List<Unresolved>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v is List<Unresolved<int>>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v is List<prefix.Unresolved>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v is List<prefix.Unresolved<int>>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v is List<int, String>;
   //   ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
 }
 
@@ -75,25 +75,25 @@
 checkAsListUnresolved(var v) {
   v as List<Unresolved>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v as List<Unresolved<int>>;
   //        ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   // [cfe] 'Unresolved' isn't a type.
   v as List<prefix.Unresolved>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v as List<prefix.Unresolved<int>>;
   //        ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+  // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
   //               ^
   // [cfe] 'Unresolved' isn't a type.
   v as List<int, String>;
   //   ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
 }
 
diff --git a/tests/language_2/map/literal13_test.dart b/tests/language_2/map/literal13_test.dart
index ec5e0be..08f06e4 100644
--- a/tests/language_2/map/literal13_test.dart
+++ b/tests/language_2/map/literal13_test.dart
@@ -7,7 +7,7 @@
 main() {
   var map = new Map<int>{ "a": 1, "b": 2, "c": 3 };
   //            ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 2 type arguments.
   //                   ^
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language_2/mixin/illegal_static_access_test.dart b/tests/language_2/mixin/illegal_static_access_test.dart
index 21e2348..8cd792d 100644
--- a/tests/language_2/mixin/illegal_static_access_test.dart
+++ b/tests/language_2/mixin/illegal_static_access_test.dart
@@ -20,10 +20,10 @@
 
   Expect.throwsNoSuchMethodError(() => C.foo());
   //                                     ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.foo'.
   Expect.throwsNoSuchMethodError(() => C.bar());
   //                                     ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.bar'.
 }
diff --git a/tests/language_2/mixin/illegal_super_use_test.dart b/tests/language_2/mixin/illegal_super_use_test.dart
index 89c3a76..ca47645 100644
--- a/tests/language_2/mixin/illegal_super_use_test.dart
+++ b/tests/language_2/mixin/illegal_super_use_test.dart
@@ -11,22 +11,22 @@
     super.toString();
     super.foo();
     //    ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
     // [cfe] Superclass has no method named 'foo'.
     super.bar = 100;
     //    ^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
     // [cfe] Superclass has no setter named 'bar'.
 
     void inner() {
       super.toString();
       super.foo();
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
       // [cfe] Superclass has no method named 'foo'.
       super.bar = 100;
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
       // [cfe] Superclass has no setter named 'bar'.
     }
     inner();
@@ -35,11 +35,11 @@
       super.toString();
       super.foo();
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
       // [cfe] Superclass has no method named 'foo'.
       super.bar = 100;
       //    ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
       // [cfe] Superclass has no setter named 'bar'.
     })();
 
diff --git a/tests/language_2/mixin/type_parameters_errors_test.dart b/tests/language_2/mixin/type_parameters_errors_test.dart
index 2988b2f..25e99b6 100644
--- a/tests/language_2/mixin/type_parameters_errors_test.dart
+++ b/tests/language_2/mixin/type_parameters_errors_test.dart
@@ -11,11 +11,11 @@
 //    ^
 // [cfe] The type 'M<U, V>' can't be mixed in.
 //                           ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 class C<A, B> extends S<A, int> with M { }
 //                    ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 
 class F<X> = S<X> with M<X>;
@@ -23,7 +23,7 @@
 //    ^
 // [cfe] The type 'M<double, double>' can't be mixed in.
 //                    ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 1 type arguments.
 
 main() {
@@ -32,11 +32,11 @@
   a = new A<int>();
   a = new A<String, String>();
   //      ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
   a = new F<int>();
   a = new F<int, String>();
   //      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
   // [cfe] Expected 1 type arguments.
 }
diff --git a/tests/language_2/null/checked_null_test.dart b/tests/language_2/null/checked_null_test.dart
index f6187cc..f33227b 100644
--- a/tests/language_2/null/checked_null_test.dart
+++ b/tests/language_2/null/checked_null_test.dart
@@ -25,6 +25,6 @@
   // crash.
   new A().a.foo();
   //        ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'foo' isn't defined for the class 'Map<dynamic, dynamic>'.
 }
diff --git a/tests/language_2/null_aware/access_test.dart b/tests/language_2/null_aware/access_test.dart
index 4965ccb..7a216c9 100644
--- a/tests/language_2/null_aware/access_test.dart
+++ b/tests/language_2/null_aware/access_test.dart
@@ -35,19 +35,19 @@
   { int i = new C(1)?.v; Expect.equals(1, i); }
   { String s = new C(null)?.v; Expect.equals(null, s); }
   //           ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
   { C.staticInt = 1; int i = C?.staticInt; Expect.equals(1, i); }
   { h.C.staticInt = 1; int i = h.C?.staticInt; Expect.equals(1, i); }
   { C.staticInt = null; String s = C?.staticInt; Expect.equals(null, s); }
   //                               ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                  ^
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
   { h.C.staticInt = null; String s = h.C?.staticInt; Expect.equals(null, s); }
   //                                 ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                      ^
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
 
@@ -56,11 +56,11 @@
   // generated in the case of e1?.id.
   Expect.equals(null, nullC()?.bad);
   //                           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'bad' isn't defined for the class 'C'.
   { B b = new C(1); Expect.equals(1, b?.v); }
   //                                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'v' isn't defined for the class 'B'.
 
   // '?.' cannot be used to access toplevel properties in libraries imported via
@@ -73,10 +73,10 @@
   // Nor can it be used to access the hashCode getter on the class Type.
   Expect.throwsNoSuchMethodError(() => C?.hashCode);
   //                                      ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'hashCode'.
   Expect.throwsNoSuchMethodError(() => h.C?.hashCode);
   //                                        ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] Getter not found: 'hashCode'.
 }
diff --git a/tests/language_2/null_aware/assignment_test.dart b/tests/language_2/null_aware/assignment_test.dart
index 0b97167..22bde4f 100644
--- a/tests/language_2/null_aware/assignment_test.dart
+++ b/tests/language_2/null_aware/assignment_test.dart
@@ -56,20 +56,20 @@
   // The static type of e1?.v = e2 is the static type of e2.
   { D d = new D(new E()); G g = new G(); F f = (d?.v = g); Expect.identical(f, g); }
   { D d = new D(new E()); E e = new G(); F f = (d?.v = e); }
-  //                                           ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                            ^^^^^^^^
+  // [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); }
   { h.D.staticE = new h.E(); h.G g = new h.G(); h.F f = (h.D?.staticE = g); Expect.identical(f, g); }
   { D.staticE = new E(); E e = new G(); F f = (D?.staticE = e); }
-  //                                          ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                           ^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                              ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
   { h.D.staticE = new h.E(); h.E e = new h.G(); h.F f = (h.D?.staticE = e); }
-  //                                                    ^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                                     ^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                                          ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
 
@@ -77,11 +77,11 @@
   // also generated in the case of e1?.v = e2.
   Expect.equals(null, nullC()?.bad = bad());
   //                           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'bad' isn't defined for the class 'C'.
   { B b = new C(1); Expect.equals(2, b?.v = 2); }
   //                                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'v' isn't defined for the class 'B'.
 
   // e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
@@ -101,22 +101,22 @@
   // also generated in the case of e1?.v op= e2.
   nullC()?.bad = bad();
   //       ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'bad' isn't defined for the class 'C'.
   { B b = new C(1); b?.v += 2; }
   //                   ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'v' isn't defined for the class 'B'.
   //                   ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'v' isn't defined for the class 'B'.
   { D d = new D(new E()); F f = (d?.v += nullC()); }
   //                                     ^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] A value of type 'C' can't be assigned to a variable of type 'int'.
   { D d = new D(new E()); H h = (d?.v += 1); }
-  //                            ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                             ^^^^^^^^^
+  // [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 += nullC()); }
@@ -128,13 +128,13 @@
   // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   // [cfe] A value of type 'C' can't be assigned to a variable of type 'int'.
   { D.staticE = new E(); H h = (D?.staticE += 1); }
-  //                           ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                            ^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                               ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
   { h.D.staticE = new h.E(); h.H hh = (h.D?.staticE += 1); }
-  //                                  ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  //                                   ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                        ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
 
diff --git a/tests/language_2/null_aware/increment_decrement_test.dart b/tests/language_2/null_aware/increment_decrement_test.dart
index 2341f98..4e7796e 100644
--- a/tests/language_2/null_aware/increment_decrement_test.dart
+++ b/tests/language_2/null_aware/increment_decrement_test.dart
@@ -52,18 +52,18 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { h.E e1 = new h.E(); h.D.staticE = e1; h.E e2 = h.D?.staticE++; Expect.identical(e1, e2); }
   { G g = new G(); D.staticE = g; F f = D?.staticE++; Expect.identical(f, g); }
   //                                    ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                              ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
   { h.G g = new h.G(); h.D.staticE = g; h.F f = h.D?.staticE++; Expect.identical(f, g); }
   //                                            ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                                        ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
 
@@ -79,18 +79,18 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { h.E e1 = new h.E(); h.D.staticE = e1; h.E e2 = h.D?.staticE--; Expect.identical(e1, e2); }
   { G g = new G(); D.staticE = g; F f = D?.staticE--; Expect.identical(f, g); }
   //                                    ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                              ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
   { h.G g = new h.G(); h.D.staticE = g; h.F f = h.D?.staticE--; Expect.identical(f, g); }
   //                                            ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                                        ^
   // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
 
@@ -106,19 +106,19 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { D.staticE = new E(); H h = ++D?.staticE; Expect.identical(D.staticE, h); }
   //                           ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
   { h.D.staticE = new h.E(); h.H hh = ++h.D?.staticE; Expect.identical(h.D.staticE, hh); }
   //                                  ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                         ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
 
@@ -134,19 +134,19 @@
   { 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] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [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); }
   { D.staticE = new E(); H h = --D?.staticE; Expect.identical(D.staticE, h); }
   //                           ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
   { h.D.staticE = new h.E(); h.H hh = --h.D?.staticE; Expect.identical(h.D.staticE, hh); }
   //                                  ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                                         ^
   // [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
 }
diff --git a/tests/language_2/null_aware/invocation_test.dart b/tests/language_2/null_aware/invocation_test.dart
index 03c3ddb..e882353 100644
--- a/tests/language_2/null_aware/invocation_test.dart
+++ b/tests/language_2/null_aware/invocation_test.dart
@@ -41,23 +41,23 @@
   { int i = new C()?.g(() => 1); Expect.equals(1, i); }
   { String s = nullC()?.g(bad()); Expect.equals(null, s); }
   //           ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
   { String s = new C()?.g(() => null); Expect.equals(null, s); }
   //           ^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
   { int i = C?.staticG(() => 1); Expect.equals(1, i); }
   { int i = h.C?.staticG(() => 1); Expect.equals(1, i); }
   { String s = C?.staticG(() => null); Expect.equals(null, s); }
   //           ^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //              ^
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
   { String s = h.C?.staticG(() => null); Expect.equals(null, s); }
   //           ^^^^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //                ^
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
 
@@ -66,7 +66,7 @@
   // generated in the case of o?.m(...).
   { B b = new C(); Expect.equals(1, b?.f(() => 1)); }
   //                                   ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'f' isn't defined for the class 'B'.
   { int i = 1; Expect.equals(null, nullC()?.f(i)); }
   //                                          ^
@@ -83,10 +83,10 @@
   // Nor can it be used to access the toString method on the class Type.
   Expect.throwsNoSuchMethodError(() => C?.toString());
   //                                      ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.toString'.
   Expect.throwsNoSuchMethodError(() => h.C?.toString());
   //                                        ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.toString'.
 }
diff --git a/tests/language_2/number/identifier_test.dart b/tests/language_2/number/identifier_test.dart
index 7b575c5..d66bf6b 100644
--- a/tests/language_2/number/identifier_test.dart
+++ b/tests/language_2/number/identifier_test.dart
@@ -68,7 +68,7 @@
   Expect.equals(1e+2, 1e+2 as double);
   Expect.throwsNoSuchMethodError(() => 1.e+2);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'e' isn't defined for the class 'int'.
   1d;
 //^
@@ -86,11 +86,11 @@
 // [cfe] Getter not found: 'D'.
   Expect.throwsNoSuchMethodError(() => 1.d+2);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'int'.
   Expect.throwsNoSuchMethodError(() => 1.D+2);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'D' isn't defined for the class 'int'.
   1.1d;
 //^^^
diff --git a/tests/language_2/override/method_with_field_test.dart b/tests/language_2/override/method_with_field_test.dart
index edd17fd..7d31ba2 100644
--- a/tests/language_2/override/method_with_field_test.dart
+++ b/tests/language_2/override/method_with_field_test.dart
@@ -31,7 +31,7 @@
   Expect.equals(42, s.superInstanceMethod());
   Expect.equals(42, sup.superInstanceMethod());
   //                    ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'superInstanceMethod' isn't defined for the class 'Super'.
   Expect.equals(42, sub.superInstanceMethod());
 }
diff --git a/tests/language_2/prefix/shadow_test.dart b/tests/language_2/prefix/shadow_test.dart
index 1680b1e..1af4c58 100644
--- a/tests/language_2/prefix/shadow_test.dart
+++ b/tests/language_2/prefix/shadow_test.dart
@@ -27,7 +27,7 @@
     var result = 0;
     result = lib10.Library10.static_fld;
     //             ^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'Library10' isn't defined for the class 'int'.
     Expect.equals(4, result);
   }
diff --git a/tests/language_2/prefix/transitive_import_test.dart b/tests/language_2/prefix/transitive_import_test.dart
index 582b3e2..ef53584 100644
--- a/tests/language_2/prefix/transitive_import_test.dart
+++ b/tests/language_2/prefix/transitive_import_test.dart
@@ -16,6 +16,6 @@
   // Variable should not be visible.
   lib12.top_level11;
   //    ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
   // [cfe] Getter not found: 'top_level11'.
 }
diff --git a/tests/language_2/private/access_test.dart b/tests/language_2/private/access_test.dart
index cbfef18..6e10558 100644
--- a/tests/language_2/private/access_test.dart
+++ b/tests/language_2/private/access_test.dart
@@ -10,13 +10,13 @@
 main() {
   _function();
 //^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
 // [cfe] Method not found: '_function'.
   private._function();
 //^
 // [cfe] Method not found: '_function'.
 //        ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
   new _Class();
   //  ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
@@ -25,7 +25,7 @@
 //^
 // [cfe] Method not found: '_Class'.
 //        ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
   new Class._constructor();
   //        ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.NEW_WITH_UNDEFINED_CONSTRUCTOR
diff --git a/tests/language_2/private/member3_test.dart b/tests/language_2/private/member3_test.dart
index eba3211..557a9e6 100644
--- a/tests/language_2/private/member3_test.dart
+++ b/tests/language_2/private/member3_test.dart
@@ -10,7 +10,7 @@
   test() {
     _fun();
 //  ^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
 // [cfe] The method '_fun' isn't defined for the class 'Test'.
   }
 }
diff --git a/tests/language_2/regress/regress11724_test.dart b/tests/language_2/regress/regress11724_test.dart
index ddf3925..a408da1 100644
--- a/tests/language_2/regress/regress11724_test.dart
+++ b/tests/language_2/regress/regress11724_test.dart
@@ -7,6 +7,6 @@
 void main() {
   method(<int>[]);
 //^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
 // [cfe] Method not found: 'method'.
 }
diff --git a/tests/language_2/regress/regress1363_test.dart b/tests/language_2/regress/regress1363_test.dart
index cd7df8f..27f02c2 100644
--- a/tests/language_2/regress/regress1363_test.dart
+++ b/tests/language_2/regress/regress1363_test.dart
@@ -24,7 +24,7 @@
     C contents = myCup.getContents(); // expect no warning or error
     contents = libCup.getContents();
     //         ^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //                ^
     // [cfe] A value of type 'C/*1*/' can't be assigned to a variable of type 'C/*2*/'.
   }
diff --git a/tests/language_2/regress/regress18628_1_test.dart b/tests/language_2/regress/regress18628_1_test.dart
index 3f2bef3..214f9aa 100644
--- a/tests/language_2/regress/regress18628_1_test.dart
+++ b/tests/language_2/regress/regress18628_1_test.dart
@@ -13,7 +13,7 @@
   // line just doesn't make sense without this line.
   T t = int;
   //    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Type' can't be assigned to a variable of type 'T'.
 }
 
diff --git a/tests/language_2/regress/regress21912_test.dart b/tests/language_2/regress/regress21912_test.dart
index 46e6e58..eaacaad 100644
--- a/tests/language_2/regress/regress21912_test.dart
+++ b/tests/language_2/regress/regress21912_test.dart
@@ -19,11 +19,11 @@
     Function2<Function2<int, double>, Function2<int, double>> left;
     left = t1;
     //     ^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
     left = t2;
     //     ^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     // [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
   }
 }
diff --git a/tests/language_2/regress/regress22976_test.dart b/tests/language_2/regress/regress22976_test.dart
index 63180f8..de83e9b 100644
--- a/tests/language_2/regress/regress22976_test.dart
+++ b/tests/language_2/regress/regress22976_test.dart
@@ -20,7 +20,7 @@
   A<int> a0 = c1;
   A<int> a1 = c2;
   //          ^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe] A value of type 'C<String, int>' can't be assigned to a variable of type 'A<int>'.
 }
diff --git a/tests/language_2/regress/regress34489_test.dart b/tests/language_2/regress/regress34489_test.dart
index a29cab8..7fba3cb 100644
--- a/tests/language_2/regress/regress34489_test.dart
+++ b/tests/language_2/regress/regress34489_test.dart
@@ -9,6 +9,6 @@
 main() {
   new C().field = 'bad';
   //              ^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'Type'.
 }
diff --git a/tests/language_2/regress/regress34495_test.dart b/tests/language_2/regress/regress34495_test.dart
index 41e58bf..2e69b38 100644
--- a/tests/language_2/regress/regress34495_test.dart
+++ b/tests/language_2/regress/regress34495_test.dart
@@ -7,7 +7,7 @@
 // [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
 // [cfe] Method not found: 'A'.
 //            ^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
 // [cfe] 'B' isn't a type.
 
 main() {}
diff --git a/tests/language_2/regress/regress35043_test.dart b/tests/language_2/regress/regress35043_test.dart
index 884f707..d8c1b75 100644
--- a/tests/language_2/regress/regress35043_test.dart
+++ b/tests/language_2/regress/regress35043_test.dart
@@ -4,7 +4,7 @@
 
 final foo = Map<int>();
 //          ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 2 type arguments.
 
 main() {}
diff --git a/tests/language_2/rewrite/implicit_this_test.dart b/tests/language_2/rewrite/implicit_this_test.dart
index 078dcd2..28adbcf 100644
--- a/tests/language_2/rewrite/implicit_this_test.dart
+++ b/tests/language_2/rewrite/implicit_this_test.dart
@@ -20,7 +20,7 @@
   shadow_y_parameter(y) {
         return x + this.y + y;
         //              ^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'y' isn't defined for the class 'Foo'.
   }
 
@@ -28,7 +28,7 @@
     var y = z;
         return x + this.y + y;
         //              ^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'y' isn't defined for the class 'Foo'.
   }
 
@@ -37,7 +37,7 @@
     foo() {
             return x + this.y + y;
             //              ^
-            // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+            // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
             // [cfe] The getter 'y' isn't defined for the class 'Foo'.
     }
     return foo();
@@ -47,7 +47,7 @@
     foo(y) {
             return x + this.y + y;
             //              ^
-            // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+            // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
             // [cfe] The getter 'y' isn't defined for the class 'Foo'.
     }
     return foo(z);
@@ -58,7 +58,7 @@
       var y = z;
             return x + this.y + y;
             //              ^
-            // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+            // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
             // [cfe] The getter 'y' isn't defined for the class 'Foo'.
     }
 
@@ -117,10 +117,10 @@
   shadow_x_toplevel() {
         return x + this.y + toplevel + this.toplevel;
         //              ^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'y' isn't defined for the class 'Foo'.
         //                                  ^^^^^^^^
-        // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+        // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
         // [cfe] The getter 'toplevel' isn't defined for the class 'Foo'.
   }
 }
diff --git a/tests/language_2/setter/no_getter_call_test.dart b/tests/language_2/setter/no_getter_call_test.dart
index 77b06dc..a49d8e4 100644
--- a/tests/language_2/setter/no_getter_call_test.dart
+++ b/tests/language_2/setter/no_getter_call_test.dart
@@ -23,7 +23,7 @@
 
   x = topLevel(3);
   //  ^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
   // [cfe] Getter not found: 'topLevel'.
   Expect.equals(6, x);
 }
diff --git a/tests/language_2/setter/no_getter_test.dart b/tests/language_2/setter/no_getter_test.dart
index f2ea3e3..53c8b58 100644
--- a/tests/language_2/setter/no_getter_test.dart
+++ b/tests/language_2/setter/no_getter_test.dart
@@ -17,6 +17,6 @@
   Example ex = new Example();
   print(ex.foo++);
   //       ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'foo' isn't defined for the class 'Example'.
 }
diff --git a/tests/language_2/static/field1_test.dart b/tests/language_2/static/field1_test.dart
index e4e1472..7c3c338 100644
--- a/tests/language_2/static/field1_test.dart
+++ b/tests/language_2/static/field1_test.dart
@@ -14,7 +14,7 @@
       var foo = new Foo();
       var x = foo.x;
       //          ^
-      // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+      // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
       // [cfe] The getter 'x' isn't defined for the class 'Foo'.
     }
   }
diff --git a/tests/language_2/static/field1a_test.dart b/tests/language_2/static/field1a_test.dart
index 9d7f2f2..27a336d 100644
--- a/tests/language_2/static/field1a_test.dart
+++ b/tests/language_2/static/field1a_test.dart
@@ -14,7 +14,7 @@
       var foo = new Foo();
       var m = foo.m;
       //          ^
-      // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+      // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
       // [cfe] The getter 'm' isn't defined for the class 'Foo'.
     }
   }
diff --git a/tests/language_2/static/field3_test.dart b/tests/language_2/static/field3_test.dart
index 0498f48..f794e68 100644
--- a/tests/language_2/static/field3_test.dart
+++ b/tests/language_2/static/field3_test.dart
@@ -21,7 +21,7 @@
     // [cfe] Getter not found: 'm'.
     Foo.m = 1;
     //  ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
     // [cfe] Setter not found: 'm'.
     Foo.x = 1;
     //  ^
diff --git a/tests/language_2/string/interpolation_test.dart b/tests/language_2/string/interpolation_test.dart
index 8fd6fac..debcbf3 100644
--- a/tests/language_2/string/interpolation_test.dart
+++ b/tests/language_2/string/interpolation_test.dart
@@ -60,7 +60,7 @@
     if (alwaysFalse) {
       "${i.toHorse()}";
       //   ^^^^^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
       // [cfe] The method 'toHorse' isn't defined for the class 'int'.
     }
 
diff --git a/tests/language_2/string/no_operator_test.dart b/tests/language_2/string/no_operator_test.dart
index d5d013c..a7eabf7 100644
--- a/tests/language_2/string/no_operator_test.dart
+++ b/tests/language_2/string/no_operator_test.dart
@@ -9,23 +9,23 @@
   var y = "y";
   Expect.throws(() => x < y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<' isn't defined for the class 'String'.
   Expect.throws(() => x <= y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<=' isn't defined for the class 'String'.
   Expect.throws(() => x > y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>' isn't defined for the class 'String'.
   Expect.throws(() => x >= y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>=' isn't defined for the class 'String'.
   Expect.throws(() => x - y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '-' isn't defined for the class 'String'.
   Expect.throws(() => x * y);
   //                      ^
@@ -33,42 +33,42 @@
   // [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
   Expect.throws(() => x / y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '/' isn't defined for the class 'String'.
   Expect.throws(() => x ~/ y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '~/' isn't defined for the class 'String'.
   Expect.throws(() => x % y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '%' isn't defined for the class 'String'.
   Expect.throws(() => x >> y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>>' isn't defined for the class 'String'.
   Expect.throws(() => x << y);
   //                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<<' isn't defined for the class 'String'.
   Expect.throws(() => x & y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '&' isn't defined for the class 'String'.
   Expect.throws(() => x | y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '|' isn't defined for the class 'String'.
   Expect.throws(() => x ^ y);
   //                    ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '^' isn't defined for the class 'String'.
   Expect.throws(() => -x);
   //                  ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator 'unary-' isn't defined for the class 'String'.
   Expect.throws(() => ~x);
   //                  ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '~' isn't defined for the class 'String'.
 }
diff --git a/tests/language_2/string/string_test.dart b/tests/language_2/string/string_test.dart
index da6d40a..68cca75 100644
--- a/tests/language_2/string/string_test.dart
+++ b/tests/language_2/string/string_test.dart
@@ -33,7 +33,7 @@
     String a = "Hello";
     a[1] = 12;
 //   ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
 // [cfe] The operator '[]=' isn't defined for the class 'String'.
   }
 
diff --git a/tests/language_2/super/assign_test.dart b/tests/language_2/super/assign_test.dart
index d3c1b90..3e77ef5 100644
--- a/tests/language_2/super/assign_test.dart
+++ b/tests/language_2/super/assign_test.dart
@@ -17,6 +17,6 @@
   a.x = 37;
   a.setX(42);
   //^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] The method 'setX' isn't defined for the class 'A'.
 }
diff --git a/tests/language_2/super/conditional_operator_test.dart b/tests/language_2/super/conditional_operator_test.dart
index cd2d498..5c41ab4 100644
--- a/tests/language_2/super/conditional_operator_test.dart
+++ b/tests/language_2/super/conditional_operator_test.dart
@@ -52,7 +52,7 @@
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     !super?.field;
 //   ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_NEGATION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_NEGATION_EXPRESSION
 //        ^^
 // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
 // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
diff --git a/tests/language_2/symbol/literal_test.dart b/tests/language_2/symbol/literal_test.dart
index 268b610..976158f 100644
--- a/tests/language_2/symbol/literal_test.dart
+++ b/tests/language_2/symbol/literal_test.dart
@@ -46,7 +46,7 @@
   // Tries to call the symbol literal #a.toString
   Expect.throwsNoSuchMethodError(() => #a.toString());
   //                                   ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
   //                                              ^
   // [cfe] The method 'call' isn't defined for the class 'Symbol'.
 }
diff --git a/tests/language_2/sync_star/generator1_test.dart b/tests/language_2/sync_star/generator1_test.dart
index 79b294d..ef6bd9b 100644
--- a/tests/language_2/sync_star/generator1_test.dart
+++ b/tests/language_2/sync_star/generator1_test.dart
@@ -48,7 +48,7 @@
   // Throws type error: yielded object is not an iterable.
   yield* 3;
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+  // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
   // [cfe] A value of type 'int' can't be assigned to a variable of type 'Iterable<dynamic>'.
 }
 
diff --git a/tests/language_2/this/conditional_operator_test.dart b/tests/language_2/this/conditional_operator_test.dart
index 75f711c..9ccddb2 100644
--- a/tests/language_2/this/conditional_operator_test.dart
+++ b/tests/language_2/this/conditional_operator_test.dart
@@ -21,7 +21,7 @@
     //^^^^^^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
     // [error line 15, column 11, length 0]
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] Expected '.' before this.
     //    ^^
     // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language_2/type_object/first_class_types_literals_test.dart b/tests/language_2/type_object/first_class_types_literals_test.dart
index e8fdca5..663e516 100644
--- a/tests/language_2/type_object/first_class_types_literals_test.dart
+++ b/tests/language_2/type_object/first_class_types_literals_test.dart
@@ -54,46 +54,46 @@
   // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
   // [cfe] Can't assign to a type literal.
   //                                       ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   Expect.throwsNoSuchMethodError(() => C++);
   //                                   ^
   // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
   // [cfe] Can't assign to a type literal.
   //                                    ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   Expect.throwsNoSuchMethodError(() => C + 1);
   //                                     ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '+' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => C[2]);
   //                                    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => C[2] = 'hest');
   //                                    ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic = 1);
   //                                   ^
   // [cfe] Can't assign to a type literal.
   //                                             ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   Expect.throwsNoSuchMethodError(() => dynamic++);
   //                                   ^
   // [cfe] Can't assign to a type literal.
   //                                          ^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   Expect.throwsNoSuchMethodError(() => dynamic + 1);
   //                                           ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '+' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic[2]);
   //                                          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic[2] = 'hest');
   //                                          ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]=' isn't defined for the class 'Type'.
 
   Expect.equals((dynamic).toString(), 'dynamic');
diff --git a/tests/language_2/type_promotion/assign_test.dart b/tests/language_2/type_promotion/assign_test.dart
index 38f8f55..35d99d8 100644
--- a/tests/language_2/type_promotion/assign_test.dart
+++ b/tests/language_2/type_promotion/assign_test.dart
@@ -33,7 +33,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     a = null;
   }
@@ -42,14 +42,14 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   if (a is B) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     {
       a = null;
@@ -57,7 +57,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
diff --git a/tests/language_2/type_promotion/closure_test.dart b/tests/language_2/type_promotion/closure_test.dart
index 9fb7568..2e6fec9 100644
--- a/tests/language_2/type_promotion/closure_test.dart
+++ b/tests/language_2/type_promotion/closure_test.dart
@@ -55,7 +55,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   void foo() {
@@ -73,7 +73,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -88,7 +88,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     void foo() {
       a = new D();
@@ -97,7 +97,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -112,7 +112,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     void foo() {
       a = new D();
@@ -121,7 +121,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -140,7 +140,7 @@
   if (a is B) {
     func(() => a.b);
     //           ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
     print(a.a);
   }
@@ -154,7 +154,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   a = null;
@@ -167,7 +167,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   a = null;
@@ -187,7 +187,7 @@
   if (a is B
       && func(() => a.b)
       //              ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       ) {
     print(a.a);
@@ -199,7 +199,7 @@
   A a = new E();
   var b = a is B ? func(() => a.b) : false;
   //                            ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   a = null;
 }
@@ -210,7 +210,7 @@
     func(() => a[0]);
     print(a[0].b);
     //         ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   a = null;
@@ -222,7 +222,7 @@
     func(() => a[0] = null);
     print(a[0].b);
     //         ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   a = null;
@@ -235,7 +235,7 @@
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
   a = null;
diff --git a/tests/language_2/type_promotion/functions_test.dart b/tests/language_2/type_promotion/functions_test.dart
index 590f1cc..30de4c1 100644
--- a/tests/language_2/type_promotion/functions_test.dart
+++ b/tests/language_2/type_promotion/functions_test.dart
@@ -87,7 +87,7 @@
     b = funcDynToDyn(new B());
     c = funcDynToDyn(new C());
     //  ^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //              ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
@@ -124,7 +124,7 @@
     b = funcDynToVoid(new B());
     c = funcDynToVoid(new C());
     //  ^^^^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //               ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
@@ -136,7 +136,7 @@
   b = funcDynToA(new B());
   c = funcDynToA(new C());
   //  ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //            ^
   // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
 
@@ -146,7 +146,7 @@
     b = funcDynToA(new B());
     c = funcDynToA(new C());
     //  ^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //            ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
@@ -157,7 +157,7 @@
     b = funcDynToA(new B());
     c = funcDynToA(new C());
     //  ^^^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //            ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
   }
diff --git a/tests/language_2/type_promotion/local_test.dart b/tests/language_2/type_promotion/local_test.dart
index c0fe87d..85b0386 100644
--- a/tests/language_2/type_promotion/local_test.dart
+++ b/tests/language_2/type_promotion/local_test.dart
@@ -32,15 +32,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is B) {
@@ -48,11 +48,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
 
     if (a is C) {
@@ -61,7 +61,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -69,11 +69,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is C) {
@@ -82,7 +82,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     if (a is B) {
@@ -91,7 +91,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
     if (a is D) {
@@ -100,7 +100,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -109,33 +109,33 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is D) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
@@ -143,15 +143,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   var o1 = a is B
@@ -159,24 +159,24 @@
               '${a.b}'
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -186,20 +186,20 @@
               '${a.c}'
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -207,25 +207,25 @@
           ? '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'D'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'D'.
               '${a.d}'
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -234,11 +234,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is B && a is C) {
@@ -247,7 +247,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is B) {
@@ -256,7 +256,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is D) {
@@ -265,18 +265,18 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is D && a is C) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
diff --git a/tests/language_2/type_promotion/logical_and_test.dart b/tests/language_2/type_promotion/logical_and_test.dart
index 7dc5b2b..79945ba 100644
--- a/tests/language_2/type_promotion/logical_and_test.dart
+++ b/tests/language_2/type_promotion/logical_and_test.dart
@@ -33,19 +33,19 @@
   if (a is D && ((a = new D()) != null)) {
     b = a.d;
     //    ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   }
   if (a is D && (b = a.d)) {
     b = a.d;
     //    ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'A'.
     a = null;
   }
   if ((((a) is D) && (b = (a).d))) {
     b = a.d;
     //    ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'A'.
     a = null;
   }
diff --git a/tests/language_2/type_promotion/more_specific_test.dart b/tests/language_2/type_promotion/more_specific_test.dart
index ec19e52..2e7d840 100644
--- a/tests/language_2/type_promotion/more_specific_test.dart
+++ b/tests/language_2/type_promotion/more_specific_test.dart
@@ -48,7 +48,7 @@
     // No promotion C !<< A.
     x = a.c;
     //    ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'A'.
   }
   B b = new B();
@@ -60,7 +60,7 @@
     // Promotion A << dynamic.
     y = x.b;
     //    ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'A'.
   }
 }
@@ -78,12 +78,12 @@
     // Promotion: E<A> << D.
     int a = d1.d;
     //      ^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //         ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'int'.
     String b = d1.d;
     //         ^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     //            ^
     // [cfe] A value of type 'A' can't be assigned to a variable of type 'String'.
     x = d1.e;
@@ -94,7 +94,7 @@
     // No promotion: E !<< D<A>
     x = d2.e;
     //     ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'e' isn't defined for the class 'D<A>'.
   }
 
diff --git a/tests/language_2/type_promotion/multiple_test.dart b/tests/language_2/type_promotion/multiple_test.dart
index 8410597..21a2f7d 100644
--- a/tests/language_2/type_promotion/multiple_test.dart
+++ b/tests/language_2/type_promotion/multiple_test.dart
@@ -36,29 +36,29 @@
   print(a1.a);
   print(a1.b);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a1.c);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a1.d);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   print(a2.a);
   print(a2.b);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a2.c);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a2.d);
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a1 is B && a2 is C) {
@@ -66,11 +66,11 @@
     print(a1.b);
     print(a1.c);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a1.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
 
     print(a2.a);
@@ -78,7 +78,7 @@
     print(a2.c);
     print(a2.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     if (a1 is C && a2 is D) {
@@ -87,7 +87,7 @@
       print(a1.c);
       print(a1.d);
       //       ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
 
       print(a2.a);
@@ -95,7 +95,7 @@
       print(a2.c);
       print(a2.d);
       //       ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
   }
@@ -105,44 +105,44 @@
               '${a1.b}'
       '${a1.c}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       '${a1.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
               '${a2.a}'
               '${a2.b}'
               '${a2.c}'
       '${a2.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
           : '${a1.a}'
       '${a1.b}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a1.c}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a1.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
           '${a2.a}'
       '${a2.b}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a2.c}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a2.d}'
       //    ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -152,7 +152,7 @@
     print(a1.c);
     print(a1.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     print(a2.a);
@@ -160,7 +160,7 @@
     print(a2.c);
     print(a2.d);
     //       ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 }
diff --git a/tests/language_2/type_promotion/parameter_test.dart b/tests/language_2/type_promotion/parameter_test.dart
index b93d764..7ce7119 100644
--- a/tests/language_2/type_promotion/parameter_test.dart
+++ b/tests/language_2/type_promotion/parameter_test.dart
@@ -35,15 +35,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is B) {
@@ -51,11 +51,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
 
     if (a is C) {
@@ -64,7 +64,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -72,11 +72,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is C) {
@@ -85,7 +85,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
 
     if (a is B) {
@@ -94,7 +94,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
     if (a is D) {
@@ -103,7 +103,7 @@
       print(a.c);
       print(a.d);
       //      ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
     }
 
@@ -112,33 +112,33 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   if (a is D) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
@@ -146,15 +146,15 @@
   print(a.a);
   print(a.b);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'b' isn't defined for the class 'A'.
   print(a.c);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'c' isn't defined for the class 'A'.
   print(a.d);
   //      ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'd' isn't defined for the class 'A'.
 
   var o1 = a is B
@@ -162,24 +162,24 @@
               '${a.b}'
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -189,20 +189,20 @@
               '${a.c}'
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -210,25 +210,25 @@
           ? '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'D'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'D'.
               '${a.d}'
           : '${a.a}'
       '${a.b}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       '${a.c}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       '${a.d}'
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
       ;
 
@@ -237,11 +237,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if (a is B && a is C) {
@@ -250,7 +250,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is B) {
@@ -259,7 +259,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is C && a is D) {
@@ -268,18 +268,18 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if (a is D && a is C) {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
@@ -287,37 +287,37 @@
       a.a == ""
       && a.b == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'D'.
       && a.c == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'D'.
       &&
       a.d == "") {
     print(a.a);
     print(a.b);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'b' isn't defined for the class 'D'.
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'D'.
     print(a.d);
   }
   if (a.a == ""
       && a.b == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'b' isn't defined for the class 'A'.
       && a.c == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'A'.
       && a.d == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'A'.
           &&
           a is B &&
@@ -325,11 +325,11 @@
           a.b == ""
       && a.c == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'c' isn't defined for the class 'B'.
       && a.d == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'B'.
           &&
           a is C &&
@@ -338,7 +338,7 @@
           a.c == ""
       && a.d == ""
       //   ^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] The getter 'd' isn't defined for the class 'C'.
       ) {
     print(a.a);
@@ -346,7 +346,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
   if ((a is B)) {
@@ -354,11 +354,11 @@
     print(a.b);
     print(a.c);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'c' isn't defined for the class 'B'.
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'B'.
   }
   if ((a is B && (a) is C) && a is B) {
@@ -367,7 +367,7 @@
     print(a.c);
     print(a.d);
     //      ^
-    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
     // [cfe] The getter 'd' isn't defined for the class 'C'.
   }
 }
diff --git a/tests/language_2/type_variable/bound_access_test.dart b/tests/language_2/type_variable/bound_access_test.dart
index 77f8594..39d52ea 100644
--- a/tests/language_2/type_variable/bound_access_test.dart
+++ b/tests/language_2/type_variable/bound_access_test.dart
@@ -21,7 +21,7 @@
 
   num method2() => field1 + field2.length;
   //                               ^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'length' isn't defined for the class 'num'.
 }
 
diff --git a/tests/language_2/type_variable/conflict2_test.dart b/tests/language_2/type_variable/conflict2_test.dart
index 8b8439d..f43e609 100644
--- a/tests/language_2/type_variable/conflict2_test.dart
+++ b/tests/language_2/type_variable/conflict2_test.dart
@@ -14,13 +14,13 @@
   // This is equivalent to (T).call(). See issue 19725
   foo() => T();
   //       ^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
   // [cfe] Method not found: 'T'.
 
   // T is in scope, even in static context. Compile-time error to call this.T().
   static bar() => T();
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
   // [cfe] Method not found: 'T'.
   //              ^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
@@ -28,26 +28,26 @@
   // X is not in scope. NoSuchMethodError.
   static baz() => X();
   //              ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'X'.
 
   // Class 'C' has no static method 'T': NoSuchMethodError.
   static qux() => C.T();
   //                ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   // [cfe] Method not found: 'C.T'.
 
   // Class '_Type' has no instance method 'call': NoSuchMethodError.
   quux() => (T)();
   //        ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
   //           ^
   // [cfe] The method 'call' isn't defined for the class 'Type'.
 
   // Runtime type T not accessible from static context. Compile-time error.
   static corge() => (T)();
   //                ^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+  // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
   //                 ^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
   // [cfe] Type variables can't be used in static members.
@@ -57,7 +57,7 @@
   // Class '_Type' has no [] operator: NoSuchMethodError.
   grault() => T[0];
   //           ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
 
   // Runtime type T not accessible from static context. Compile-time error.
@@ -66,13 +66,13 @@
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
   // [cfe] Type variables can't be used in static members.
   //                  ^^^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '[]' isn't defined for the class 'Type'.
 
   // Class '_Type' has no member m: NoSuchMethodError.
   waldo() => T.m;
   //           ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm' isn't defined for the class 'Type'.
 
   // Runtime type T not accessible from static context. Compile-time error.
@@ -81,7 +81,7 @@
   // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
   // [cfe] Type variables can't be used in static members.
   //                 ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'm' isn't defined for the class 'Type'.
 }
 
diff --git a/tests/language_2/type_variable/scope_test.dart b/tests/language_2/type_variable/scope_test.dart
index 1b5cbb7..febaa5d 100644
--- a/tests/language_2/type_variable/scope_test.dart
+++ b/tests/language_2/type_variable/scope_test.dart
@@ -24,10 +24,10 @@
     // [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
     // [cfe] Type variables can't be used in static members.
     //         ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
     return new Foo<String>();
     //     ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   }
 
   // T is in scope for a factory method.
@@ -52,7 +52,7 @@
       // [cfe] Can only use type variables in instance methods.
     return new Foo<String>();
     //     ^^^^^^^^^^^^^^^^^
-    // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
   }
 
   static void set f(
@@ -76,7 +76,7 @@
   new I(new Foo<String>());
   Foo.f1 = new Foo<String>();
   //       ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe] A value of type 'Foo<String>' can't be assigned to a variable of type 'Foo<T>'.
   var x = Foo.f;
diff --git a/tests/language_2/unsorted/callable_test.dart b/tests/language_2/unsorted/callable_test.dart
index 75ff4c2..16dde13 100644
--- a/tests/language_2/unsorted/callable_test.dart
+++ b/tests/language_2/unsorted/callable_test.dart
@@ -42,12 +42,12 @@
   //^
   // [cfe] A value of type 'dynamic Function()' can't be assigned to a variable of type 'dynamic Function(int)'.
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   G g0 = y;
   //^
   // [cfe] A value of type 'dynamic Function(int)' can't be assigned to a variable of type 'dynamic Function(String)'.
   //     ^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
 
   Expect.equals(f(), 42);
   Expect.equals(g(100), 187);
diff --git a/tests/language_2/unsorted/invalid_type_argument_count_test.dart b/tests/language_2/unsorted/invalid_type_argument_count_test.dart
index 3a93da2..cf9619d 100644
--- a/tests/language_2/unsorted/invalid_type_argument_count_test.dart
+++ b/tests/language_2/unsorted/invalid_type_argument_count_test.dart
@@ -5,14 +5,14 @@
 // Test top level field.
 dynamic<int> x1 = 42;
 // [error line 6, column 1, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
 
 class Foo {
   // Test class member.
   dynamic<int> x2 = 42;
 // [error line 13, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
 
   Foo() {
@@ -28,7 +28,7 @@
   // Test local variable.
   dynamic<int> x3 = 42;
 // [error line 29, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
   print(x3);
 
@@ -38,7 +38,7 @@
 // Test parameter.
 void foo(dynamic<int> x4) {
 // [error line 39, column 10, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
 // [cfe] Expected 0 type arguments.
   print(x4);
 }
diff --git a/tests/language_2/variable/illegal_initializer_test.dart b/tests/language_2/variable/illegal_initializer_test.dart
index 1b99406..6924b69 100644
--- a/tests/language_2/variable/illegal_initializer_test.dart
+++ b/tests/language_2/variable/illegal_initializer_test.dart
@@ -24,7 +24,7 @@
       //   ^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
       //        ^^^
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
 
   B.c3() : super;
   //            ^
@@ -45,7 +45,7 @@
       //   ^^^^
       // [analyzer] SYNTACTIC_ERROR.MISSING_ASSIGNMENT_IN_INITIALIZER
       // [error line 39, column 16, length 0]
-      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
       // [cfe] Expected '.' before this.
       //       ^
       // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language_2/variable/ref_before_declaration_test.dart b/tests/language_2/variable/ref_before_declaration_test.dart
index 53f42bc..ee9ebc2 100644
--- a/tests/language_2/variable/ref_before_declaration_test.dart
+++ b/tests/language_2/variable/ref_before_declaration_test.dart
@@ -76,7 +76,7 @@
     //                   ^
     // [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
     //                   ^
-    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   }
 
   test() {
diff --git a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
index 71e14caa..e3e51d3 100644
--- a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
+++ b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
@@ -17,7 +17,7 @@
 // [cfe] Expected ')' before this.
   List<out String> bar;
   //  ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '<' isn't defined for the class 'Type'.
   //   ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
@@ -26,7 +26,7 @@
   // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
   // [cfe] Getter not found: 'out'.
   //             ^
-  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
   // [cfe] The operator '>' isn't defined for the class 'Type'.
   //               ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
diff --git a/tests/language_2/variance/variance_in_inference_error_test.dart b/tests/language_2/variance/variance_in_inference_error_test.dart
index 4e79966..f7ab3d4 100644
--- a/tests/language_2/variance/variance_in_inference_error_test.dart
+++ b/tests/language_2/variance/variance_in_inference_error_test.dart
@@ -32,7 +32,7 @@
   var inferredMiddle = inferContraContra(Contravariant<Upper>(), Contravariant<Middle>());
   upper = inferredMiddle;
   //      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Upper>'.
 
   // T <: Upper and T <: Lower.
@@ -40,7 +40,7 @@
   var inferredLower = inferContraContra(Contravariant<Upper>(), Contravariant<Lower>());
   upper = inferredLower;
   //      ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
 
   // int <: T <: String is not a valid constraint.
@@ -88,7 +88,7 @@
   var inferredContraUpper = inferContraBound(ContraBound(Lower(), (Upper x) {}));
   lower = inferredContraUpper;
   //      ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
 
   // Inference for Contrabound(...) produces Lower <: T <: Middle.
@@ -96,6 +96,6 @@
   var inferredContraMiddle = inferContraBound(ContraBound(Lower(), (Middle x) {}));
   lower = inferredContraMiddle;
   //      ^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
 }
diff --git a/tests/language_2/variance/variance_in_subtyping_error_test.dart b/tests/language_2/variance/variance_in_subtyping_error_test.dart
index 9779d33..4271fd0 100644
--- a/tests/language_2/variance/variance_in_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_in_subtyping_error_test.dart
@@ -70,7 +70,7 @@
   List<Contravariant<Lower>> listLower = [new Contravariant<Lower>()];
   iterableMiddle = listLower;
   //               ^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Contravariant<Lower>>' can't be assigned to a variable of type 'Iterable<Contravariant<Middle>>'.
 
   testCall(listLower);
diff --git a/tests/language_2/variance/variance_inout_subtyping_error_test.dart b/tests/language_2/variance/variance_inout_subtyping_error_test.dart
index 3bcec37..d994e6c 100644
--- a/tests/language_2/variance/variance_inout_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_inout_subtyping_error_test.dart
@@ -108,14 +108,14 @@
   List<Invariant<Middle>> listMiddle = [new Invariant<Middle>()];
   iterableLower = listMiddle;
   //              ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Invariant<Middle>>' can't be assigned to a variable of type 'Iterable<Invariant<Lower>>'.
 
   Iterable<Invariant<Middle>> iterableMiddle = [new Invariant<Middle>()];
   List<Invariant<Lower>> listLower = [new Invariant<Lower>()];
   iterableMiddle = listLower;
   //               ^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Invariant<Lower>>' can't be assigned to a variable of type 'Iterable<Invariant<Middle>>'.
 
   testCall<Lower>(listMiddle);
diff --git a/tests/language_2/variance/variance_out_inference_error_test.dart b/tests/language_2/variance/variance_out_inference_error_test.dart
index 809cdfb..ccce0d1 100644
--- a/tests/language_2/variance/variance_out_inference_error_test.dart
+++ b/tests/language_2/variance/variance_out_inference_error_test.dart
@@ -31,7 +31,7 @@
   var inferredMiddle = inferCovCov(Covariant<Lower>(), Covariant<Middle>());
   lower = inferredMiddle;
   //      ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
 
   // Lower <: T <: Upper.
@@ -39,7 +39,7 @@
   var inferredUpper = inferCovCov(Covariant<Lower>(), Covariant<Upper>());
   lower = inferredUpper;
   //      ^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
 
   // Inference for Covbound(...) produces Lower <: T <: Upper.
@@ -47,7 +47,7 @@
   var inferredCovLower = inferCovBound(CovBound(Lower(), (Upper x) {}));
   upper = inferredCovLower;
   //      ^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
 
   // Inference for Covbound(...) produces Lower <: T <: Middle.
@@ -55,6 +55,6 @@
   var inferredCovLower2 = inferCovBound(CovBound(Lower(), (Middle x) {}));
   middle = inferredCovLower2;
   //       ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Middle>'.
 }
diff --git a/tests/language_2/variance/variance_out_subtyping_error_test.dart b/tests/language_2/variance/variance_out_subtyping_error_test.dart
index dd925e2..2ddcd3e 100644
--- a/tests/language_2/variance/variance_out_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_out_subtyping_error_test.dart
@@ -70,7 +70,7 @@
   List<Covariant<Middle>> listMiddle = [new Covariant<Middle>()];
   iterableLower = listMiddle;
   //              ^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'List<Covariant<Middle>>' can't be assigned to a variable of type 'Iterable<Covariant<Lower>>'.
 
   testCall(listMiddle);
diff --git a/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart b/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
index 2c69097..a8e1f25 100644
--- a/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
+++ b/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
@@ -28,39 +28,39 @@
       exactly(condition ? Contravariant<Upper>() : Contravariant<Lower>());
   Exactly<Contravariant<Upper>> contraUpperExpected = contraLowerActual;
   //                                                  ^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Contravariant<Lower>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
 
   var contraMiddleActual =
       exactly(condition ? Contravariant<Upper>() : Contravariant<Middle>());
   contraUpperExpected = contraMiddleActual;
   //                    ^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Contravariant<Middle>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
 
   var covMiddleActual =
       exactly(condition ? Covariant<Middle>() : Covariant<Lower>());
   Exactly<Covariant<Lower>> covLowerExpected = covMiddleActual;
   //                                           ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Covariant<Middle>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
 
   var covUpperActual =
       exactly(condition ? Covariant<Upper>() : Covariant<Lower>());
   covLowerExpected = covUpperActual;
   //                 ^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Covariant<Upper>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
 
   var invObjectActual =
       exactly(condition ? Invariant<Upper>() : Invariant<Middle>());
   Exactly<Invariant<Middle>> invMiddleExpected = invObjectActual;
   //                                             ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Middle>>'.
   Exactly<Invariant<Upper>> invUpperExpected = invObjectActual;
   //                                           ^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Upper>>'.
 
   var legacyCovMiddleActual =
@@ -68,14 +68,14 @@
   Exactly<LegacyCovariant<Lower>> legacyCovLowerExpected =
       legacyCovMiddleActual;
   //  ^^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<LegacyCovariant<Middle>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
 
   var legacyCovUpperActual =
       exactly(condition ? LegacyCovariant<Upper>() : LegacyCovariant<Lower>());
   legacyCovLowerExpected = legacyCovUpperActual;
   //                       ^^^^^^^^^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<LegacyCovariant<Upper>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
 
   var multiActual = exactly(condition
@@ -83,20 +83,20 @@
       : Multi<Lower, Middle, Lower>());
   Exactly<Multi<Lower, Middle, Lower>> multiExpected = multiActual;
   //                                                   ^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Multi<Middle, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Multi<Lower, Middle, Lower>>'.
 
   var multiActual2 = exactly(
       condition ? Multi<Middle, int, Middle>() : Multi<Lower, Middle, Lower>());
   Exactly<Multi<Middle, Object, Lower>> multiObjectExpected = multiActual2;
   //                                                          ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Multi<Middle, Object, Lower>>'.
 
   var multiActual3 = exactly(
       condition ? Multi<int, Middle, Middle>() : Multi<Lower, Middle, Lower>());
   Exactly<Object> multiObjectExpected2 = multiActual3;
   //                                     ^^^^^^^^^^^^
-  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   // [cfe] A value of type 'Exactly<Multi<Object, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Object>'.
 }
diff --git a/tests/lib/html/js_function_getter_trust_types/compile_test.dart b/tests/lib/html/js_function_getter_trust_types/compile_test.dart
index 9cbbe1f..e7481d1 100644
--- a/tests/lib/html/js_function_getter_trust_types/compile_test.dart
+++ b/tests/lib/html/js_function_getter_trust_types/compile_test.dart
@@ -18,25 +18,25 @@
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.nonFunctionStatic(0);
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.nonFunctionStatic(0, 0);
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.nonFunctionStatic(0, 0, 0, 0, 0, 0);
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.add(4);
   //         ^
diff --git a/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart b/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
index 9cbbe1f..e7481d1 100644
--- a/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
+++ b/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
@@ -18,25 +18,25 @@
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.nonFunctionStatic(0);
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.nonFunctionStatic(0, 0);
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.nonFunctionStatic(0, 0, 0, 0, 0, 0);
 //        ^
 // [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
 //^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
 
   foo.bar.add(4);
   //         ^
diff --git a/tests/standalone/check_for_aot_snapshot_jit_test.dart b/tests/standalone/check_for_aot_snapshot_jit_test.dart
new file mode 100644
index 0000000..851dc0c5
--- /dev/null
+++ b/tests/standalone/check_for_aot_snapshot_jit_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+  final buildDir = path.dirname(Platform.executable);
+  final sdkDir = path.dirname(path.dirname(buildDir));
+  final platformDill = path.join(buildDir, 'vm_platform_strong.dill');
+  final genSnapshot = path.join(buildDir, 'gen_snapshot');
+
+  final exePath = Platform.resolvedExecutable;
+  final genSnapshotPath =
+      Uri.parse(Platform.executable).resolve('gen_snapshot').path;
+  final powTest = Platform.script.resolve('pow_test.dart').path;
+  final d = Directory.systemTemp.createTempSync('aot_tmp');
+  final kernelOutput = d.uri.resolve('pow_test.dill').path;
+  final aotOutput = d.uri.resolve('pow_test.aot').path;
+
+  final genKernelResult = Process.runSync(
+    'pkg/vm/tool/gen_kernel',
+    [
+      '--aot',
+      '--platform=$platformDill',
+      '-o',
+      kernelOutput,
+      powTest,
+    ],
+  );
+  Expect.equals(genKernelResult.exitCode, 0);
+
+  final genAotResult = Process.runSync(
+    genSnapshot,
+    [
+      '--snapshot_kind=app-aot-elf',
+      '--elf=$aotOutput',
+      kernelOutput,
+    ],
+  );
+  Expect.equals(genAotResult.exitCode, 0);
+
+  final runAotResult = Process.runSync(
+    exePath,
+    [
+      'run',
+      aotOutput,
+    ],
+  );
+  Expect.equals(runAotResult.exitCode, 255);
+  Expect.stringContainsInOrder(
+    runAotResult.stderr,
+    [
+      "pow_test.aot is an AOT snapshot and should be run with 'dartaotruntime'",
+    ],
+  );
+}
diff --git a/tests/standalone/io/http_ban_http_embedder_test.dart b/tests/standalone/io/http_ban_http_embedder_test.dart
deleted file mode 100644
index 7fd3cb3..0000000
--- a/tests/standalone/io/http_ban_http_embedder_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// 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.
-
-// SharedOptions=-Ddart.library.io.allow_http=false
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-import 'http_ban_http_normal_test.dart';
-import 'http_bind_test.dart';
-
-Future<void> testWithHostname() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, httpUri) async {
-    asyncExpectThrows(
-        () async => await httpClient.getUrl(httpUri), (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: 'foo'}),
-        (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: false}),
-        (e) => e is StateError);
-    await asyncTest(() => runZoned(() => httpClient.getUrl(httpUri),
-        zoneValues: {#dart.library.io.allow_http: true}));
-  });
-}
-
-Future<void> testWithLoopback() async {
-  await testBanHttp("127.0.0.1", (httpClient, uri) async {
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://localhost:${uri.port}')));
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://127.0.0.1:${uri.port}')));
-  });
-}
-
-Future<void> testWithIPv6() async {
-  if (await supportsIPV6()) {
-    await testBanHttp("::1", (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-  }
-}
-
-Future<void> testWithHTTPS() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, uri) async {
-    asyncExpectThrows(
-        () => httpClient.getUrl(Uri(
-              scheme: 'https',
-              host: uri.host,
-              port: uri.port,
-            )),
-        (e) => e is SocketException || e is HandshakeException);
-  });
-}
-
-main() {
-  asyncStart();
-  Future.wait(<Future>[
-    testWithHostname(),
-    testWithLoopback(),
-    testWithIPv6(),
-    testWithHTTPS(),
-  ]).then((_) => asyncEnd());
-}
diff --git a/tests/standalone/io/http_ban_http_normal_test.dart b/tests/standalone/io/http_ban_http_normal_test.dart
deleted file mode 100644
index 118dd4c..0000000
--- a/tests/standalone/io/http_ban_http_normal_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-Future<String> getLocalHostIP() async {
-  final interfaces = await NetworkInterface.list(
-      includeLoopback: false, type: InternetAddressType.IPv4);
-  return interfaces.first.addresses.first.address;
-}
-
-Future<void> testBanHttp(String serverHost,
-    Future<void> testCode(HttpClient client, Uri uri)) async {
-  final httpClient = new HttpClient();
-  final server = await HttpServer.bind(serverHost, 0);
-  final uri = Uri(scheme: 'http', host: serverHost, port: server.port);
-  try {
-    await testCode(httpClient, uri);
-  } finally {
-    httpClient.close(force: true);
-    await server.close();
-  }
-}
-
-main() async {
-  await asyncTest(() async {
-    final host = await getLocalHostIP();
-    // Normal HTTP request succeeds.
-    await testBanHttp(host, (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-    // We can ban HTTP explicitly.
-    await testBanHttp(host, (httpClient, uri) async {
-      asyncExpectThrows(
-          () async => await runZoned(() => httpClient.getUrl(uri),
-              zoneValues: {#dart.library.io.allow_http: false}),
-          (e) => e is StateError);
-    });
-  });
-}
diff --git a/tests/standalone/io/network_policy_configuration_test.dart b/tests/standalone/io/network_policy_configuration_test.dart
new file mode 100644
index 0000000..6ee1bf0
--- /dev/null
+++ b/tests/standalone/io/network_policy_configuration_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["foobar.com",true,true],["foobar.com",true,true],["baz.foobar.com",true,true],["baz.foobar.com",false,false]] -Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void _checkAllows(List<String> domains) {
+  for (final domain in domains) {
+    Expect.isTrue(
+        isInsecureConnectionAllowed(domain), "$domain should be allowed.");
+  }
+}
+
+void _checkDenies(List<String> domains) {
+  for (final domain in domains) {
+    Expect.isFalse(
+        isInsecureConnectionAllowed(domain), "$domain should not be allowed.");
+  }
+}
+
+void main() {
+  // These have no policy but the default is false.
+  _checkDenies(["mailfoobar.com", "abc.com", "oobar.com", "foobar.co"]);
+  // These are explicitly denied.
+  _checkDenies(["baz.foobar.com"]);
+  _checkAllows(
+      ["foobar.com", "test.baz.foobar.com", "test2.test.baz.foobar.com"]);
+}
diff --git a/tests/standalone/io/network_policy_invalid_domain_test.dart b/tests/standalone/io/network_policy_invalid_domain_test.dart
new file mode 100644
index 0000000..971996c
--- /dev/null
+++ b/tests/standalone/io/network_policy_invalid_domain_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["com",true,true]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+// This test passes in an invalid domain as a network policy and checks that
+// loading the policies throws.
+void main() {
+  Expect.throwsArgumentError(() => isInsecureConnectionAllowed("test.com"));
+}
diff --git a/tests/standalone/io/network_policy_tie_breaker_test.dart b/tests/standalone/io/network_policy_tie_breaker_test.dart
new file mode 100644
index 0000000..c25d3ac
--- /dev/null
+++ b/tests/standalone/io/network_policy_tie_breaker_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["baz.foobar.com",true,true],["baz.foobar.com",false,false]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void main() {
+  Expect.isFalse(isInsecureConnectionAllowed("baz.foobar.com"));
+  Expect.isTrue(isInsecureConnectionAllowed("test.baz.foobar.com"));
+}
diff --git a/tests/standalone/io/socket_network_policy_localhost_test.dart b/tests/standalone/io/socket_network_policy_localhost_test.dart
new file mode 100644
index 0000000..957f894
--- /dev/null
+++ b/tests/standalone/io/socket_network_policy_localhost_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test whether localhost connection succeeds even when insecure connections
+// are banned by default.
+// SharedOptions=-Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnectionByDefault() {
+  asyncExpectThrows(
+      () async => await Socket.connect("domain.invalid", 80),
+      (e) =>
+          e is SocketException &&
+          e.message.contains(
+              "Insecure socket connections are disallowed by platform"));
+}
+
+Future<void> testLocalhostConnection() async {
+  ServerSocket server =
+      await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
+  Socket? socket;
+  try {
+    server.listen((_) {});
+    socket = await Socket.connect(InternetAddress.loopbackIPv4, server.port);
+  } finally {
+    server.close();
+    if (socket != null) {
+      socket.close();
+      await socket.done;
+      socket.destroy();
+    }
+  }
+}
+
+Future<void> test() async {
+  testDisallowedConnectionByDefault();
+  await testLocalhostConnection();
+}
+
+void main() {
+  asyncStart();
+  test().whenComplete(() => asyncEnd());
+}
diff --git a/tests/standalone/io/socket_network_policy_test.dart b/tests/standalone/io/socket_network_policy_test.dart
new file mode 100644
index 0000000..f476d67
--- /dev/null
+++ b/tests/standalone/io/socket_network_policy_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["notallowed.domain.invalid",true,false]]
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnection() {
+  asyncExpectThrows(
+      () async => await Socket.connect("foo.notallowed.domain.invalid", 12345),
+      (e) {
+    print((e as SocketException).message);
+    return e is SocketException &&
+        e.message.startsWith(
+            "Insecure socket connections are disallowed by platform");
+  });
+}
+
+void testAllowedConnection() {
+  asyncExpectThrows(
+      () async => await Socket.connect("allowed.domain.invalid", 12345),
+      (e) =>
+          e is SocketException &&
+          !e.message.startsWith(
+              "Insecure socket connections are disallowed by platform"));
+}
+
+void main() {
+  testDisallowedConnection();
+  testAllowedConnection();
+}
diff --git a/tests/standalone/standalone_kernel.status b/tests/standalone/standalone_kernel.status
index 01f6276..5eca181 100644
--- a/tests/standalone/standalone_kernel.status
+++ b/tests/standalone/standalone_kernel.status
@@ -13,8 +13,10 @@
 
 [ $system == android ]
 entrypoints_verification_test: Skip # Requires shared objects which the test script doesn't "adb push".
-io/http_ban_http_embedder_test: Skip # Requires http server bound to non-loopback; not provided by system.
-io/http_ban_http_normal_test: Skip # Requires http server bound to non-loopback; not provided by system.
+io/network_policy_configuration_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_invalid_domain_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_tie_breaker_test: Skip # Can't pass -D params containing quotes to adb.
+io/socket_network_policy_test: Skip # Can't pass -D params containing quotes to adb.
 
 [ $arch == ia32 && $builder_tag == optimization_counter_threshold ]
 io/file_lock_test: SkipSlow # Timeout
diff --git a/tests/standalone/standalone_precompiled.status b/tests/standalone/standalone_precompiled.status
index 672a30e..6953302 100644
--- a/tests/standalone/standalone_precompiled.status
+++ b/tests/standalone/standalone_precompiled.status
@@ -6,6 +6,7 @@
 dwarf_stack_trace_test: Pass, RuntimeError # Issue 35563
 
 [ $runtime == dart_precompiled ]
+check_for_aot_snapshot_jit_test: SkipByDesign
 http_launch_test: Skip
 io/addlatexhash_test: Skip
 io/dart_std_io_pipe_test: Skip
diff --git a/tests/standalone_2/check_for_aot_snapshot_jit_test.dart b/tests/standalone_2/check_for_aot_snapshot_jit_test.dart
new file mode 100644
index 0000000..851dc0c5
--- /dev/null
+++ b/tests/standalone_2/check_for_aot_snapshot_jit_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+  final buildDir = path.dirname(Platform.executable);
+  final sdkDir = path.dirname(path.dirname(buildDir));
+  final platformDill = path.join(buildDir, 'vm_platform_strong.dill');
+  final genSnapshot = path.join(buildDir, 'gen_snapshot');
+
+  final exePath = Platform.resolvedExecutable;
+  final genSnapshotPath =
+      Uri.parse(Platform.executable).resolve('gen_snapshot').path;
+  final powTest = Platform.script.resolve('pow_test.dart').path;
+  final d = Directory.systemTemp.createTempSync('aot_tmp');
+  final kernelOutput = d.uri.resolve('pow_test.dill').path;
+  final aotOutput = d.uri.resolve('pow_test.aot').path;
+
+  final genKernelResult = Process.runSync(
+    'pkg/vm/tool/gen_kernel',
+    [
+      '--aot',
+      '--platform=$platformDill',
+      '-o',
+      kernelOutput,
+      powTest,
+    ],
+  );
+  Expect.equals(genKernelResult.exitCode, 0);
+
+  final genAotResult = Process.runSync(
+    genSnapshot,
+    [
+      '--snapshot_kind=app-aot-elf',
+      '--elf=$aotOutput',
+      kernelOutput,
+    ],
+  );
+  Expect.equals(genAotResult.exitCode, 0);
+
+  final runAotResult = Process.runSync(
+    exePath,
+    [
+      'run',
+      aotOutput,
+    ],
+  );
+  Expect.equals(runAotResult.exitCode, 255);
+  Expect.stringContainsInOrder(
+    runAotResult.stderr,
+    [
+      "pow_test.aot is an AOT snapshot and should be run with 'dartaotruntime'",
+    ],
+  );
+}
diff --git a/tests/standalone_2/io/http_ban_http_embedder_test.dart b/tests/standalone_2/io/http_ban_http_embedder_test.dart
deleted file mode 100644
index 7fd3cb3..0000000
--- a/tests/standalone_2/io/http_ban_http_embedder_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// 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.
-
-// SharedOptions=-Ddart.library.io.allow_http=false
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-import 'http_ban_http_normal_test.dart';
-import 'http_bind_test.dart';
-
-Future<void> testWithHostname() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, httpUri) async {
-    asyncExpectThrows(
-        () async => await httpClient.getUrl(httpUri), (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: 'foo'}),
-        (e) => e is StateError);
-    asyncExpectThrows(
-        () async => await runZoned(() => httpClient.getUrl(httpUri),
-            zoneValues: {#dart.library.io.allow_http: false}),
-        (e) => e is StateError);
-    await asyncTest(() => runZoned(() => httpClient.getUrl(httpUri),
-        zoneValues: {#dart.library.io.allow_http: true}));
-  });
-}
-
-Future<void> testWithLoopback() async {
-  await testBanHttp("127.0.0.1", (httpClient, uri) async {
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://localhost:${uri.port}')));
-    await asyncTest(
-        () => httpClient.getUrl(Uri.parse('http://127.0.0.1:${uri.port}')));
-  });
-}
-
-Future<void> testWithIPv6() async {
-  if (await supportsIPV6()) {
-    await testBanHttp("::1", (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-  }
-}
-
-Future<void> testWithHTTPS() async {
-  await testBanHttp(await getLocalHostIP(), (httpClient, uri) async {
-    asyncExpectThrows(
-        () => httpClient.getUrl(Uri(
-              scheme: 'https',
-              host: uri.host,
-              port: uri.port,
-            )),
-        (e) => e is SocketException || e is HandshakeException);
-  });
-}
-
-main() {
-  asyncStart();
-  Future.wait(<Future>[
-    testWithHostname(),
-    testWithLoopback(),
-    testWithIPv6(),
-    testWithHTTPS(),
-  ]).then((_) => asyncEnd());
-}
diff --git a/tests/standalone_2/io/http_ban_http_normal_test.dart b/tests/standalone_2/io/http_ban_http_normal_test.dart
deleted file mode 100644
index 118dd4c..0000000
--- a/tests/standalone_2/io/http_ban_http_normal_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-Future<String> getLocalHostIP() async {
-  final interfaces = await NetworkInterface.list(
-      includeLoopback: false, type: InternetAddressType.IPv4);
-  return interfaces.first.addresses.first.address;
-}
-
-Future<void> testBanHttp(String serverHost,
-    Future<void> testCode(HttpClient client, Uri uri)) async {
-  final httpClient = new HttpClient();
-  final server = await HttpServer.bind(serverHost, 0);
-  final uri = Uri(scheme: 'http', host: serverHost, port: server.port);
-  try {
-    await testCode(httpClient, uri);
-  } finally {
-    httpClient.close(force: true);
-    await server.close();
-  }
-}
-
-main() async {
-  await asyncTest(() async {
-    final host = await getLocalHostIP();
-    // Normal HTTP request succeeds.
-    await testBanHttp(host, (httpClient, uri) async {
-      await asyncTest(() => httpClient.getUrl(uri));
-    });
-    // We can ban HTTP explicitly.
-    await testBanHttp(host, (httpClient, uri) async {
-      asyncExpectThrows(
-          () async => await runZoned(() => httpClient.getUrl(uri),
-              zoneValues: {#dart.library.io.allow_http: false}),
-          (e) => e is StateError);
-    });
-  });
-}
diff --git a/tests/standalone_2/io/network_policy_configuration_test.dart b/tests/standalone_2/io/network_policy_configuration_test.dart
new file mode 100644
index 0000000..6ee1bf0
--- /dev/null
+++ b/tests/standalone_2/io/network_policy_configuration_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["foobar.com",true,true],["foobar.com",true,true],["baz.foobar.com",true,true],["baz.foobar.com",false,false]] -Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void _checkAllows(List<String> domains) {
+  for (final domain in domains) {
+    Expect.isTrue(
+        isInsecureConnectionAllowed(domain), "$domain should be allowed.");
+  }
+}
+
+void _checkDenies(List<String> domains) {
+  for (final domain in domains) {
+    Expect.isFalse(
+        isInsecureConnectionAllowed(domain), "$domain should not be allowed.");
+  }
+}
+
+void main() {
+  // These have no policy but the default is false.
+  _checkDenies(["mailfoobar.com", "abc.com", "oobar.com", "foobar.co"]);
+  // These are explicitly denied.
+  _checkDenies(["baz.foobar.com"]);
+  _checkAllows(
+      ["foobar.com", "test.baz.foobar.com", "test2.test.baz.foobar.com"]);
+}
diff --git a/tests/standalone_2/io/network_policy_invalid_domain_test.dart b/tests/standalone_2/io/network_policy_invalid_domain_test.dart
new file mode 100644
index 0000000..971996c
--- /dev/null
+++ b/tests/standalone_2/io/network_policy_invalid_domain_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["com",true,true]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+// This test passes in an invalid domain as a network policy and checks that
+// loading the policies throws.
+void main() {
+  Expect.throwsArgumentError(() => isInsecureConnectionAllowed("test.com"));
+}
diff --git a/tests/standalone_2/io/network_policy_tie_breaker_test.dart b/tests/standalone_2/io/network_policy_tie_breaker_test.dart
new file mode 100644
index 0000000..c25d3ac
--- /dev/null
+++ b/tests/standalone_2/io/network_policy_tie_breaker_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["baz.foobar.com",true,true],["baz.foobar.com",false,false]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void main() {
+  Expect.isFalse(isInsecureConnectionAllowed("baz.foobar.com"));
+  Expect.isTrue(isInsecureConnectionAllowed("test.baz.foobar.com"));
+}
diff --git a/tests/standalone_2/io/socket_network_policy_localhost_test.dart b/tests/standalone_2/io/socket_network_policy_localhost_test.dart
new file mode 100644
index 0000000..e531815
--- /dev/null
+++ b/tests/standalone_2/io/socket_network_policy_localhost_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test whether localhost connection succeeds even when insecure connections
+// are banned by default.
+// SharedOptions=-Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnectionByDefault() {
+  asyncExpectThrows(
+      () async => await Socket.connect("domain.invalid", 80),
+      (e) =>
+          e is SocketException &&
+          e.message.contains(
+              "Insecure socket connections are disallowed by platform"));
+}
+
+Future<void> testLocalhostConnection() async {
+  ServerSocket server =
+      await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
+  Socket socket;
+  try {
+    server.listen((_) {});
+    socket = await Socket.connect(InternetAddress.loopbackIPv4, server.port);
+  } finally {
+    server.close();
+    if (socket != null) {
+      socket.close();
+      await socket.done;
+      socket.destroy();
+    }
+  }
+}
+
+Future<void> test() async {
+  testDisallowedConnectionByDefault();
+  await testLocalhostConnection();
+}
+
+void main() {
+  asyncStart();
+  test().whenComplete(() => asyncEnd());
+}
diff --git a/tests/standalone_2/io/socket_network_policy_test.dart b/tests/standalone_2/io/socket_network_policy_test.dart
new file mode 100644
index 0000000..f476d67
--- /dev/null
+++ b/tests/standalone_2/io/socket_network_policy_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["notallowed.domain.invalid",true,false]]
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnection() {
+  asyncExpectThrows(
+      () async => await Socket.connect("foo.notallowed.domain.invalid", 12345),
+      (e) {
+    print((e as SocketException).message);
+    return e is SocketException &&
+        e.message.startsWith(
+            "Insecure socket connections are disallowed by platform");
+  });
+}
+
+void testAllowedConnection() {
+  asyncExpectThrows(
+      () async => await Socket.connect("allowed.domain.invalid", 12345),
+      (e) =>
+          e is SocketException &&
+          !e.message.startsWith(
+              "Insecure socket connections are disallowed by platform"));
+}
+
+void main() {
+  testDisallowedConnection();
+  testAllowedConnection();
+}
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 01f6276..5eca181 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -13,8 +13,10 @@
 
 [ $system == android ]
 entrypoints_verification_test: Skip # Requires shared objects which the test script doesn't "adb push".
-io/http_ban_http_embedder_test: Skip # Requires http server bound to non-loopback; not provided by system.
-io/http_ban_http_normal_test: Skip # Requires http server bound to non-loopback; not provided by system.
+io/network_policy_configuration_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_invalid_domain_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_tie_breaker_test: Skip # Can't pass -D params containing quotes to adb.
+io/socket_network_policy_test: Skip # Can't pass -D params containing quotes to adb.
 
 [ $arch == ia32 && $builder_tag == optimization_counter_threshold ]
 io/file_lock_test: SkipSlow # Timeout
diff --git a/tests/standalone_2/standalone_2_precompiled.status b/tests/standalone_2/standalone_2_precompiled.status
index 417ed1d..829aafc 100644
--- a/tests/standalone_2/standalone_2_precompiled.status
+++ b/tests/standalone_2/standalone_2_precompiled.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $runtime == dart_precompiled ]
+check_for_aot_snapshot_jit_test: SkipByDesign
 http_launch_test: Skip
 io/addlatexhash_test: Skip
 io/dart_std_io_pipe_test: Skip
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
index 286b4b7..2a622d1 100644
--- a/tools/FAKE_COMMITS
+++ b/tools/FAKE_COMMITS
@@ -25,6 +25,7 @@
 Force build after DEPS format revert
 Force build while trybots are broken, to check builders for brokenness.
 Force build to test recipe changes
+Force build to test recipe changes
 
 Analyzer branch commits:
 Force build on new analyzer-branch linux build with new workflow
diff --git a/tools/VERSION b/tools/VERSION
index 0944177..d0b396f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 1
+PRERELEASE 2
 PRERELEASE_PATCH 0
 ABI_VERSION 39
 OLDEST_SUPPORTED_ABI_VERSION 39
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 5cc65e9..1e84bd0 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -392,16 +392,16 @@
       }
     },
     "unittest-weak-asserts-no-sdk-(linux|mac|win)": {
-       "options": {
-         "compiler": "dartk",
-         "enable-asserts": true,
-         "mode": "release",
-         "runtime": "vm",
-         "timeout": 240,
-         "enable-experiment": [
-           "non-nullable"
-         ]
-       }
+      "options": {
+        "compiler": "dartk",
+        "enable-asserts": true,
+        "mode": "release",
+        "runtime": "vm",
+        "timeout": 240,
+        "enable-experiment": [
+          "non-nullable"
+        ]
+      }
     },
     "analyzer-unittest-asserts-(debug|product|release)-(linux|mac|win)": {
       "options": {
@@ -707,32 +707,32 @@
         "builder-tag": "canary"
       }
     },
-    "dartkp-weak-asserts-(linux|mac)-(debug|product|release)-x64": {
+    "dartkp-weak-asserts-(linux|mac)-(debug|product|release)-(simarm64|x64)": {
       "options": {
         "enable-experiment": [
           "non-nullable"
         ],
-	"gen-kernel-options": [
+        "gen-kernel-options": [
           "--no-sound-null-safety"
         ],
         "enable-asserts": true,
-	"vm-options": [
+        "vm-options": [
           "--no-sound-null-safety"
         ],
         "builder-tag": "vm_nnbd"
       }
     },
-    "dartkp-weak-asserts-win-(debug|product|release)-x64": {
+    "dartkp-weak-asserts-win-(debug|product|release)-(simarm64|x64)": {
       "options": {
         "enable-experiment": [
           "non-nullable"
         ],
-	"gen-kernel-options": [
+        "gen-kernel-options": [
           "--no-sound-null-safety"
         ],
         "enable-asserts": true,
         "use-elf": true,
-	"vm-options": [
+        "vm-options": [
           "--no-sound-null-safety"
         ],
         "builder-tag": "vm_nnbd"
@@ -744,7 +744,7 @@
           "non-nullable"
         ],
         "enable-asserts": true,
-	"vm-options": [
+        "vm-options": [
           "--no-sound-null-safety"
         ],
         "builder-tag": "vm_nnbd"
@@ -761,7 +761,7 @@
         "builder-tag": "vm_nnbd"
       }
     },
-    "dartkp-strong-(linux|mac)-(debug|product|release)-x64": {
+    "dartkp-strong-(linux|mac)-(debug|product|release)-(simarm64|x64)": {
       "options": {
         "enable-experiment": [
           "non-nullable"
@@ -775,7 +775,7 @@
         "builder-tag": "vm_nnbd"
       }
     },
-    "dartkp-strong-win-(debug|product|release)-x64": {
+    "dartkp-strong-win-(debug|product|release)-(simarm64|x64)": {
       "options": {
         "use-elf": true,
         "enable-experiment": [
@@ -913,9 +913,6 @@
         ]
       }
     },
-    "dartkb-abi-linux-release-x64": {
-      "__comment__": "This configuration is only used for a custom test runner. If it conflicts with a new configuration you are adding, you can make this configuration more specific by adding options."
-    },
     "dartdevk-checked-(linux|mac|win)-(debug|product|release)-(chrome|firefox)": {
       "options": {
         "checked": true,
@@ -1295,6 +1292,7 @@
     },
     {
       "builders": [
+        "vm-kernel-precomp-nnbd-linux-release-simarm64",
         "vm-kernel-precomp-nnbd-linux-release-x64"
       ],
       "meta": {
@@ -1316,7 +1314,7 @@
             "co19"
           ],
           "fileset": "vm-kernel",
-          "shards": 2
+          "shards": 3
         },
         {
           "name": "co19 nnbd tests in strong mode",
@@ -1325,7 +1323,7 @@
             "co19"
           ],
           "fileset": "vm-kernel",
-          "shards": 2
+          "shards": 3
         },
         {
           "name": "vm nnbd tests in weak mode with asserts",
@@ -1351,7 +1349,9 @@
             "lib",
             "standalone/io",
             "vm"
-          ]
+          ],
+          "fileset": "vm-kernel",
+          "shards": 3
         }
       ]
     },
@@ -3443,30 +3443,6 @@
     },
     {
       "builders": [
-        "vm-dartkb-linux-release-x64-abi"
-      ],
-      "meta": {
-        "description": "This configuration runs tests for each supported ABI version."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": [
-            "--bytecode",
-            "create_sdk_with_abi_versions"
-          ]
-        },
-        {
-          "name": "run tests",
-          "script": "tools/run_abi_tests.py",
-          "testRunner": true,
-          "arguments": ["-ndartkb-abi-linux-release-x64"]
-        }
-      ]
-    },
-    {
-      "builders": [
         "vm-kernel-precomp-linux-debug-simarm_x64",
         "vm-kernel-precomp-linux-release-simarm_x64"
       ],
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 7a9a03f..e9b21ba 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -104,6 +104,8 @@
     help: "Alternative invalidation strategy for incremental compilation"
     category: "CFE"
 
+  value-class:
+    help: "Value class"
 #
 # Flags below this line are shipped, retired, or rejected, cannot be specified
 # on the command line, and will eventually be removed.
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 8c5406f..254af29 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -99,39 +99,6 @@
   out = "$root_out_dir/dev_compiler/build/web/dart_stack_trace_mapper.js"
 }
 
-# Apply dev_compiler's patch files to create the Dart version of the dartdevc
-# SDK.
-prebuilt_dart_action("dartdevc_patch_sdk") {
-  deps = [
-    ":dartdevc_files_stamp",
-    ":dartdevc_sdk_patch_stamp",
-
-    # The patch script uses several packages, including analyzer, so consider
-    # it dirty if any of those change.
-    "../../pkg:pkg_files_stamp",
-  ]
-
-  script = "../../pkg/dev_compiler/tool/patch_sdk.dart"
-
-  inputs = sdk_lib_files
-
-  # Arbitrarily use the version file as a token file to check against to see if
-  # the sources have changed.
-  # TODO(rnystrom): List the outputs more precisely?
-  outputs = [ "$patched_sdk_dir/version" ]
-
-  vm_args = [ "-Dsdk_hash=$sdk_hash" ]
-
-  args = [
-    "--libraries",
-    rebase_path("$sdk_root/lib/libraries.json"),
-    "--target",
-    "dartdevc",
-    "--out",
-    rebase_path("$patched_sdk_dir/"),
-  ]
-}
-
 # Builds everything needed to run dartdevc tests using test.dart.
 group("dartdevc_test") {
   deps = [